为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
翻过高山走不出你 2021-07-28 20:38:13
我是 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)}
查看完整描述

2 回答

?
智慧大石

TA贡献1946条经验 获得超3个赞

请参阅规范中的选择器部分

选择器会自动取消引用指向结构的指针。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


查看完整回答
反对 回复 2021-08-02
?
慕勒3428872

TA贡献1848条经验 获得超6个赞

new创建一个指针。如果你想给指针指向的东西赋值,你需要取消引用它。如果您没有使用 new 创建值,则不需要取消引用任何指针:


//without magic := so you actually see the types of things

  package main

import "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一样。


查看完整回答
反对 回复 2021-08-02
  • 2 回答
  • 0 关注
  • 218 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信