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

发布于 2022-09-05 00:43:14 字数 68 浏览 18 评论 0

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

请举例说明,谢谢!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

满栀 2022-09-12 00:43:14

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

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也是同理,传递变量也是指针的拷贝,它和原来的指针是指向同一块内存区域,你可以更改它的指向,不会影响到原本的变量。

空心空情空意 2022-09-12 00:43:14

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

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

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文