猿问

Golang 基础结构和 new() 关键字

我正在学习 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. 使用这些不同类型的初始化的最佳场景是什么?


鸿蒙传说
浏览 227回答 3
3回答

慕姐4208626

new为新项目或类型分配零存储,然后返回指向它的指针。我认为是否使用newvs 短变量声明并不重要,:= type{}这主要是偏好至于pointer2,pointer2变量保存自己的数据,当你这样做// initializing a zeroed 'passport in memory'pointerp2 := new(passport)// setting the field Name to whateverpointerp2.Name = "Anotherscott"new在内存中分配归零存储并返回一个指向它的指针,所以简而言之, new 将返回一个指向您正在制作的任何内容的指针,这就是为什么pointerp2返回&{ Anotherscott }当您传递需要修改的变量时,您主要想使用指针(但请注意数据竞争,如果您需要从不同的函数读取和写入变量,请使用互斥锁或通道)人们使用的一种常用方法new是 short dec 一个指针类型:blah := &passport{}blah 现在是指向类型护照的指针你可以在这个游乐场看到:http://play.golang.org/p/9OuM2Kqncq传递指针时,可以修改原始值。传递非指针时,您无法修改它。那是因为在 go 中变量是作为副本传递的。因此,在iDontTakeAPointer函数中,它接收 tester 结构的副本,然后修改 name 字段,然后返回,这对我们没有任何作用,因为它正在修改副本而不是原始内容。

POPMUISE

还存在保存数据的变量。您可以使用 取消引用指针*pointerp2,甚至将其分配给变量 ( p2 := pointerp2),但该变量将是数据的副本。也就是说,修改一个不再影响另一个(http://play.golang.org/p/9yRYbyvG8q)。new往往不太受欢迎,尤其是在结构方面。可以在https://softwareengineering.stackexchange.com/a/216582上找到有关其目的(提示:首先出现)和用例的详细讨论。编辑:此外,p1并不是真正不同类型的初始化p3,而是将值初始化为它们的零值(""for string,nilfor []byte),而不是将值分配给任何类型的字段。任何省略的字段都会发生同样的情况:p4 := passport{    Name: "Scott",    Surname: "Adam",}在这种情况下,p4.Photo和p4.DateOfBirth仍然是零值(nil和"")。这种passport{}情况只是所有字段都被省略的情况。

慕斯709654

new 关键字所做的基本上就是创建您想要的类型的实例。然而,它不是返回类型的普通声明,而是引用它并返回程序进程堆中该类型的实际内存地址。
随时随地看视频慕课网APP

相关分类

Go
我要回答