16 Golang結構體詳解(二)

結構體方法和接受者

在go中,沒有類的概念但是可以給類型(結構體、自定義類型)定義方法。所謂方法就是定義了接受者的函數(shù)。接受者的概念類似于其他語言中的this或self。

  • 方法的定義格式
func (接受者變量 接受者類型) 方法名(參數(shù)列表) (返回參數(shù)) {
    函數(shù)體
}
  • 結構體是值類型
type Person struct {
    name string
    age int 
    sex string
}
func main(){
    var p1 = Person {
        name:"哈哈",
        age:20,
        sex:"男",
    }
    p2 := p1
    fmt.Println(p1 == p2) // true
    p2.Name = "李四"
    fmt.Printf("%v %v", p2, p1) //{李四 20 男} {哈哈 20 男}
}
  • 接收者類型可以是指針類型和非指針類型
type Person struct {
    name string
    age int8
    sex string
    height int8
}

func (p Person) PrintInfo () {
    fmt.Printf("姓名:%v 年齡:%v\n", p.name, p.age)
}

//接收的結構體必須是結構體的指針,才能在內部修改其屬性
func (p *Person) SetInfo (name string, age int8){
    p.name = name
    p.age = age
}

func main(){
    var p1 = Person{
        name:"張三",
        age:20,
        sex:"男",
    }
    p1.PrintInfo()
    //姓名:張三 年齡:20
    var p2 = Person{
        name:"李四",
        age:30,
        sex:"男",
    }
    p2.PrintInfo()
    //姓名:李四 年齡:30
    p1.PrintInfo()
    //姓名:張三 年齡:20
    
    p1.SetInfo("李四", 34)
    p1.PrintInfo()
    //姓名:李四 年齡:34

}
  • 給任意類型添加方法

在go中,接收者的類型可以是任何類型,不僅僅是結構體,任何類型都可以擁有方法

type MyInt int

func (m MyInt) printInfo() {
    fmt.Println("我是自定義類型中的自定義方法")
}

func main() {
    var a MyInt = 20
    a.printInfo()
}
  • 結構體的匿名字段

結構體允許其成員字段在聲明時沒有字段名,而只有類型,這種沒有名字的字段就稱為匿名字段。因為將類型名作為字段名,所有要求匿名結構體的類型必須唯一。

type Person struct {
    string
    int
}

func main() {
    p := Person {
        "張三",
        20,
    }
    fmt.Println(p) //{張三 20}
}

結構體的字段類型可以是基本數(shù)據(jù)類型、切片、Map以及結構體

type Person struct {
    name string
    age int
    hobby []string
    map1 map[string]string
}

func main() {
    var p Person
    p.name = "張三"
    p.age = 20
    p.hobby = make([]string, 3, 6)
    p.hobby[0] = "吃飯"
    p.hobby[1] = "睡覺"
    p.hobby[2] = "打豆豆"
    p.map1 = make(map[string]string)
    p.map1["address"] = "北京"
    p.map1["phone"] = "139123123123"
    fmt.Printf("%#v\n", p)
    //main.Person{name:"張三", age:20, hobby:[]string{"吃飯", "睡覺", "打豆豆"}, map1:map[string]string{"address":"北京", "phone":"139123123123"}}
    fmt.Printf("%v", p.hobby)//[吃飯 睡覺 打豆豆]
}

%v前面加#代表輸出結構體的所有實例

如果結構體的字段類型是指針、slice和map的零值都是nil,即未分配空間。如果需要使用這樣的字段,需要先make才能使用

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容