我在学习Golang,当我浏览描述 struct 的章节时,我遇到了不同的初始化 struct 的方法.

p1 := passport{}
var p2 passport
p3 := passport{
    Photo: make([]byte, 0, 0),
    Name: "Scott",
    Surname: "Adam",
    DateOfBirth: "Some time",
}

fmt.Printf("%s\n%s\n%s\n", p1, p2, p3)

而它们将 struct 的值打印为

{ } { } { Scott Adam Some time}个 ,下面的代码使用"与"号打印,因为它是一个引用.

pointerp1 := &p3
fmt.Printf("%s", pointerp1)
pointerp2 := new(passport)
pointerp2.Name = "Anotherscott"
fmt.Printf("%s", pointerp2)

&{ Scott Adam Some time}&{ Anotherscott }

请帮我排解疑惑.

  1. 在用法pointerp1 := &p3中,pointerp1是保存实际数据的p3的参考变量.同样,保存pointerp2数据的实际变量是什么?

  2. 使用这些不同类型的初始化的最佳方案是什么?

推荐答案

new为新的项或类型分配归零的存储空间,然后返回指向它的指针.我不认为这真的很重要,如果你使用newvs短变量声明:= type{},这主要是偏好

对于pointer2,当您这样做时,pointer2变量保存自己的数据

// initializing a zeroed 'passport in memory'
pointerp2 := new(passport)
// setting the field Name to whatever
pointerp2.Name = "Anotherscott"

new在内存中分配归零的存储空间并返回指向它的指针,因此简而言之,new将返回指向您正在进行的任何操作的指针,这就是pointerp2返回&{ Anotherscott }的原因

在传递需要修改的变量时,您主要希望使用指针(但如果需要从不同函数读取和写入变量,请注意使用互斥锁或通道的数据竞争)

人们通常使用的方法不是new,而是指针类型:

blah := &passport{}

blah现在是指向Passport类型的指针

你可以在这个操场上看到:

http://play.golang.org/p/9OuM2Kqncq

传递指针时,可以修改原始值.传递非指针时,不能修改它.这是因为in-go变量作为副本传递.因此,在iDontTakeAPointer函数中,它接收tester struct的一个副本,然后修改name字段,然后返回,这对我们没有任何帮助,因为它修改的是副本,而不是原件.

Go相关问答推荐

如何禁用Go SRC包中的VSCode警告?

Golang ==错误:OCI运行时创建失败:无法启动容器进程:exec:./" bin:stat./" bin:没有这样的文件或目录:未知

具有GRPC的RBAC(基于角色的访问控制)-网关生成的REST风格的API

带有一个新变量的Go冒号等于运算符

转到http服务器头内容-类型设置为多部分/表单-数据,但在客户端获取内容-类型:文本/纯文本

调用库和直接操作效率有区别吗?

杜松子wine 和中间件

如何将验证器标记添加到嵌套字段

如何在 Go 中编写示例测试?

具有嵌套重复的正则表达式

没有任务角色的 AWS CDK ECS 任务定义

如何确定作为函数参数传递的指针是否正在被修改或副本是否正在被修改?

如何使用 Go 代理状态为 OK 的预检请求?

go-echo中如何防止+转义

Golang Getrlimit 返回与 ulimit 不同的值

使用 oklog/run 来自 Go 编译器的错误(无值)用作值

vs 代码调试 go 测试不通过标志

GoLang 遍历 yaml 文件

如何在眼镜蛇(golang)中将标志作为参数传递?

如何正确判断 io.Reader 是否为零?