go語言結構體

定義:json

是一種聚合的數據類型,是由零個或多個任意類型的值聚合成的實體。數組

成員:數據結構

每一個值稱爲結構體的成員。函數

示例:oop

用結構體的經典案例處理公司的員工信息,每一個員工信息包含一個惟一的員工編號、員工的名字、家庭住址、出生日期、工做崗位、薪資、上級領導等等。全部的這些信息都須要綁定到一個實體中,能夠做爲一個總體單元被複制,做爲函數的參數或返回值,或者是被存儲到數組中,等等。ui

定義結構體:編碼

type Employee struct {
    ID        int
    Name      string
    Address   string
    DoB       time.Time
    Position  string
    Salary    int
    ManagerID int
}

定義變量:spa

var dilbert Employee

訪問成員:指針

dilbert.Salary -= 5000

取成員地址:code

position := &dilbert.Position
*position = "Senior " + *position
點操做符與指向結構體的指針:
var employeeOfTheMonth *Employee = &dilbert
employeeOfTheMonth.Position += " (proactive team player)"

成員定義順序:

一般一行對應一個結構體成員,成員的名字在前類型在後,不過若是相鄰的成員類型若是相同的話能夠被合併到一行,就像下面的Name和Address成員那樣

type Employee struct {
    ID            int
    Name, Address string
    DoB           time.Time
    Position      string
    Salary        int
    ManagerID     int
}

成員命名規則:

若是結構體成員名字是以大寫字母開頭的,那麼該成員就是導出的;這是Go語言導出規則決定的。一個結構體可能同時包含導出和未導出的成員。

導出含義:在其餘包中可進行讀寫。

一個命名爲S的結構體類型將不能再包含S類型的成員:由於一個聚合的值不能包含它自身。(該限制一樣適應於數組。)可是S類型的結構體能夠包含*S指針類型的成員,這可讓咱們建立遞歸的數據結構,好比鏈表和樹結構等。

type tree struct {
    value       int
    left, right *tree
}

結構體面值:

能夠指定每一個成員的值。

type Point struct{ X, Y int }

p := Point{1, 2}
上面的是第一種寫法,要求以結構體成員定義的順序爲每一個結構體成員指定一個面值。還能夠:
anim := gif.GIF{LoopCount: nframes}

以成員名字和相應的值來初始化,能夠包含部分或所有的成員;在這種形式的結構體面值寫法中,若是成員被忽略的話將默認用零值。由於,提供了成員的名字,全部成員出現的順序並不重要。

注意:兩種不一樣形式的寫法不能混合使用。

結構體嵌入和匿名成員:
type Point struct {
    X, Y int
}

type Circle struct {
    Center Point
    Radius int
}

type Wheel struct {
    Circle Circle
    Spokes int
}

訪問每一個成員:

var w Wheel
w.Circle.Center.X = 8
w.Circle.Center.Y = 8
w.Circle.Radius = 5
w.Spokes = 20

在次簡化結構體定義:

type Circle struct {
    Point
    Radius int
}

type Wheel struct {
    Circle
    Spokes int
}

得意於匿名嵌入的特性,咱們能夠直接訪問葉子屬性而不須要給出完整的路徑:

var w Wheel
w.X = 8            // equivalent to w.Circle.Point.X = 8
w.Y = 8            // equivalent to w.Circle.Point.Y = 8
w.Radius = 5       // equivalent to w.Circle.Radius = 5
w.Spokes = 20

結構體字面值必須遵循形狀類型聲明時的結構,因此只能用下面的兩種語法,它們彼此是等價的:

w = Wheel{Circle{Point{8, 8}, 5}, 20}

w = Wheel{
    Circle: Circle{
        Point:  Point{X: 8, Y: 8},
        Radius: 5,
    },
    Spokes: 20, // NOTE: trailing comma necessary here (and at Radius)
}

結構體tag:

在結構體聲明中,Year和Color成員後面的字符串面值是結構體成員Tag

type Movie struct {
    Title  string
    Year   int  `json:"released"`
    Color  bool `json:"color,omitempty"`
    Actors []string
}

var movies = []Movie{
    {Title: "Casablanca", Year: 1942, Color: false,
        Actors: []string{"Humphrey Bogart", "Ingrid Bergman"}},
    {Title: "Cool Hand Luke", Year: 1967, Color: true,
        Actors: []string{"Paul Newman"}},
    {Title: "Bullitt", Year: 1968, Color: true,
        Actors: []string{"Steve McQueen", "Jacqueline Bisset"}},
    // ...
}

這樣的數據結構特別適合JSON格式,而且在兩種之間相互轉換也很容易。將一個Go語言中相似movies的結構體slice轉爲JSON的過程叫編組(marshaling)。編組經過調用json.Marshal函數完成:

data, err := json.Marshal(movies)
if err != nil {
    log.Fatalf("JSON marshaling failed: %s", err)
}
fmt.Printf("%s\n", data)

Marshal函數返還一個編碼後的字節slice,包含很長的字符串,而且沒有空白縮進;咱們將它折行以便於顯示:

[{"Title":"Casablanca","released":1942,"Actors":["Humphrey Bogart","Ingr
id Bergman"]},{"Title":"Cool Hand Luke","released":1967,"color":true,"Ac
tors":["Paul Newman"]},{"Title":"Bullitt","released":1968,"color":true,"
Actors":["Steve McQueen","Jacqueline Bisset"]}]
其中Year名字的成員在編碼後變成了released,還有Color成員編碼後變成了小寫字母開頭的color。這是由於構體成員Tag所致使的。一個構體成員Tag是和在編譯階段關聯到該成員的元信息字符串:
Year  int  `json:"released"`
Color bool `json:"color,omitempty"`

結構體的成員Tag能夠是任意的字符串面值,可是一般是一系列用空格分隔的key:"value"鍵值對序列;由於值中含義雙引號字符,所以成員Tag通常用原生字符串面值的形式書寫。

相關文章
相關標籤/搜索