Go語言學(xué)習(xí)筆記(五)-其他類型(指針孙技、結(jié)構(gòu)體、骤坐、)

指針

在Go語言中也存在指針绪杏,且指針保存了變量的地址,初始值為nil纽绍。定義指針與定義變量相似蕾久,不同的是在類型前面指針需要加*例如:

var p *int   //此處定義了一個int類型的指針

指針也可以通過已有變量獲取,通過&操作符便可拌夏,與C語言相似Go中*指針名指向變量底層僧著,但是不同的是Go中沒有指針運算履因。示例代碼如下:

package main
import "fmt"
func main(){
    i,j := 10,1000
    var p *int //定義一個int指針
    p = &i  //從i變量中獲取指向i的指針并賦值給p
    fmt.Println(i)
    *p = 21  //修改p指針指向的底層存儲的數(shù)據(jù)
    fmt.Println(i)
    p = &j
    *p = *p/10
    fmt.Println(j)
}

結(jié)構(gòu)體

結(jié)構(gòu)體就是一些字段的集合,通過type來聲明定義類型盹愚,并用struct來聲明結(jié)構(gòu)體栅迄。具體實現(xiàn)如下:

package main
import "fmt"
type TestType struct{
    x int
    y int
}
func main(){
    p := TestType{1,2}
    fmt.Println(p)
    p.x = 4
    fmt.Println(p)
}

從上述示例代碼中可以看出結(jié)構(gòu)體的字段通過點號來訪問。
結(jié)構(gòu)體還可以通過指針來訪問皆怕,若一個結(jié)構(gòu)體指針為p那么我們可以通過(&p).x來調(diào)用結(jié)構(gòu)體的字段或者使用隱式間接引用毅舆,直接寫p.x就可以。結(jié)構(gòu)體文法可以通過直接列出字段的值來新分配一個結(jié)構(gòu)體愈腾,也可以通過Name:語法列出部分字段憋活。

數(shù)組

類型[n]T表示擁有n個T類型的值得數(shù)組。數(shù)組的長度是數(shù)組的一部分虱黄,所以數(shù)組不能改變大小悦即。
為了解決這個限制,Go推出了切片這一類型橱乱,切片為數(shù)組元素提了供動態(tài)大小辜梳,靈活的視角,比數(shù)組更實用泳叠。切片通過[]T來定義作瞄。切片不存儲任何數(shù)據(jù),它只是描述了底層數(shù)組中的一段析二,或者我們也可以理解為切片其實相當(dāng)于對數(shù)據(jù)中的一段的每一個元素都獲取了一個指針對象存放到另一數(shù)組中粉洼。創(chuàng)建數(shù)組與切片的方法如下:

package main
import "fmt"
func main(){
    //創(chuàng)建一個數(shù)組并設(shè)置初始值Go自動推導(dǎo)類型
    myArray := [10]int{1,2,3,4,5,6,7,8,9,10}
    fmt.Println(myArray)
    //創(chuàng)建一個數(shù)組設(shè)置初始值
    var myArray1 [5]int = [5]int{6,5,4,3,2}
    fmt.Println(myArray1)
    //創(chuàng)建一個切片初始元素個數(shù)為5,默認(rèn)值為0叶摄,預(yù)留10個存儲空間
    mySlice := make([]int,5,10)
    fmt.Println(mySlice)
    //從數(shù)組上直接創(chuàng)建一個切片属韧,初始元素個數(shù)與數(shù)組相同
    mySlice2 := []int{1,2,3,4,5}
    fmt.Println(mySlice2)
    //穿件一個切片元素個數(shù)為6默認(rèn)值為0
    mySlice3 := make([]int,6)
    fmt.Println(mySlice3)
}

通過make方式來創(chuàng)建的切片也是創(chuàng)建動態(tài)數(shù)組的方法。
在進(jìn)行切片時蛤吓,可以利用它的默認(rèn)行為來忽略上下界宵喂,切片的下界默認(rèn)為0,上界為該切片的長度会傲。例如:

package main
import "fmt"
func main(){
    var a [10]int = {1,2,3,4,5,6,7,8,9,10}
    fmt.Println(a[0:10])
    fmt.Println(a[:10])
    fmt.Println(a[:10])
    fmt.Println(a[:])
}

以上四個切片是等價的

切片擁有容量與長度兩個屬性锅棕,長度就是包含的元素個數(shù),容量就是從第一個元素開始到底層數(shù)組元素的末尾的個數(shù)淌山,長度與容量分別用len(s)和cap(s)來獲取裸燎。切片的零值為nil,nil切片的容量與長度為0泼疑,且沒有底層數(shù)組德绿。
切片可以包含任何類型,包括切片。
切片可以通過append來追加元素移稳,該函數(shù)為自建函數(shù)蕴纳,使用方式如下:

package main
import "fmt"
func main(){
    var s []int
    printSlice(s)
    //輸出len=0 cap=0 []
    //追加一個元素
    s = append(s,0)
    printSlice(s)
    //輸出len=0 cap=0 []
    //追加多個元素
    s = append(s,2,3,4,5)
    printSlice(s)
    //輸出len=1 cap=1 [0]
}
func printSlice(s []int) {
    fmt.Printf("len=%d cap=%d %v\n", len(s), cap(s), s)
}

上述代碼展示了append的兩種使用方式,添加一個元素與添加多個元素

映射(map)

映射就是將鍵映射到值个粱,映射的零值為nil古毛,nil既沒有鍵也不能添加鍵,make函數(shù)會返回給定類型的映射都许,并將其初始化備用稻薇。映射的文法與結(jié)構(gòu)體相似,但是映射必須要有鍵名梭稚。若頂級類型只有一種類型颖低,那么可以在文法元素中忽略。

package main

import "fmt"

type Vertex struct {
    Lat, Long float64
}

var m = map[string]Vertex{
    "Bell Labs": {40.68433, -74.39967},
    "Google":    {37.42202, -122.08408},
}

func main() {
    fmt.Println(m)
    //輸出map[Bell Labs:{40.68433 -74.39967} Google:{37.42202 -122.08408}]

    //修改Bell Labs對應(yīng)的元素
    m["Bell Labs"] = Vertex{2000,-74.39967}
    fmt.Println(m)
    //輸出map[Bell Labs:{2000 -74.39967} Google:{37.42202 -122.08408}]
    
    //刪除Bell Labs對應(yīng)的元素
    delete(m,"Bell Labs")
    fmt.Println(m)
    //輸出map[Google:{37.42202 -122.08408}]

    //通過雙賦值來判斷鍵是否存在
    v, ok := m["Google"]
    fmt.Println("The value:", v, "Google?", ok)
    //輸出The value: {37.42202 -122.08408} Google? true
}

range

for循環(huán)的range形式可以遍歷切片也可以遍歷映射弧烤,for循環(huán)遍歷切片時,每次遍歷都會返回兩個值蹬敲,一個是元素的下標(biāo)一個是元素的副本暇昂,通過_可以將下標(biāo)或者值忽略,當(dāng)只需要下標(biāo)時可以直接去掉,value部分伴嗡。

package main

import (
    "golang.org/x/tour/wc"
    "strings"
)

func WordCount(s string) map[string]int {
    res := make(map[string]int)
    strs := strings.Fields(s)
    for _,v:= range strs{
        res[v]++
    }
    return res
}

func main() {
    wc.Test(WordCount)
}

函數(shù)值與閉包

Go中函數(shù)也是值急波,也可以作為參數(shù)或者返回值。Go函數(shù)可以是一個閉包瘪校。閉包是一個函數(shù)值澄暮,它引用了其函數(shù)體之外的變量。該函數(shù)可以訪問并賦予其引用的變量的值阱扬,換句話說泣懊,該函數(shù)被“綁定”在了這些變量上。

package main

import "fmt"

func main() {
    var j int = 5
    //此處創(chuàng)建了一個匿名函數(shù)麻惶,返回值為函數(shù)值馍刮,并通過匿名函數(shù)后跟()來執(zhí)行這個匿名函數(shù)將返回的函數(shù)值賦值給a變量
    a := func()(func()){
        var i int = 10
        return func(){
            fmt.Printf("i,j: %d , %d\n",i,j)
        }
    }()
    a()
    j *= 2
    a()
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市窃蹋,隨后出現(xiàn)的幾起案子卡啰,更是在濱河造成了極大的恐慌,老刑警劉巖警没,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件匈辱,死亡現(xiàn)場離奇詭異,居然都是意外死亡杀迹,警方通過查閱死者的電腦和手機(jī)亡脸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人梗掰,你說我怎么就攤上這事嵌言。” “怎么了及穗?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵摧茴,是天一觀的道長。 經(jīng)常有香客問我埂陆,道長苛白,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任焚虱,我火速辦了婚禮购裙,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘鹃栽。我一直安慰自己躏率,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布民鼓。 她就那樣靜靜地躺著薇芝,像睡著了一般。 火紅的嫁衣襯著肌膚如雪丰嘉。 梳的紋絲不亂的頭發(fā)上夯到,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天,我揣著相機(jī)與錄音饮亏,去河邊找鬼耍贾。 笑死,一個胖子當(dāng)著我的面吹牛路幸,可吹牛的內(nèi)容都是我干的荐开。 我是一名探鬼主播,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼劝赔,長吁一口氣:“原來是場噩夢啊……” “哼誓焦!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起着帽,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤杂伟,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后仍翰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體赫粥,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年予借,在試婚紗的時候發(fā)現(xiàn)自己被綠了越平。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片频蛔。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖秦叛,靈堂內(nèi)的尸體忽然破棺而出晦溪,到底是詐尸還是另有隱情,我是刑警寧澤挣跋,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布三圆,位于F島的核電站,受9級特大地震影響避咆,放射性物質(zhì)發(fā)生泄漏舟肉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一查库、第九天 我趴在偏房一處隱蔽的房頂上張望路媚。 院中可真熱鬧,春花似錦樊销、人聲如沸整慎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽院领。三九已至,卻和暖如春够吩,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背丈氓。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工周循, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人万俗。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓湾笛,卻偏偏與公主長得像,于是被迫代替她去往敵國和親闰歪。 傳聞我的和親對象是個殘疾皇子嚎研,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,611評論 2 353

推薦閱讀更多精彩內(nèi)容

  • 出處---Go編程語言 歡迎來到 Go 編程語言指南。本指南涵蓋了該語言的大部分重要特性 Go 語言的交互式簡介库倘,...
    Tuberose閱讀 18,426評論 1 46
  • 指針是C語言中廣泛使用的一種數(shù)據(jù)類型临扮。 運用指針編程是C語言最主要的風(fēng)格之一。利用指針變量可以表示各種數(shù)據(jù)結(jié)構(gòu)教翩; ...
    朱森閱讀 3,440評論 3 44
  • 原文鏈接 http://ironxu.com/709 本文是學(xué)習(xí) A Tour of Go (中文參考 Go 之旅...
    好剛編程閱讀 549評論 0 5
  • 滾動沖突解決 解決EditText換行后杆勇,ScrollView跟隨滾動的問題重寫ScrollView的comput...
    deathswing閱讀 402評論 1 0
  • 18.35分的天空。
    曹小閣閱讀 172評論 0 0