2014-10-18 103 views
1

我是一位正在學習Go的JavaScript編碼人員。我下面這個教程:http://tour.golang.org/#52任何人都可以用JavaScript語言向我解釋什麼是「指針」?

package main 

import (
    "fmt" 
    "math" 
) 

type Vertex struct { 
    X, Y float64 
} 

func (v *Vertex) Abs() float64 { 
    return math.Sqrt(v.X*v.X + v.Y*v.Y) 
} 

func main() { 
    v := &Vertex{3, 4} 
    fmt.Println(v.Abs()) 
} 

我在維基百科上,並在圍棋文檔什麼的指針是閱讀,但我還是能理解他們。任何人都可以用JavaScript語言向我解釋它們嗎?

+1

這將是相當困難的,因爲JavaScript沒有真正像指針一樣。 – 2014-10-18 06:55:05

+0

可能的重複[在javascript中是否有指針?](http://stackoverflow.com/questions/17382427/are-there-pointers-in-javascript) – dizel3d 2014-10-18 07:04:18

回答

6

它們有點類似於JS和其他語言中的對象引用,但並不完全。指針比引用更強大(因此更危險)。考慮下面的JS代碼。

var a = {foo: true}; 
var b = a; 
a.foo = false; 
console.log(b); // Output: "Object { foo: false }" 

這兩個ab這裏就像指針。當你做b = a你不克隆一個對象,你可以參考b(或,如果你願意)與a相同的對象。在去你能做到既:

type T struct { Foo bool } 

a := T{Foo: true} 
b := a 
a.Foo = false 
fmt.Println(b) // b is a copy, so it didn't change. Prints "{true}". 

pa := &T{Foo: true} 
pb := pa 
pa.Foo = false 
fmt.Println(pb) // pb points to the same struct as pa, so it prints "&{false}" 

Playground

最重要的區別是,在JS你不能真正替代函數內部的對象。

var a = {foo: true}; 
(function(x) { x = {foo: false} })(a); 
console.log(a); // Output: "Object { foo: true }" 

在去你能做到這一點就好了:

pa := &T{Foo: true} 
func(p *T) { *p = T{Foo: false} }(pa) 
fmt.Println(pa) // Output: &{false} 

Playground

另一個區別是,你可以讓指針不只是結構,但任何類型的,包括指針。

+0

感謝這對我來說很清楚。只有一件事,在第一個Go例子中,我仍然在'true false'錯過了'''你可能會在某處找到'*'?我在教程中看到了這一點。 – alexchenco 2014-10-18 08:47:49

+0

@alexchenco我不太明白你的意思。在我提供的第一個Go示例中,第一個'Println'應該打印「{true}」,第二個「&{false}」(「&」表示這是一個結構的地址,一個指針,而不是結構本身)。它演示了值和指針之間的區別。 – 2014-10-18 09:14:16

+0

對不起,我想我讓我誤會了某個地方。你的代碼是好的。哎呀,我不知道爲什麼我覺得Go很困難。也許是因爲我從來沒有用C編程過。 – alexchenco 2014-10-18 11:25:51

0

一個老問題,但一個明顯的說法是,指針實際上是內存中變量的地址。 當通過指針傳遞變量時,實際傳遞的是該變量所在的內存地址。

相關問題