小编典典

Golang基础知识struct和new()关键字

go

我正在学习golang,在浏览介绍结构的章节时,我遇到了多种初始化结构的方法。

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)

虽然这些将结构的值打印为

{ } { } { 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 := &p3pointerp1是的引用变量p3,用于保存实际数据。同样,保存数据的实际变量是pointerp2什么?

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


阅读 367

收藏
2020-07-02

共1个答案

小编典典

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

至于pointer2pointer2变量会保存自己的数据

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

new分配内存清零存储和返回一个指向它,所以在短,新会返回一个指针,无论你正在做,这就是为什么pointerp2回报&{ Anotherscott }

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

人们使用的一种常用方法不是newdec类型的指针类型:

blah := &passport{}

等等现在是键入护照的指针

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

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

传递指针时,可以修改原始值。传递非指针时,您将无法对其进行修改。这是因为in
go变量是作为副本传递的。因此,在该iDontTakeAPointer函数中,它正在接收测试程序结构的副本,然后修改名称字段,然后返回,这对我们没有任何帮助,因为它正在修改副本而不是原始副本。

2020-07-02