'\*' 和 '&' 是什么意思?

新手上路,请多包涵

我正在做 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++ 中拥有的指针一样。但我无法将这些概念与我们这里的内容联系起来。换句话说,当我在 Go 的函数声明中使用它们时,’*’ 和 ‘&’ 做了什么。

我知道引用和取消引用是什么意思。我不明白我们如何在 Go 中使用指向函数的指针?例如第 1 行和第 7 行,这两行是做什么的?声明名为 intial1 的函数返回一个指针?在第 7 行,我们使用 return 函数用参数调用它。

原文由 David 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 901
2 个回答

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

& 运营商

& 当你想获取变量的 内存地址 时,在变量前面。

* 运算符

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

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

或者更有用的是,像

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

* 在Type前面

* 放在 类型 前面时,例如 *string ,它成为类型声明的一部分,所以你可以说“这个变量持有一个指向字符串的指针”。例如:

 var str_pointer *string

所以令人困惑的是 * 真的被用于 2 个独立的(尽管相关的)事物。星号可以是运算符 类型的一部分。

原文由 Everett 发布,翻译遵循 CC BY-SA 4.0 许可协议

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

假设我们有一个名为 a 的变量,它保存整数 5,另一个名为 p 的变量将是一个指针。这就是 *& 进入游戏的地方。

用它们打印变量可以产生不同的输出,所以这完全取决于情况和你的使用情况。使用 *& 可以节省你的代码行( 这在小项目中并不重要)并使你的代码更美观/可读。

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

* 返回以下变量的 (它 应该 保存变量的内存地址,除非你想得到奇怪的输出和可能的问题,因为你正在访问你的计算机的内存)

 var a = 5
var p = &a // p holds variable a's memory address
fmt.Printf("Address of var a: %p\n", p)
fmt.Printf("Value of var a: %v\n", *p)

// Let's change a value (using the initial variable or the pointer)
*p = 3 // using pointer
a = 3 // using initial var

fmt.Printf("Address of var a: %p\n", p)
fmt.Printf("Value of var a: %v\n", *p)

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

希望这个答案有所帮助。

原文由 fabiofcferreira 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题