2014-10-18 100 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

一个老问题,但一个明显的说法是,指针实际上是内存中变量的地址。 当通过指针传递变量时,实际传递的是该变量所在的内存地址。

相关问题