H5W3
当前位置:H5W3 > go > 正文

【go】如何理解“在函数之间传递变量时,总是以值的方式传递的”这句话?

在 Golang 中,如何理解“在函数之间传递变量时,总是以值的方式传递的”这句话?

请举例说明,谢谢!

其含义就是函数体内使用的形参全部都是实参的拷贝,改变形参不会影响到实参,题主要举例,我就举个例好了:

func test1(a int) {
a = 10
}
func test2 (b []int){
b = []int{100,200}
}
func test3 (c *string){
str := "hello"
c = &str
}
func main() {
a := 1
test1(a)
fmt.Println(a) // 1
b := []int{1,2}
test2(b)
fmt.Println(b) // [1 2]
str := "hi"
c := &str
test3(c)
fmt.Println(*c,c) // hi
}

可以看到不管是简单类型int,还是引用类型[]int,或者是指针*string,把变量传入到函数内修改,并不会影响到本身,本身的值是不会改变的,也也就是所谓的“在函数之间传递变量时,总是以值的方式传递”的意思。

对于简单类型int,传递变量也就是传递一个相同值的int。

对于引用类型[]int,传递变量也是引用的拷贝,它和原本的slice指向同一块内存区域,但是当你使用b = []int{100,200}改变它的指向后,不会影响到原本的变量。

对于指针*string也是同理,传递变量也是指针的拷贝,它和原来的指针是指向同一块内存区域,你可以更改它的指向,不会影响到原本的变量。

http://books.studygolang.com/…,go程序设计语言 函数声明提到:
在函数体中,函数的形参作为局部变量,被初始化为调用者提供的值。函数的形参和有名返回值作为函数最外层的局部变量,被存储在相同的词法块中。

实参通过值的方式传递,因此函数的形参是实参的拷贝。对形参进行修改不会影响实参。但是,如果实参包括引用类型,如指针,slice(切片)、map、function、channel等类型,实参可能会由于函数的间接引用被修改。

这个是语言层面的设计了。

回答

本文地址:H5W3 » 【go】如何理解“在函数之间传递变量时,总是以值的方式传递的”这句话?

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址