From a61f6e717182da71ef9f919ffada1b5c7e1bb14a Mon Sep 17 00:00:00 2001 From: leisore Date: Fri, 5 Jun 2015 14:06:15 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9ch10=20ch10.1=E4=B8=AD?= =?UTF-8?q?=E7=9A=84=E9=94=99=E5=88=AB=E5=AD=97=E5=8F=8A=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- eBook/10.0.md | 4 +-- eBook/10.1.md | 90 +++++++++++++++++++++++++-------------------------- 2 files changed, 47 insertions(+), 47 deletions(-) diff --git a/eBook/10.0.md b/eBook/10.0.md index 0983c5e..27f84f0 100644 --- a/eBook/10.0.md +++ b/eBook/10.0.md @@ -1,7 +1,7 @@ # 10 结构(struct)与方法(method) -Go通过类型别名(alias types)或结构体的形式支持用户自定义类型,或者叫定制类型。一个带属性的结构体试图表示一个现实世界中的实体。结构体是复合类型(omposite types),当需要定义一个类型,它由一系列属性组成,每个属性都有自己的类型和值,此时就应该使用结构体,它把数据聚集在一起。然后可以访问这些数据,就好像它是一个独立实体的一部分。 +Go通过类型别名(alias types)或结构体的形式支持用户自定义类型,或者叫定制类型。一个带属性的结构体试图表示一个现实世界中的实体。结构体是复合类型(omposite types),当需要定义一个类型,它由一系列属性组成,每个属性都有自己的类型和值的时候,就应该使用结构体,它把数据聚集在一起。然后可以访问这些数据,就好像它是一个独立实体的一部分。 组成结构体类型的那些数据称为 *成员(fields)*。一个成员有一个类型和一个名字;在一个结构体中,成员名字必须是唯一的。 -结构体的概念在软件工程上旧的术语叫ADT(抽象数据类型:Abstract Data Type),在一些老的编程语言中叫*记录(Record)*,比如Cobol,在C家族的编程语言中它也存在,并且名字也是*struct*,在面向对象的编程语言中,跟一个没无方法的轻量级类一样。不过因为Go语言中没有类的概念,因此在Go中结构体有着更为重要的地位。 \ No newline at end of file +结构体的概念在软件工程上旧的术语叫ADT(抽象数据类型:Abstract Data Type),在一些老的编程语言中叫*记录(Record)*,比如Cobol,在C家族的编程语言中它也存在,并且名字也是*struct*,在面向对象的编程语言中,跟一个无方法的轻量级类一样。不过因为Go语言中没有类的概念,因此在Go中结构体有着更为重要的地位。 \ No newline at end of file diff --git a/eBook/10.1.md b/eBook/10.1.md index 3d0fed4..5da698a 100644 --- a/eBook/10.1.md +++ b/eBook/10.1.md @@ -2,13 +2,13 @@ 结构体定义的一般方式如下: - ```go - type identifier struct { - field1 type1 - field2 type2 - ... - } - ``` +```go +type identifier struct { + field1 type1 + field2 type2 + ... +} +``` ` type T struct {a, b int}`也是合法的语法,它更适用于简单的结构体。 @@ -16,11 +16,11 @@ 成员可以是任何类型,甚至是结构体本身(参考[10.5](10.5.md)),可以是函数或者接口(参考第11章)。可以定义结构体类型的一个变量,然后给它的成员像下面这样赋值: - ```go - var s T - s.a = 5 - s.b = 8 - ``` +```go +var s T +s.a = 5 +s.b = 8 +``` 数组可以看作是一种结构体类型,不过它使用下标而不是命名的成员。 @@ -28,10 +28,10 @@ 使用*new*函数给一个新的结构体变量分配内存,它返回指向已分配内存的指针:`var t *T = new(T)`,如果需要可以把这条语句放在不同的行(比如定义是包范围的,但是分配却没有必要在开始就做)。 - ```go - var t *T - t = new(T) - ``` +```go +var t *T +t = new(T) +``` 写这条语句的惯用法是:`t := new(T)`,变量*t*是一个指向`T`的指针,此时结构体成员的值是它们所属类型的零值。 @@ -77,46 +77,46 @@ func main { 在Go中这叫*选择器(selector)*。无论变量是一个结构体类型还是一个结构体类型指针,都使用同样的选择器符(selector-notation)来引用结构体的成员: - ```go - type myStruct struct { i int } - var v myStruct // v has struct type - var p *myStruct // p is a pointer to a struct - v.i - p.i - ``` +```go +type myStruct struct { i int } +var v myStruct // v has struct type +var p *myStruct // p is a pointer to a struct +v.i +p.i +``` 初始化一个结构体实例(一个结构体字面量:struct-literal)的更简短和惯用的方式如下: - ```go - ms := &struct1{10, 15.5, "Chris"} - // 此时ms的类型是 *struct1 - ``` +```go + ms := &struct1{10, 15.5, "Chris"} + // 此时ms的类型是 *struct1 +``` 或者: - ```go - var mt struct1 - ms := struct1{10, 15.5, "Chris"} - ``` +```go + var mt struct1 + ms := struct1{10, 15.5, "Chris"} +``` 混合字面量语法(composite literal syntax) ` &struct1{a, b, c}` 是一种简写,底层仍然会调用` new ()`,这里值的顺序必须按照成员顺序来写。在下面的例子中能看到可以通过在值的前面放上成员名来初始化值。表达式` new(Type)` 和` &Type{}`是等价的。 结构体的典型例子是一个时间间隔(开始和结束时间以秒为单位): - ```go - type Interval struct { - start int - end int - } - ``` +```go +type Interval struct { + start int + end int +} +``` 初始化方式: - ```go - intr := Interval(0, 3) (A) - intr := Interval(end:5, start:1) (B) - intr := Interval(end:5) (C) - ``` +```go +intr := Interval(0, 3) (A) +intr := Interval(end:5, start:1) (B) +intr := Interval(end:5) (C) +``` 在(A)中值必须以成员在结构体定义时的顺序给出,*&*不是必须的。(B)显示了另一种方式,成员名加上一个冒号在值的前面,这种情况下值的顺序不必一致,并且某些成员还可以被忽略掉,就像(C)那样。 @@ -124,9 +124,9 @@ func main { 下图说明了结构体类型实例和一个指向它的指针的内存布局: - ```go - type Point struct { x, y int } - ``` +```go +type Point struct { x, y int } +``` 使用new初始化: