Struct Go中的结构初始化和方法声明
我不熟悉围棋,对结构很好奇。让我们定义一个结构Struct Go中的结构初始化和方法声明,struct,go,Struct,Go,我不熟悉围棋,对结构很好奇。让我们定义一个结构T type T struct { size int } 我见过不同类型的结构初始化。有什么区别 new(T) // 1 T{size:1} // 2 &T{size:1} // 3 以及两种类型的方法声明: func (r *T) area() int // 1 func (r T) area() int // 2 正确的方法应该是什么 分配 新and&T{size:1}返回*T T{size:1}返回T 内置函
T
type T struct {
size int
}
new(T) // 1
T{size:1} // 2
&T{size:1} // 3
func (r *T) area() int // 1
func (r T) area() int // 2
正确的方法应该是什么通常我们使用func(r*T)area()int,这里有不同的示例:
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"
构造函数新建
初始化
返回一个指针,其值为零
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"
与副本相比,在使用结构时,您更经常处理指针。没有一个是“正确”的,并且每个指针都做了不同的事情。仔细看看Nit。new(T)返回一个指向T的零值的指针,而&T{1}生成一个非零值。var newAnimal Animal将做什么?
var a Animal
是一个变量的声明,用于保存Animal
类型的值