Go复合数据类型

Go复合数据类型包括:数组,切片,字典,结构体。 数组:

var a [3]int
q := [...]int{1, 2, 3}       //数组长度根据初始化元素数量决定

for i, v := range a {
    fmt.Printf("%d %d\n", i, v) //打印索引、值
}

//数组的大小也是其类型的一部分,[3]int和[4]int是不同的类型。

r :=[...]int{99:-1} //定义了一个大小为100,最后一个元素初始为-1,其余为0


c1 := sha256.Sum256([]byte("x"))      //

切片

// 切片共享底层数组数据
months := [...]string{1: "January", 2: "February", 3: "March", 4: "April", 5: "June"}
Q1 := months[0:3]
Q2 := months[2:3]
fmt.Println(Q1[2], &Q1[2]) //February 0xc042044080
fmt.Println(Q2[0], &Q2[0]) //February 0xc042044080

Q2[0] = "Hello"   // 修改Q2[0]后,Q1中的数据也发生改变
fmt.Println(Q1, Q2)  //[ January Hello] [Hello]

//切片的创建
var array=[5]int{1, 2, 3, 4, 5}
slice := array[:4]             //基于底层数组创建

var slice = []int{1, 2, 3, 4, 5} //直接创建

var slice = make([]int 5, 10) //使用make函数创建有5个元素的切片,cap为10

字典:

ages := map[string]int{
    "alice": 31,
    "joke": 33,
}

//或者
ages := make(map[string]int)
ages["alice"] = 31
ages["joke"] = 33


age, ok := ages["bob"]
if !ok {/* "bob" is not in this map"*/}
//也可以写成如下形式
if age, ok := ages["bob"]; !ok {/*...*/}
//不能对字典元素进行取地址的操作,因为字典元素的地址是会发生变化的,当装载因子超过一定数值后,会对字典进行rehash操作。

结构体

type Point struct {
    X, Y int
}

pp := &Point{1, 2}

pp := new(Point)
*pp = Point{1, 2}           //等价于上种方式

pp.X              //1
pp.Y              //2

结构体嵌套

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     //这样访问显得过繁琐


//结构体中的匿名字段
type Circle struct {
    Point
    Radius int
}

type Wheel struct {
    Circle
    Spokes int
}
// 这样我们就可以省略掉中间的名称直接访问w.X

//两种初始化方法
var w Wheel = Wheel{Circle{Point{8, 8}, 5}, 20}
var w Wheel = Wheel {
    Circle: Circle {
        Point: Point{X: 8, Y: 8},
        Radius: 5,
    },
    Spokes: 20,
}

JSON

// 只有导出的结构体成员才会被编码,这也就是我们为什么选择用大写字
母开头的成员名称。
type Movie struct {
    Title string
    Year int `json:"released"`    //输出json格式时指定的别名
    Color bool `json:"color, omitempty"` //omitempty表示结构体成员为空时不生成JSON对象
    Actors []string
}

文本和HTML模版

const templ = `{ {.TotalCount}} issues:
{ {range .Items}}----------------------------------------
Number: { {.Number}}
User: { {.User.Login}}
Title: { {.Title | printf "%.64s"}}
Age: { {.CreatedAt | daysAgo}} days
{ {end}}`

func daysAgo(t time.Time) int {
    return int(time.Since(t).Hours() / 24)
}

// 创建一个模版,指定过滤函数,调用Parse函数分析模板
report, err := template.New("report").
Funcs(template.FuncMap{"daysAgo": daysAgo}).
Parse(templ)

//执行模版,result为传入的参数
report.Execute(os.Stdout, result)

Ref: 1.The Go Programming Language