No. Go does not have reference variables, so there is no reference passing when calling functions in the Go language. Every variable defined in a Go program occupies a unique memory location. It is not possible to create two variables that share the same memory location; it is possible to create two variables that point to the same memory location, but this is not the same as two variables sharing the same memory. The location is different.
The operating environment of this tutorial: Windows 7 system, GO version 1.18, Dell G3 computer.
It should be clear that Go does not have reference variables, so there is no reference passing when calling functions in the Go language.
In some development languages (such as C), aliases can be declared for existing variables. This alias is called a reference variable.
#include <stdio.h> int main() { int a = 10; int &b = a; int &c = b; printf("%p %p %p\n", &a, &b, &c); // 0x7ffe114f0b14 0x7ffe114f0b14 0x7ffe114f0b14 return 0; }
You can see that a, b and c all point to the same memory location. Writing to a affects b and c. This is useful when you want to declare a reference variable in a different scope - i.e. when a function is called.
Unlike C, each variable defined in a Go program occupies a unique memory location.
package main import "fmt" func main() { var a, b, c int fmt.Println(&a, &b, &c) // 0x1040a124 0x1040a128 0x1040a12c }
It is not possible to create two variables that share the same memory location. It is possible to create two variables that point to the same memory location, but this is not the same as two variables sharing the same memory location.
package main import "fmt" func main() { var a int var b, c = &a, &a fmt.Println(b, c) // 0x1040a124 0x1040a124 fmt.Println(&b, &c) // 0x1040c108 0x1040c110 }
In the above code, b and c both have the same value - that is, the address of variable a, but a and c are stored in different locations in memory. Changing the contents of b will not affect c.
wrong! map and channel are not references. If they were, the following code would output false.
package main import "fmt" func fn(m map[int]int) { m = make(map[int]int) } func main() { var m map[int]int fn(m) fmt.Println(m == nil) }
If map m is a C-style reference variable, m declared in main() and m declared in fn() will share the same memory space. However, because assigning a value to m in fn() does not affect m in main(), we can see that map is not a reference variable.
Go does not pass by reference because Go does not have reference variables.
【Related recommendations: Go video tutorial, Programming teaching】
The above is the detailed content of Is there passing by reference in go language?. For more information, please follow other related articles on the PHP Chinese website!