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
    
    正确的方法应该是什么

  • 分配
  • 新and&T{size:1}返回*T

    T{size:1}返回T

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

    二,

    任何其他命名类型T的方法集由接收器类型T的所有方法组成。相应指针类型*T的方法集是接收器*T或T的所有方法集(即,它还包含接收器类型T的方法集)

    变量pt*T

    变量t

    func(r*T)区域()int

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

    func(rt)area()int

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


    通常我们使用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
    类型的值