Golang basics struct和new()关键字

sco*_*ott 31 struct pointers go

我正在学习golang,当我阅读描述Structures的章节时,我遇到了不同的方法来初始化结构.

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)
Run Code Online (Sandbox Code Playgroud)

虽然这些打印结构的值为

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

pointerp1 := &p3
fmt.Printf("%s", pointerp1)
pointerp2 := new(passport)
pointerp2.Name = "Anotherscott"
fmt.Printf("%s", pointerp2)
Run Code Online (Sandbox Code Playgroud)

&{ Scott Adam Some time}&{ Anotherscott }

请帮助我解决疑惑.

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

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

Dat*_*sik 49

new为新项分配零存储或键入任何内容,然后返回指向它的指针.我不认为如果你使用newvs短变量声明:= type{}它真的很重要,它主要只是偏好

至于,当你这样做时pointer2,pointer2变量会保存自己的数据

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

new在内存中分配归零存储并返回指向它的指针,所以简而言之,new将返回指向你正在做的任何东西的指针,这就是为什么pointerp2返回&{ Anotherscott }

当你传递一个你需要修改的变量时,你主要想要使用指针(但要注意数据竞争使用互斥锁或通道如果你需要读取和写入来自不同函数的变量)

人们使用的常用方法new只是短指针类型:

blah := &passport{}

blah现在是指向护照的指针

你可以在这个游乐场看到:

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

传递指针时,可以修改原始值.传递非指针时,无法修改它.那是因为go变量作为副本传递.因此,在iDontTakeAPointer函数中,它接收到测试器结构的副本,然后修改名称字段然后返回,这对我们没有任何作用,因为它正在修改副本而不是原始文件.

  • 我发现 go 团队的“new”是一个完全奇怪的决定,“&”是其他语言使用的,“new”似乎是在分配内存并将项目复制到其中,这是相反的。 (6认同)

Rem*_*rio 5

new 关键字所做的基本上就是创建您想要的类型的实例。然而,它不是返回类型的简单声明,而是引用它并返回程序进程堆中该类型的实际内存地址。