Home >Backend Development >Golang >Is there passing by reference in go language?

Is there passing by reference in go language?

青灯夜游
青灯夜游Original
2022-12-20 12:09:355494browse

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.

Is there passing by reference in go language?

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.

What is a reference variable?

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.

The Go language has no reference variables

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.

Maps and Channels should be reference variables, right?

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.

Summary

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!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn