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