Go核心語言編程 - 復(fù)合數(shù)據(jù)類型(3)

Go對應(yīng)的復(fù)合數(shù)據(jù)類型有數(shù)組,字典岩榆,指針错负,切片,通道勇边,結(jié)構(gòu)和結(jié)構(gòu)犹撒,他們字面類型如下:

[n] elementType //數(shù)組
map [keyType]valueType //字典
* pointerType //指針
[] elementType //切片
chan valueType //通道
struct {
    fieldType fieldType
}
interface {
    method1(inputParams)(returnParams)
}

? 指針

var a = 11
p := &a
type User struct{
    name string
    age int
}
andes := User{
    name: "andes",
    age: 18,
}
p := &andes
fmt.Println(p.name)
// Go不支持指針運(yùn)算
a := 1234
p := &a
p++ //不允許,error
//函數(shù)中允許返回局部變量地址
func sum (a, b int) *int {
    sum := a + b
    return &sum //允許粒褒,sum會被分配在heap上
}

? 數(shù)組
? 數(shù)組初始化

var arr [2]int //聲明
array := [...]float64{7.0, 8.0}
a := [3]int{1, 2, 3} //指定長度初始化
b := [...]int{4, 5, 7} //不指定長度初始化
c := [3]int{1:1, 2:3} //指定長度识颊,通過索引值初始化
d := [...]int{1:1, 2:3} //不指定長度,通過索引值初始化

? 數(shù)組特點(diǎn)
? 數(shù)組長度一旦創(chuàng)建就固定了奕坟,不可以追加元素
? 數(shù)組是值類型祥款,數(shù)組賦值或者作為函數(shù)參數(shù)都是值拷貝

a1 := [3]int{1, 2, 3}
a2 := a1
a2[0] = 11 //這里拷貝了一份
fmt.Println(a1) //[1, 2, 3]
fmt.Println(a2) // [11, 2, 3] 

? 數(shù)組長度是數(shù)組類型的組成部分,[10]int和[20]int表示不同類型
? 可以根據(jù)數(shù)組創(chuàng)建切片
? 數(shù)組長度: len(array)
? 數(shù)組遍歷

a := [...]int{1, 2, 3}
b := a[0]
// 類似python遍歷
for i,v := range a {
    fmt.Printlb(i)
}
alength := len(a)
for i:=0, i<alength; i++ {
    
}

? 切片
因?yàn)镚o的數(shù)組的長度定長和值拷貝限制了使用場景月杉,Go提供了slice刃跛,這是一種可變數(shù)組

// src/runtime/slice.go
type slice struct {
    array unsafe.Pointer
    len int
    cap int
}

? 切片的創(chuàng)建
? 根據(jù)數(shù)組創(chuàng)建

// 創(chuàng)建語法array[a:b] 左邊包含,右邊不包含
var array = [...]int{1, 2, 3}
s1 := array[0:4]

? 根據(jù)內(nèi)置函數(shù)make創(chuàng)建切片

// len=10, cap=10
a := make([]int, 10)
// len=10, cap=15
a := make([]int, 10, 15)

? 切片的操作
? len()返回長度
? cap()返回容量
? append()追加元素
? copy()復(fù)制一個切片

a := [...]int{0, 1, 2, 3, 4}
b := make([]int, 2, 4)
c := a[0:3]
fmt.Println(len(b)) //2
fmt.Println(cap(b)) //4
b = append(b, 1)
fmt.Println(b) // [0, 0, 1]
fmt.Println(b) // 3
b = append(b, c)
fmt.Println(b) //[0, 0, 1, 0, 1, 2]
fmt.Println(len(b)) //6
fmt.Println(cap(b)) // 8, 底層數(shù)組發(fā)生自動擴(kuò)展
d := make([]int, 2, 2)
copy(d, c) //復(fù)制d和c長度最小的
fmt.Println(d) // [0, 1]
fmt.Println(len(d)) // 2
fmt.Println(cap(d)) // 2

? map
map[K]T苛萎,K必須是任意可以比較的類型桨昙,T是值類型,map是一種引用類型
? 創(chuàng)建Map
? 直接創(chuàng)建

dict := map[string]string{"a": "a1", "b": "b1"}
fmt.Println(dict["a"])

? 使用make函數(shù)創(chuàng)建

dict1 := make(map[int]int)
dict2 := make(map[int]int, 10) //初始化容量是10
dict1[1]=1
dict2[1]=1

? map標(biāo)準(zhǔn)操作

d1 := make(map[string]string, 10)
// 1. 賦值
d1["name"] = "chs"
// 2. 訪問值
fmt.Println(d1["name"])
// 3. range遍歷, 但是不能保證每次遍歷的順序是一樣的
for k, v := range mp {
    fmt.Println("k=", k, "v=", v)
}
// 4. 刪除值
delete(d1, "name")

? map特殊操作
Go內(nèi)置的map不是并發(fā)安全的
// 如果map的value是一個復(fù)合對象腌歉,當(dāng)修改復(fù)合對象的值時候蛙酪,需要整體替換這個復(fù)合對象

type User struct {
    name string,
    arg int,
}
dict := make(map[string]User)
user := User{
    name: "chs",
    age: 18,
}
dict["chs"] = user
// dict["chs"].age = 29 //錯誤
user.age = 29
dict["chs"] = user //整體替換value

? struct
結(jié)構(gòu)的類型可以是任意類型,而且它的存儲空間是連續(xù)的究履,其中字段按照聲明的順序存放
struct的有兩種形式:
? struct類型的字面量

struct {
    FieldName FieldType,
    FieldName FieldType,
}

? 自定義struct類型

type TypeName struct {
    FieldName FieldType,
    FieldName FieldType,
}

struct字面量用的不是很多滤否,大多使用自定義類型的struct類型
? struct類型變量的初始化

package main
import "fmt"
type Person struct {
    name string
    age int
}
type Student struct {
    *Person
    number int
}
func main() {
    p := &Person{
        name: "chs",
        age: 28,
    }
    s := Student{
        Person: p,
        number: 110,
    }
    fmt.Println(s.age) //這里Student通過struct間接繼承了Person
}

參考<<Go語言核心編程>>

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市最仑,隨后出現(xiàn)的幾起案子藐俺,更是在濱河造成了極大的恐慌炊甲,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件欲芹,死亡現(xiàn)場離奇詭異卿啡,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)菱父,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進(jìn)店門颈娜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人浙宜,你說我怎么就攤上這事官辽。” “怎么了粟瞬?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵同仆,是天一觀的道長。 經(jīng)常有香客問我裙品,道長俗批,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任市怎,我火速辦了婚禮岁忘,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘区匠。我一直安慰自己干像,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布辱志。 她就那樣靜靜地躺著蝠筑,像睡著了一般。 火紅的嫁衣襯著肌膚如雪揩懒。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天挽封,我揣著相機(jī)與錄音已球,去河邊找鬼。 笑死辅愿,一個胖子當(dāng)著我的面吹牛智亮,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播点待,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼阔蛉,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了癞埠?” 一聲冷哼從身側(cè)響起状原,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤聋呢,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后颠区,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體削锰,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年毕莱,在試婚紗的時候發(fā)現(xiàn)自己被綠了器贩。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡朋截,死狀恐怖蛹稍,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情部服,我是刑警寧澤稳摄,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站饲宿,受9級特大地震影響厦酬,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜瘫想,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一仗阅、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧国夜,春花似錦减噪、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至窄驹,卻和暖如春朝卒,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背乐埠。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工抗斤, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人丈咐。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓瑞眼,卻偏偏與公主長得像,于是被迫代替她去往敵國和親棵逊。 傳聞我的和親對象是個殘疾皇子伤疙,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評論 2 345