清风徐来
Michael's Blog
Go的复合数据类型

上节我们学过来基本数据类型,本节说说go的复合数据类型。

请输入图片描述

##数组 Arrays 让我们首先声明一周中所有天的数组。

// 声明一个空数组的字符串
var days []string

// 声明一个包含元素的数组
days := [...]string{"monday", "tuesday", "wednesday", "thursday", "friday", "saturday", "sunday"}

如果我们想查询数组中的第一个元素或特定元素,我们可以以与其他语言非常相似的方式查询:

fmt.Println(days[0]) // 打印 'monday'
fmt.Println(days[5]) // 打印 'saturday'

##切片 Slices 切片和数组之间的区别非常微妙。 Go中的切片允许您访问底层数组元素的子集。

切片由三个部分组成,指针长度length容量capactiy。让我们试着用一个例子来形象化。比方说,例如,我们有一个星期几的数组,我们可以使用切片来仅提取那些工作日的天数。

days := [...]string{"Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"}
weekdays := days[0:5]
fmt.Println(weekdays)
// 这会返回: [Monday Tuesday Wednesday Thursday Friday]

##映射 Maps 映射是Go表示的哈希表,这是一种允许您将一种任意数据类型映射到另一种数据的数据结构。例如,让我们根据该频道的订阅者数量创建 YouTube频道名称=>订阅数量 的Map:

youtubeSubscribers := map[string]int{
  "TutorialEdge":     2240,
  "MKBHD":            6580350,
  "Fun Fun Function": 171220,
}

fmt.Println(youtubeSubscribers["MKBHD"]) // 打印输出 6580350

这是字符串数据类型和int数据类型之间的映射。

##结构 Structs 在Go中,我们有一个结构的概念。 这些结构允许我们创建数据类型,这些数据类型是其他数据类型的聚合(类似与其它语言的Class)。

比如说,我们在应用程序中有一个Person的概念。我们可以创建一个person结构,其中包含许多字段,例如,我们可以有一个name字段,其类型为string,age字段的类型为int,如下所示:

// 我们的 Person 结构
type Person struct {
  name string
  age int
}

// 声明一个新的 `Person`
var myPerson Person

使用这些结构的优点是我们可以有效地处理所有这些值或字段,因为它们被称为单个实体并且可以轻松地修改它们。

// 声明一个新的Person, `Michael`
mike := Person{name: "Michael", age: 32}

// 试图在我受伤之前回到过去
mike.age = 18

##结构嵌套 Nested Structs 由于我们可以在结构中创建嵌套结构,因此结构具有令人难以置信的可扩展性。例如,假设我们有一个团队结构,该团队中有许多人:

package main

import (
    "fmt"
)

func main() {
    type Person struct {
        name string
        age  int
    }

    // 我们的团队struct
    type Team struct {
        name    string
        players [2]Person
    }

    // 声明一个空的 'Team'
    var myTeam Team
    fmt.Println(myTeam)

    players := [...]Person{Person{name: "Forrest"}, Person{name: "Gordon"}}
    // 声明一个带玩家的Team
    celtic := Team{name: "Celtic FC", players: players}
  fmt.Println(celtic)

}

##小结 希望本教程对你有用,它让你深入了解如何在自己的Go程序中使用更高级的数据类型,来编写更有趣的应用。


最后修改于 2019-07-29