定义:

举凡一模一样种聚合的数据类型,是出于零个或多独随机档次的值聚合成的实业。

成员:

每个值称为结构体的积极分子。

示例:

之所以结构体的藏案例处理公司的职工信息,每个员工信息包含一个唯一的职工编号、员工的名字、家庭住址、出生日期、工作岗位、薪资、上级领导等等。所有的这些信都待绑定到一个实体中,可以当一个整单元被复制,作为函数的参数或返回值,或者是被储存到数组中,等等。

概念结构体:

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

概念变量:

var dilbert Employee

走访成员:

dilbert.Salary -= 5000

取得成员地址:

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一般用原来生字符串面值的款型书写。

相关文章

网站地图xml地图