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

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

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

Go
鸿蒙传说 2021-12-06 15:02:33
我正在学习 golang,在阅读描述结构的章节时,我遇到了初始化结构的不同方法。p1 := passport{}var p2 passportp3 := 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 := &p3fmt.Printf("%s", pointerp1)pointerp2 := new(passport)pointerp2.Name = "Anotherscott"fmt.Printf("%s", pointerp2)&{ Scott Adam Some time}&{ Anotherscott  }请帮助我解决我的疑问。在用法中pointerp1 := &p3,pointerp1是指向 的引用变量p3,它保存实际数据。同样,保存 数据的实际变量是pointerp2什么?使用这些不同类型的初始化的最佳场景是什么?
查看完整描述

3 回答

?
慕姐4208626

TA贡献1852条经验 获得超7个赞

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是 short dec 一个指针类型:


blah := &passport{}


blah 现在是指向类型护照的指针


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


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


传递指针时,可以修改原始值。传递非指针时,您无法修改它。那是因为在 go 中变量是作为副本传递的。因此,在iDontTakeAPointer函数中,它接收 tester 结构的副本,然后修改 name 字段,然后返回,这对我们没有任何作用,因为它正在修改副本而不是原始内容。


查看完整回答
反对 回复 2021-12-06
?
POPMUISE

TA贡献1765条经验 获得超5个赞

  1. 还存在保存数据的变量。您可以使用 取消引用指针*pointerp2,甚至将其分配给变量 ( p2 := pointerp2),但该变量将是数据的副本。也就是说,修改一个不再影响另一个(http://play.golang.org/p/9yRYbyvG8q)。

  2. new往往不太受欢迎,尤其是在结构方面。可以在https://softwareengineering.stackexchange.com/a/216582上找到有关其目的(提示:首先出现)和用例的详细讨论。

编辑:此外,p1并不是真正不同类型的初始化p3,而是将值初始化为它们的零值(""for stringnilfor []byte),而不是将值分配给任何类型的字段。任何省略的字段都会发生同样的情况:

p4 := passport{

    Name: "Scott",

    Surname: "Adam",

}

在这种情况下,p4.Photo和p4.DateOfBirth仍然是零值(nil和"")。这种passport{}情况只是所有字段都被省略的情况。


查看完整回答
反对 回复 2021-12-06
?
慕斯709654

TA贡献1840条经验 获得超5个赞

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


查看完整回答
反对 回复 2021-12-06
  • 3 回答
  • 0 关注
  • 226 浏览
慕课专栏
更多

添加回答

举报

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