我在做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行,这两行是做什么的?声明名为intial 1的函数返回指针?在第7行,我们使用return函数调用它。
6条答案
按热度按时间nhaq1z211#
这可能是Go中最令人困惑的事情之一。基本上有三种情况你需要了解:
&
运算符&
在你想要得到一个变量的 * 内存地址 * 的时候会出现在这个变量的前面。*
运算符*
位于保存内存地址的变量前面并解析它(因此它是&
运算符的对应物)。它会得到指针所指向的东西,例如。*myString
的值。字符串
或者更有用的是
型
*
在Type前面当
*
放在 type 前面时,例如*string
,它成为类型声明的一部分,所以你可以说“这个变量持有一个指向字符串的指针”。举例来说:型
因此,令人困惑的是,
*
实际上用于两个独立的(尽管相关的)东西。星星可以是运算符 * 或类型的 * 部分。ggazkfy82#
你的问题与所举的例子不太相符,但我会尽量直截了当。
假设我们有一个名为
a
的变量,它保存整数5,另一个名为p
的变量将是一个指针。这就是*
和&
进入游戏的地方。使用它们打印变量可以生成不同的输出,因此这完全取决于情况和您的使用情况。使用
*
和&
可以保存代码行(在小项目中并不重要),并使代码更美观/可读。&
返回以下变量的内存地址。*
返回以下变量的值(该值应该保存变量的内存地址,除非您想获得奇怪的输出,并且可能会因为访问计算机的RAM而出现问题)字符串
总而言之,当使用 * 和&时,请记住 * 是用于设置您所指向的变量的值,而&是您所指向/想要指向的变量的地址。
希望这个答案能有所帮助。
jrcvhitl3#
这些 * 是 * 指针,就像我们在C++中使用的一样。
不同之处在于:
.
,即pointer.method()
的值。new()
创建,也可以通过创建一个对象object{}
并用&
获取其地址来创建。panic
或false作为第二个返回值返回,具体取决于您是否实际采用了第二个返回类型。pengsaosao4#
这是迄今为止理解@埃弗雷特答案中解释的所有三种情况的最简单方法
字符串
如果你需要一个变量在一个函数中被改变,那么把内存地址作为参数传递,并使用这个内存地址的指针来永久地改变这个变量。
注意在例子中int前面使用 *。这里它只是表示作为参数传递的变量是int类型的地址。
型
gj3fmq9x5#
简单的解释。就像你想改变原始值一样
字符串
k97glaaz6#
& Operator获取内存地址,而 * Operator**保存特定变量的内存地址。