Go语言中地址传递引出的不解问题

thao888 · 2018-04-27 10:14:00 · 3124 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2018-04-27 10:14:00 的主题,其中的信息可能已经有所发展或是发生改变。

代码如下:

type Student struct {
    Name string
}

func remove(stu *Student) {
    fmt.Println("2----", stu)
    stu = nil
    fmt.Println("3----", stu)
}

func main() {
    stu := &Student{"中国"}
    fmt.Println("1----", stu)
    remove(stu)
    fmt.Println("4----", stu)
}

执行结果:

1---- &{中国}
2---- &{中国}
3---- <nil>
4---- &{中国}

代码中传递的是地址,为什么没有改变掉stu的值,在第4步的值仍然不变


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

3124 次点击  
加入收藏 微博
11 回复  |  直到 2018-05-14 11:28:20
icexin
icexin · #1 · 7年之前

指针是对指向内容的引用,不是对指针变量的引用

AMan
AMan · #2 · 7年之前

import "fmt"

type Student struct { Name string }

func remove(stu Student) { fmt.Println("2----", stu) stu = Student{"我爱你"} fmt.Println("3----", stu) }

func main() { stu := &Student{"中国"} fmt.Println("1----", stu) remove(stu) fmt.Println("4----", stu) }

你要修改的是局部指针指向的变量的值,所以用*stu改变其值,否则stu只是改变了方法作用域内局部指针指向的变量,并没有改变外部指针指向的变量的值域

AMan
AMan · #3 · 7年之前
AManAMan #2 回复

import "fmt" type Student struct { Name string } func remove(stu *Student) { fmt.Println("2----", stu) *stu = Student{"我爱你"} fmt.Println("3----", stu) } func main() { stu := &Student{"中国"} fmt.Println("1----", stu) remove(stu) fmt.Println("4----", stu) } 你要修改的是局部指针指向的变量的值,所以用*stu改变其值,否则stu只是改变了方法作用域内局部指针指向的变量,并没有改变外部指针指向的变量的值域

第一次回复,忘了用代码块了 ·*stu = Student{"我爱你"}·

jarlyyn
jarlyyn · #4 · 7年之前

package main

import ( "fmt" )

type Student struct { Name string }

func remove(stu *Student) { fmt.Println("2----", stu) stu = nil fmt.Println("3----", stu) }

func main() { stu := &Student{"中国"} fmt.Println("1----", stu) remove(&stu) fmt.Println("4----", stu) }

jarlyyn
jarlyyn · #5 · 7年之前

package main

import ( "fmt" )

type Student struct { Name string }

func remove(stu *Student) { fmt.Println("2----", stu) stu = nil fmt.Println("3----", stu) }

func main() { stu := &Student{"中国"} fmt.Println("1----", stu) remove(&stu) fmt.Println("4----", stu) }

jarlyyn
jarlyyn · #6 · 7年之前

预览和现实不同,格式管不了了……

zion_li
zion_li · #7 · 7年之前
icexinicexin #1 回复

指针是对指向内容的引用,不是对指针变量的引用

赞一个

AceDarkkinght
AceDarkkinght · #8 · 7年之前

调用 remove 时实际上是把 stu 的指针复制了一份传入函数内部,在 remove 内部的 stu 可以理解为指向同一个块内存的不同指针,你打印一下指针的地址就知道了。

type Student struct {
    Name string
}

func remove(stu *Student) {
    fmt.Printf("%v\n", &stu)
    fmt.Println("2----", stu)
    stu = nil
    fmt.Println("3----", stu)
}

func main() {
    stu := &Student{"中国"}
    fmt.Println("1----", stu)
    fmt.Printf("%v\n", &stu)
    remove(stu)
    fmt.Println("4----", stu)
}
thao888
thao888 · #9 · 7年之前

谢谢大家耐心解答,终于理解清楚了

barryz
barryz · #10 · 7年之前

打印下地址一看便知

13728605342
13728605342 · #11 · 7年之前
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传