' *'是什么意思?和'&'在Golang?

时间:2016-07-03 17:42:43

标签: go

我是Golang的新手,我正在做http://tour.golang.org/。任何人都可以解释我第1,3,5和7行这个函数特别是' *'和'&'做?我的意思是在函数声明中提到它们,它们应该/预期会做什么?玩具示例:

1: func intial1(var1 int, var2 int, func1.newfunc[]) *callproperfunction {
2:
3: addition:= make ([] add1, var1)
4: for i:=1;i<var2;i++ {
5:   var2 [i] = *addtother (randomstring(lengthofcurrent))
6:   }
7: return &callproperfunction {var1 int, var2 int, func1.newfunc[], jackpot}
8: }

似乎它们就像我们在C ++中的指针一样。但是我无法将这些概念与我们在这里的内容联系起来。换句话说,&#39; *&#39;一个&#39;&amp;&#39;当我在Go。中的函数声明中使用它们时。

编辑:我知道什么参考和解除引用意味着什么。我无法理解的是:我们如何使用指向函数的指针是Golang。例如第1行和第7行,这两行做什么?我们声明了一个名为intial1的函数,它返回一个指针?在第7行中,我们使用return函数调用它。

6 个答案:

答案 0 :(得分:17)

你的问题与给出的例子不太匹配,但我会尽量直截了当。

假设我们有一个名为node* LL::search(int num) { node* newNode = new node; newNode = head; while (newNode->next != NULL) { if (newNode->val == num) { return newNode; } newNode = newNode->next; } return NULL; } 的变量,它包含整数5和另一个名为a的变量,它将成为一个指针。 这是p*加入游戏的地方。

使用它们打印变量可以生成不同的输出,因此一切都取决于具体情况和使用情况。 使用&*可以为您节省代码行(在小项目中无关紧要)并使您的代码更美观/可读。

&会返回以下变量的内存地址

&返回以下变量的应该保存变量的内存地址,除非您想获得奇怪的输出并可能出现问题因为你正在访问计算机的RAM)

*

总而言之,当使用*和&amp;请记住*用于设置您指向的变量的值和&amp;是您指向/想要指向的变量的地址。

希望这个答案有所帮助。

答案 1 :(得分:11)

这可能是Go中最令人困惑的事情之一。您基本上需要了解3种情况:

&运营商

当您想要获取变量的内存地址 时,

&位于变量的前面。

*运营商

*位于保存内存地址并对其进行解析的变量的前面(因此它是&运算符的对应物)。它获得并获得了指针指向的东西,例如*myString

myString := "Hi"
fmt.Println(*&myString)  // prints "Hi"

或更有用的是类似

myStructPointer = &myStruct
// ...
(*myStructPointer).someAttribute = "New Value"

*在类型前面

*放在类型前面时,例如*string,它成为类型声明的一部分,因此您可以说“此变量包含指向字符串的指针”。

因此,令人困惑的是*实际上用于2个单独的(尽管相关)的东西。星形可以是运算符类型的一部分。

答案 2 :(得分:10)

那些指针,就像我们在C ++中一样。

区别在于:

  • 而不是->在指针上调用方法,总是使用.,即pointer.method()

  • 没有悬空指针。返回指向局部变量的指针是完全有效的。 Golang将确保对象的生命周期,并在不再需要时对其进行垃圾收集。

  • 可以使用new()创建指针,也可以创建对象object{}并使用&获取地址。

  • Golang不允许指针算术(数组不会衰减到指针)和不安全的转换。将使用变量的运行时类型和panic检查所有向下转换,或者在实例类型错误时返回false作为第二个返回值,具体取决于您是否实际采用第二个返回类型。

答案 3 :(得分:5)

到目前为止,这是了解所有三种情况的最简单方法,如@Everett答案所述

func zero(x int) {
  x = 0
}
func main() {
  x := 5
  zero(x)
  fmt.Println(x) // x is still 5
}

如果需要在函数内更改变量,则将内存地址作为参数传递,并使用该内存地址的指针永久更改变量。

在示例中,请注意在int前面使用*。在这里,它只是表示作为参数传递的变量是int类型的地址。

func zero(xPtr *int) {
  *xPtr = 0
}
func main() {
  x := 5
  zero(&x)
  fmt.Println(x) // x is 0
}

答案 4 :(得分:0)

&运算符获取内存地址,其中 * Opeartor 保存特定变量的内存地址。

答案 5 :(得分:0)

简单的解释..就像,你想改变原始值

func zero(num *int){  // add * to datatype
  *num = 0 // can mutate the original number
}

i := 5
zero(&i) // passing variable with & will allows other function to mutate the current value of variable```
相关问题