GO复合数据类型

以不同的方式组合基本类型可以构造出来的复合数据类型。

数组

数组是一个由固定长度的特定类型元素组成的序列,一个数组可以由零个或多个元素组成。
数组定义为:[...]T ,方括号内为数组长度

//数组的定义及初始化
  var a [3]int
  var q [3]int = [3]int{1, 2, 3}
  var r [3]int = [3]int{1, 2}
  q := [...]int{1, 2, 3} //... 表示数组的长度是根据初始化值的个数来计算的

Slice

Slice(切片)代表变长的序列,序列中每个元素都有相同的类型。一个slice类型一般写作[]T,其中T 代表slice中元素的类型;slice的语法和数组很像,只是没有固定长度而已。

//slice的定义及初始化
  months := [...]string{1: "January", /* ... */, 12: "December"} //数组
  Q2 := months[4:7]
  summer := months[6:9]
  fmt.Println(Q2)     // ["April" "May" "June"]
  fmt.Println(summer) // ["June" "July" "August"]

append函数

内置的append函数用于向slice追加元素

var runes []rune
  for _, r := range "Hello, 世界" { 
    runes = append(runes, r)
}

Map

哈希表是一种巧妙并且实用的数据结构。它是一个无序的key/value对的集合,其中所有的key都是不同 的,然后通过给定的key可以在常数时间复杂度内检索、更新或删除对应的value。
Map的定义:map[K]V

//Map的定义及初始化
ages := make(map[string]int) // mapping from strings to ints
ages := map[string]int{
    "alice": 31,
    "charlie": 34,
}
ages["alice"] = 32
fmt.Println(ages["alice"]) // "32"
delete(ages, "alice") // remove element ages["alice"]

结构体

结构体是一种聚合的数据类型,是由零个或多个任意类型的值聚合成的实体。每个值称为结构体的成员。

//结构体的定义及初始化
type Employee struct {
    ID        int
    Name      string
    DoB       time.Time
    Position  string
    Salary    int
    ManagerID int
}

var dilbert Employee
dilbert.Salary -= 5000 // demoted, for writing too few lines of code
//通过对成员取址,通过指针访问
position := &dilbert.Position
*position = "Senior " + *position // promoted, for outsourcing to Elbonia

结构体面值

结构体值也可以用结构体面值表示,结构体面值可以指定每个成员的值。

 type Point struct{ X, Y int }
 p := Point{1, 2}
 q := Point{X: 1, Y: 2}//推荐

结构体比较

如果结构体的全部成员都是可以比较的,那么结构体也是可以比较的,那样的话两个结构体将可以使用 ==或!=运算符进行比较。
可比较的结构体类型和其他可比较的类型一样,可以用于map的key类型。

 type Point struct{ X, Y int }
 p := Point{1, 2}
 q := Point{2, 1}
 fmt.Println(p.X == q.X && p.Y == q.Y) // "false"
 fmt.Println(p == q)                   // "false"

结构体嵌入和匿名成员

只声明一个成员对应的数据类型而不指名成员的名字;这类成员就叫匿名成 员。匿名成员的数据类型必须是命名的类型或指向一个命名的类型的指针。

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
//匿名成员
w.X = 8 // equivalent to w.circle.point.X = 8

JSON

JSON是对JavaScript中各种类型的值——字符串、数字、布尔值和对象——Unicode本文编码。它可以用 有效可读的方式表示第三章的基础数据类型和本章的数组、slice、结构体和map等聚合数据类型。
将结构体转为JSON的过程叫编组(marshaling)。编组通过调用json.Marshal函数完成

data, err := json.Marshal(movies)

编码的逆操作是解码,对应将JSON数据解码为Go语言的数据结构,Go语言中一般叫unmarshaling,通过 json.Unmarshal函数完成。

var titles []struct{ Title string }
 if err := json.Unmarshal(data, &titles); err != nil {
     log.Fatalf("JSON unmarshaling failed: %s", err)
 }

文本和模板

有时候会需要复杂的打印格式,这 时候一般需要将格式化代码分离出来以便更安全地修改。这写功能是由text/template和html/template 等模板包提供的,它们提供了一个将变量值填充到一个文本或HTML格式的模板的机制。

一个模板是一个字符串或一个文件,里面包含了一个或多个由双花括号包含的{{action}}对象。
模板定义:

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)
}  

生成模板的输出需要两个处理步骤。第一步是要分析模板并转为内部表示,然后基于指定的输入执行模板。分析模板部分一般只需要执行一次。下面的代码创建并分析上面定义的模板templ。注意方法调用链 的顺序:template.New先创建并返回一个模板;Funcs方法将daysAgo等自定义函数注册到模板中,并返回模板;最后调用Parse函数分析模板。

report, err := template.New("report").
     Funcs(template.FuncMap{"daysAgo": daysAgo}).
     Parse(templ)
 if err != nil {
     log.Fatal(err)
}
//或者,如下简化
var report = template.Must(template.New("issuelist").
     Funcs(template.FuncMap{"daysAgo": daysAgo}).
     Parse(templ))

总结

整体介绍了go语言的符合数据类型,深入学习需自己多实践摸索

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,794评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,050评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,587评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,861评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,901评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,898评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,832评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,617评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,077评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,349评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,483评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,199评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,824评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,442评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,632评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,474评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,393评论 2 352

推荐阅读更多精彩内容

  • 综述 数组和结构体是聚合类型,其值由许多元素或成员字段的值组成,且都有固定内存大小的数据结构 数组是由同构的元素组...
    糖醋小排_0579阅读 493评论 0 0
  • 复合数据类型是由基本数据类型以各种方式组合而构成的.比较常用的复合数据类型有:数组,slice,map和结构体.数...
    一个菜鸟JAVA阅读 462评论 0 1
  • 复合数据类型包括数组,切片,map,结构体 数组 数组是一个由固定长度的特定类型的元素组成的序列,一个数组可以由零...
    zhaoxi_yu阅读 515评论 0 0
  • Go语言中有四种复合数据类型:数组,slice,map,结构体 数组和结构体都是聚合类型,长度固定。而slice和...
    陈卧虫阅读 1,124评论 0 0
  • 在别人眼里,也许我是个没心没肺的人,可我知道,我是个心里孤独的人。所以没事的时候我喜欢走出家门,到外面走走看看,才...
    邵晓宁阅读 774评论 8 13