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

Go 中的结构初始化和方法声明

Go 中的结构初始化和方法声明

Go
www说 2021-11-01 15:10:33
我是 Go 新手,对结构很好奇。让我们定义一个结构Ttype T struct {    size int}我见过不同类型的结构初始化。有什么区别?new(T)     // 1T{size:1}  // 2&T{size:1} // 3以及两种类型的方法声明:func (r *T) area() int // 1func (r T) area() int  // 2正确的方法应该是什么?

2 回答

?
幕布斯6054654

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

下面是不同的例子:


type Animal struct {

    Legs      int

    Kingdom   string

    Carnivore bool

}

通过引用初始化


返回指向结构的指针


var tiger = &Animal{4, "mammalia", true}


fmt.Println(tiger.Kingdom) // print "mammalia"


func changeKingdom(a *Animal) {

    a.Kingdom = "alien"    // modify original struct

}


changeKingdom(tiger) 

fmt.Println(tiger.Kingdom) // print "alien"

构造函数New初始化


返回一个带有零值的指针


var xAnimal = New(Animal)


fmt.Println(xAnimal.Kingdom)   // print ""

fmt.Println(xAnimal.Legs)      // print 0

fmt.Println(xAnimal.carnivore) // print false


changeKingdom(xAnimal)

fmt.Println(xAnimal.Kingdom)   // print "alien"

按值初始化(复制)


返回原始结构的单独副本


var giraffe = Animal{4, "mammalia", false}


fmt.Println(giraffe.Kingdom) // print "mammalia"


func changeKingdom(a Animal) {

    a.Kingdom = "extraterrestrial"

}


changeKingdom(giraffe)

fmt.Println(giraffe) // print "mammalia"

在使用结构体而不是副本时,您会更频繁地处理指针。


查看完整回答
反对 回复 2021-11-01
?
aluckdog

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

  1. 分配

new 和 &T{size:1} 返回 *T

T{size:1} 返回 T

内置函数 new 接受类型 T,在运行时为该类型的变量分配存储空间,并返回指向它的类型 *T 的值。变量按照初始值部分中的描述进行初始化。

2.

任何其他命名类型 T 的方法集由所有接收者类型为 T 的方法组成。 对应指针类型 *T 的方法集是所有接收者为 *T 或 T 的方法的集合(也就是说,它还包含方法集的)。

变量 pt * T

无功

func (r *T) area() int

您可以使用 pt.area() 或 t.area()

func (r T) area() int

你可以用t.area(),不能用pt.area()

通常我们使用 func(r *T) area() int


查看完整回答
反对 回复 2021-11-01

添加回答

代码语言

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号