實例學習Golang--結構體

package main

import "fmt"

// 定義結構體
type StudentMangement struct {
    name  string
    id    string
    addr  string
    hobby []string
}

// 構造函數 一般以new開頭
// 函數返回結構體指針,可以減少內存開銷
func newStudent(name, id, addr string, hobby []string) *StudentMangement {
    return &StudentMangement{
        name:  name,
        id:    id,
        addr:  addr,
        hobby: hobby,
    }
}

// 修改值
func resetId(s *StudentMangement) {
    // (*s).id = "destory"  // 標準方式應該這麼寫
    s.id = "destory" // go 語言的語法糖,自動根據指針找對應的變量
}

// 這種情況不能修改值, 函數內是副本
func resetName(s StudentMangement) {
    s.name = "resetName"
}

func resetNamePoint(s *StudentMangement) {
    s.name = "resetName"
}

func main() {

    xiaoMing := newStudent("XiaoMing", "2020001", "Beijing", []string{"Music"})
    fmt.Println(xiaoMing) // &{XiaoMing 2020001 Beijing [Music]}

    resetId(xiaoMing)
    fmt.Println(xiaoMing) // &{XiaoMing destory Beijing [Music]}

    var shuFen StudentMangement
    shuFen.name = "淑芬"

    resetName(shuFen)
    fmt.Println(shuFen.name) // 淑芬
    resetNamePoint(&shuFen)
    fmt.Println(shuFen.name) // resetName

}

 

結構體佔用一塊連續的內存,巧妙的安排字節對齊可以節省內存

大神博客:

在Go中恰到好處的內存對齊

 

結構體字段的可見性

結構體中字段大寫開頭表示可公開訪問,小寫表示私有(僅在定義當前結構體的包中可訪問)。

匿名結構體

結構體允許其成員字段在聲明時沒有字段名而只有類型,這種沒有名字的字段就稱爲匿名字段。同一個結構體內 同一類型的匿名字段 唯一。

package main

import "fmt"

type Anonymous struct {
    string
    int
}

func main() {
    a := Anonymous{
        "name",
        2020,
    }
    fmt.Printf("%#v\n", a)
}


結構體嵌套

結構體中包含結構體

// 嵌套結構體
package main

import "fmt"

type Anonymous struct {
    string
    int
}

type Nest struct {
    name      string
    id        int
    anonymous Anonymous
    // Anonymous // 嵌套匿名結構體
}

func main() {
    a := Anonymous{
        "name",
        2020,
    }
    fmt.Printf("%#v\n", a)

    n := Nest{
        name: "Nest",
        id:   2020,
        anonymous: Anonymous{
            "Anonymous",
            20,
        },
    }
    fmt.Printf("%#v\n", n)

}
// main.Anonymous{string:"name", int:2020}
// main.Nest{name:"Nest", id:2020, anonymous:main.Anonymous{string:"Anonymous", int:20}}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章