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

4.复合数据类型

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

数组

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

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

type Currency int

const (
    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中添加动态的数据。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值