Go语言圣经(中文版)读书笔记(四)

来源:互联网 发布:sdl编程 编辑:程序博客网 时间:2024/04/29 18:54

4.复合数据类型

  1. 数组
  2. Slice
  3. Map
  4. 结构体
  5. JSON
  6. 文本和HTML模板

数组

    var a [3]int //数组的长度是固定的,声明之后没有赋值的会自动复制默认值。    q := [...]int{1, 2, 3}

书中有一个例子,我觉得特别好。
给数组玩出了MAP的感觉。

type Currency intconst (    USD Currency = iota // 美元    EUR                 // 欧元    GBP                 // 英镑    RMB                 // 人民币)symbol := [...]string{USD: "$", EUR: "€", GBP: "£", RMB: "¥"}fmt.Println(RMB, symbol[RMB]) // "3 ¥" 

注意:由于函数参数的传递机制,导致在传大数组的时候特别低效,这时候可以传指向数组的指针。
如果数组的类型是可以比较的,那么数组也能用==来比较

Slice
类似一种没有长度的数组,然而他不能用==来相互比较。但是可以跟nil比。
append函数,往slice里添加元素 slice=(append(slice,value))此处的=是必不可少的。
每一次容量的变化都会导致重新分配内存和copy操作。当len等于cap时,再添加数据cap会翻倍。

MAP:

1. ages := make(map[string]int) //使用内建的make函数2. ages := map[string]int{    "alice":   31,    "charlie": 34,}3.delete(ages, "alice")//删除元素

结构体:多种数据类型的集合

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

结构体还能包含其他结构体,并且在名字没有冲突的情况下可以简单是使用.+id引用。传递较大的结构体的时候,可以使用指针来传输。
p :=&Point{}
JSON:

//定义结构体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"}},    // ...}//输出,但是没有格式化,输出的结果不好读data, err := json.Marshal(movies)if err != nil {    log.Fatalf("JSON marshaling failed: %s", err)}fmt.Printf("%s\n", data)//格式化输出结果,每一行隔了一个空格,每一层隔4个空格data, err := json.MarshalIndent(movies, "", "    ")if err != nil {    log.Fatalf("JSON marshaling failed: %s", err)}fmt.Printf("%s\n", data)

文本和HTML模板
有点像java 的jsp,在静态的文本或html中添加动态的数据。

1 0
原创粉丝点击