第四章 复合数据类型

2018-09-11  本文已影响0人  糖醋小排_0579

综述

4.1 数组

定义

初始化

var a [3] int
var q [3] int = [3]int{1,2}
a := [...]int{1,2,3}  //...表示数组长度由初始化值的个数来计算
r := [...]int{99:-1}  //表示定义了一个含有100个元素的数组r,最后一个元素被初始化为-1,其他元素初始化为0

4.2 Slice

定义

切片操作

其他

var s []int    // len(s) == 0, s == nil
s = nil        // len(s) == 0, s == nil
s = []int(nil) // len(s) == 0, s == nil
s = []int{}    // len(s) == 0, s != nil
make([]T,  len)
make([]T, len, cap)

函数

append函数

var runes []rune
for _, r := range "hello,world" {
  runes = append(runes,  r)
 }
fmt.Printf("%q\n", runes)

copy函数

4.3 Map

定义及其他

ages := make(map[string]int)
// map字面值的语法创建map
ages := map[string]int{
  "alice" : 31,
  "charlie": 32,
}
//创建空的map的表达式
map[string]int{}

map下标语法

age, ok := ages["bob"]
if  !ok {}
if age, ok := ages["bob"]; !ok {}

返回两个值,第二个是布尔值报告元素是否真的存在

slice类型或不可比较的类型作为 map 的key

map的value类型

4.4 结构体

定义

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

var dilbert Employee
package main

import (
    "fmt"
)

type tree struct {
    value       int
    left, right *tree
}

func Sort(values []int) {
    var root *tree
    for _, v := range values {
        root = add(root, v)
    }
    appendValues(values[:0], root)
}

func appendValues(values []int, t *tree) []int {
    if t != nil {
        values = appendValues(values, t.left)
        values = append(values, t.value)
        values = appendValues(values, t.right)
    }
    return values
}

func add(t *tree, value int) *tree {
    if t == nil {
        t = new(tree)
        t.value = value
        return t
    }
    if value < t.value {
        t.left = add(t.left, value)
    } else {
        t.right = add(t.right, value)
    }
    return t
}

func main() {
    values := []int{11, 2, 5, 30, 100, 10, 1, 70}
    Sort(values)
    fmt.Println("%d\n", values)
}

结构体字面值

第一种写法

type Point struct {X, Y int}
p := Point{1, 2}

第二种写法(常用)

anim := gif.GIF{LoopCount: nframes}

结构体可以作为函数的参数和返回值

pp := &Point{1, 2}
//等价于下面的语句
pp := new(Point)
*pp = Point{1, 2}

结构体比较

结构体嵌入和匿名成员

匿名成员

type Point struct {
  X, Y int
}
type Circle struct {
  Point
  Radius int
}
type Wheel struct {
  Circle
  Spokes int
}
var w Wheel
w.X = 8
w.Y = 8
w.Radius = 5
w.Spokes = 20

4.5 JSON

定义

array 
["gold", "silver", "bronze"]
object
{
  "year": 2019,
  "event": "archery",
  "medals": ["gold", "silver", "bronze"]
}

编组(marshaling)

解码(unmarshaling)

文本和HTML模板

模板包

上一篇 下一篇

猜你喜欢

热点阅读