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通常用原生字符串面值的形式书写。

相关文章
相关标签/搜索