我是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函数调用它。
答案 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```