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

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

请举例说明,谢谢!

阅读 4.2k
2 个回答

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

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等类型,实参可能会由于函数的间接引用被修改。

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题