为什么我们需要使用 * 来修改基本数据类型的值而不是用户定义结构的值?

我是 Go 新手,对 C 有一些经验。现在最让我困惑的是为什么,在下面的代码中,我们需要取消引用str来修改 value 而不是chk.j.


在结构的情况下,这里发生了什么额外的事情?


type test struct {

    i int

    j string

}


func main() {

    str := new(string)

    *str = "Need Astrik"

    chk := new(test)

    chk.i = 5

    chk.j = "Confused"

    fmt.Println("printing", chk.i, chk.j, *str)

}


翻过高山走不出你
浏览 219回答 2
2回答

智慧大石

请参阅规范中的选择器部分:选择器会自动取消引用指向结构的指针。Ifx是指向结构的指针,x.y是(*x).y; 的简写。如果该字段y也是指向结构的指针,x.y.z则是 的简写(*(*x).y).z,依此类推。Ifx包含类型为 的匿名字段*A, whereA也是结构类型,x.f是 的简写(*x.A).f。总之:结构的指针成员会自动取消引用。对于赋值没有这样的快捷方式,所以赋值指针与在 C 中相同:*p = value对于 structx的成员y是指针的情况,您希望为其目标分配一个值:*x.y = value如果x是指向结构的指针,则上面的表达式转换为*((*x).y) = value

慕勒3428872

new创建一个指针。如果你想给指针指向的东西赋值,你需要取消引用它。如果您没有使用 new 创建值,则不需要取消引用任何指针://without magic := so you actually see the types of things  package mainimport "fmt"func main(){    var s string = "Hello World"    s = "hello"    var sp (*string) = &s    fmt.Println(s) //hello    fmt.Println(*sp) //hello    *sp = "world"    fmt.Println(s) //world    fmt.Println(*sp) //world}您不需要取消对您的测试 chk 的引用,因为根据您是在结构上使用它还是在指向结构的指针上使用它,它的.行为可以像C->和.C一样。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go