天天看點

Golang之struct類型

一、struct

        Go語言中,也有struct,定義與C語言類似,舉例說明如下:

        type person struct {

            name string

            age int

        }

        上面就聲明了一個結構體person,包含兩個字段。可以如下來使用這個struct:

        var P person        //P現在就是person類型的變量了

        P.name = "shicq"    //指派給P的name屬性

        P.age = 31            //指派給P的age屬性

        fmt.Printf("The person's name  is %s", P.name)    //通路P的name屬性

        除了上面這種P的聲明使用之外,還有兩種聲明使用方式:

        (1)按照順序提供初始化值。

        P := person("Li Lei", 25)

        (2)通過field:value的方式初始化,這樣可以任意順序。

        P := person(age:24, name:"Han Meimei")     

二、匿名字段

        前文介紹了如何定義一個struct,定義的時候是字段名與其類型一一對應,實際上Go語言支援隻提供類型,而不寫字段名的方式,也就是匿名字段,或稱為嵌入字段。當匿名字段是一個struct的時候,那麼這個struct所擁有的全部字段都被隐式地引入了目前定義的這個struct。下面舉例說明之:

        type Human struct {

        type Student struct {

            Human        //匿名字段,那麼預設Student就包含了Human的所有字段

            speciality string

        //初始化Student

        mark := Student(Human{"shicq", 31}, "Computer Science")

        //通路相應字段

        fmt.Println("His name is ", mark.name)

        fmt.Println("His age is ", mark.age)

        fmt.Println("His speciality is ", mark.speciality)

        我們看到Student通路屬性age和name的時候,就像通路自己所擁有的字段一樣。當然Student也能通過通路Human來通路這兩個字段:

        mark.Human = Human{"shicq", 31}

        mark.Human.age -= 1

        不僅僅是struct字段,所有内置類型和自定義類型都可以作為匿名字段,比如slice。

        如果human中有一個叫做phone的字段,而student也有一個叫做phone的字段,該當如何呢?

        Go語言中最外層的優先通路,也就是當通過student.phone通路的時候,通路的是student裡面的字段,而不是human裡面的字段。

        這就允許我們可以重載通過匿名字段繼承的一些字段,當然如果想通路重載後對應的匿名類型裡的字段,可以通過匿名字段名來通路:

            phone string    //Human類型擁有的字段

        type Employee struct {

            Human        //匿名字段Human

            phone string        //雇員的phone字段

        Bob := Employee{Human{"Bob", 24, "777-444-xxxx"}, "Designer", "333-222"}

        fmt.Println("Bob's work phone is ", Bob.phone)                   

        fmt.Println("Bob's personal phone is ", Bob.Human.phone)        //通路Human的phone字段

繼續閱讀