go語(yǔ)言 基礎(chǔ)語(yǔ)法 變量

跨平臺(tái)編譯

SET CGO_ENABLED=0 // 禁用CGO
SET GOOS=linux // 目標(biāo)平臺(tái)是linux
SET GOARCH=amd64 // 目標(biāo)處理器架構(gòu)是amd64

godep 依賴(lài)管理工具

執(zhí)行以下命令安裝godep工具

go get github.com/tools/godep
godep save     將依賴(lài)項(xiàng)輸出并復(fù)制到Godeps.json文件中
godep go       使用保存的依賴(lài)項(xiàng)運(yùn)行g(shù)o工具
godep get      下載并安裝具有指定依賴(lài)項(xiàng)的包
godep path     打印依賴(lài)的GOPATH路徑
godep restore  在GOPATH中拉取依賴(lài)的版本
godep update   更新選定的包或go版本
godep diff     顯示當(dāng)前和以前保存的依賴(lài)項(xiàng)集之間的差異
godep version  查看版本信息

go module

go module是Go1.11版本之后官方推出的版本管理工具谆焊,并且從Go1.13版本開(kāi)始摩桶,go module將是Go語(yǔ)言默認(rèn)的依賴(lài)管理工具舵稠。

基礎(chǔ)語(yǔ)法

fmt.Println() 打印

格式符:%o輸出八進(jìn)制,%d輸出十進(jìn)制锣险,%x輸出十六進(jìn)制滩租,%f輸出浮點(diǎn)型數(shù)據(jù),%c輸出單個(gè)字符,%s輸出字符串句伶,%l輸出長(zhǎng)整型。但是也有稍微不是很常用的格式符陆淀,%p就是其中之一考余。相信大家在日常中使用得比較少,其實(shí)它的輸出格式也是六進(jìn)制轧苫,跟%x的區(qū)別在于楚堤,%p輸出的長(zhǎng)度是一致的8位16進(jìn)制符(即32位2進(jìn)制符)。

cap可以求出slice最大擴(kuò)張容量含懊,不能超出數(shù)組限制
len 長(zhǎng)度

數(shù)組

var 變量名= [長(zhǎng)度]類(lèi)型=(值)
var 變量名= [...]類(lèi)型=(值) //未知長(zhǎng)度
var 變量名= [5]類(lèi)型=(索引:值,索引:值) //給指定索引賦值

var 變量名= [...]struct=({名稱(chēng):類(lèi)型}{值:值}) //前面聲明名稱(chēng)類(lèi)型后面指定值

例:var test= [...]struct {
        name string
        age  uint8
    }{
        {"user1", 10}, // 可省略元素類(lèi)型身冬。
        {"user2", 20}, // 別忘了最后一行的逗號(hào)。
    }

內(nèi)置函數(shù) len 和 cap 都返回?cái)?shù)組長(zhǎng)度 (元素?cái)?shù)量)岔乔。

數(shù)組傳參

(定義函數(shù)內(nèi)變量名 *[長(zhǎng)度]類(lèi)型)

切片 Slice

切片的定義:var 變量名 []類(lèi)型酥筝,

nil 判斷切片是否為空

通過(guò)make來(lái)創(chuàng)建切片

    var slice []type = make([]type, len)
    slice  := make([]type, len)
    slice  := make([]type, len, cap)

append 尾部添加

copy :函數(shù) copy 在兩個(gè) slice 間復(fù)制數(shù)據(jù),復(fù)制長(zhǎng)度以 len 小的為準(zhǔn)雏门。兩個(gè) slice 可指向同一底層數(shù)組嘿歌,允許元素區(qū)間重疊。

指針

&(取地址)和*(根據(jù)地址取值)

取變量指針的語(yǔ)法如下:

 ptr := &v    // v的類(lèi)型為T(mén)


v:代表被取地址的變量茁影,類(lèi)型為T(mén)
ptr:用于接收地址的變量宙帝,ptr的類(lèi)型就為T,稱(chēng)做T的指針類(lèi)型募闲。代表指針茄唐。

new

聲明


func new(Type) *Type

1.Type表示類(lèi)型,new函數(shù)只接受一個(gè)參數(shù)蝇更,這個(gè)參數(shù)是一個(gè)類(lèi)型
2.*Type表示類(lèi)型指針沪编,new函數(shù)返回一個(gè)指向該類(lèi)型內(nèi)存地址的指針。

make

make也是用于內(nèi)存分配的年扩,區(qū)別于new蚁廓,它只用于slice、map以及chan的內(nèi)存創(chuàng)建厨幻,而且它返回的類(lèi)型就是這三個(gè)類(lèi)型本身相嵌,而不是他們的指針類(lèi)型

聲明

func make(t Type, size ...IntegerType) Type

new與make的區(qū)別

1.二者都是用來(lái)做內(nèi)存分配的腿时。
2.make只用于slice、map以及channel的初始化饭宾,返回的還是這三個(gè)引用類(lèi)型本身批糟;
3.而new用于類(lèi)型的內(nèi)存分配,并且內(nèi)存對(duì)應(yīng)的值為類(lèi)型零值看铆,返回的是指向類(lèi)型的指針徽鼎。

map

map是一種無(wú)序的基于key-value的數(shù)據(jù)結(jié)構(gòu),Go語(yǔ)言中的map是引用類(lèi)型弹惦,必須初始化才能使用

聲明

 map[KeyType]ValueType

KeyType:表示鍵的類(lèi)型否淤。
ValueType:表示鍵對(duì)應(yīng)的值的類(lèi)型。

map類(lèi)型的變量默認(rèn)初始值為nil棠隐,需要使用make()函數(shù)來(lái)分配內(nèi)存石抡。語(yǔ)法為:

 make(map[KeyType]ValueType, [cap])

也可以在聲明時(shí)填充元素

userInfo := map[string]string{
        "username": "pprof.cn",
        "password": "123456",
    }

判斷值是否存在

Go語(yǔ)言中有個(gè)判斷map中鍵是否存在的特殊寫(xiě)法,格式如下:

 value, ok := map[key]

 //例子
 
func main() {
    scoreMap := make(map[string]int)
    scoreMap["張三"] = 90
    scoreMap["小明"] = 100
    // 如果key存在ok為true,v為對(duì)應(yīng)的值助泽;不存在ok為false,v為值類(lèi)型的零值
    v, ok := scoreMap["張三"]
    if ok {
        fmt.Println(v)
    } else {
        fmt.Println("查無(wú)此人")
    }
}
 

map遍歷

scoreMap := make(map[string]int)
    scoreMap["張三"] = 90
    scoreMap["小明"] = 100
    scoreMap["王五"] = 60
for k, v := range scoreMap {
        fmt.Println(k, v)
    }

//或者只遍歷key
for k := range scoreMap {
        fmt.Println(k)
    }

map刪除

 delete(map, key)

map:表示要?jiǎng)h除鍵值對(duì)的map
key:表示要?jiǎng)h除的鍵值對(duì)的鍵

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

自定義類(lèi)型

//將MyInt定義為int類(lèi)型
type MyInt int
//通過(guò)Type關(guān)鍵字的定義啰扛,MyInt就是一種新的類(lèi)型,它具有int的特性嗡贺。

類(lèi)型別名

//類(lèi)型別名規(guī)定:TypeAlias只是Type的別名隐解,本質(zhì)上TypeAlias與Type是同一個(gè)類(lèi)型。
type TypeAlias = Type

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

使用type和struct關(guān)鍵字來(lái)定義結(jié)構(gòu)體

  type 類(lèi)型名 struct {
        字段名 字段類(lèi)型
        字段名 字段類(lèi)型
        …
    }

1.類(lèi)型名:標(biāo)識(shí)自定義結(jié)構(gòu)體的名稱(chēng)暑刃,在同一個(gè)包內(nèi)不能重復(fù)。
2.字段名:表示結(jié)構(gòu)體字段名膜眠。結(jié)構(gòu)體中的字段名必須唯一岩臣。
3.字段類(lèi)型:表示結(jié)構(gòu)體字段的具體類(lèi)型。

舉個(gè)例子宵膨,我們定義一個(gè)Person(人)結(jié)構(gòu)體架谎,代碼如下:

  type person struct {
        name string
        city string
        age  int8
    }

//或者同類(lèi)型寫(xiě)在一行
  type person1 struct {
        name, city string
        age        int8
    }

結(jié)構(gòu)體實(shí)例化

只有當(dāng)結(jié)構(gòu)體實(shí)例化時(shí),才會(huì)真正地分配內(nèi)存辟躏。也就是必須實(shí)例化后才能使用結(jié)構(gòu)體的字段谷扣。

結(jié)構(gòu)體本身也是一種類(lèi)型,我們可以像聲明內(nèi)置類(lèi)型一樣使用var關(guān)鍵字聲明結(jié)構(gòu)體類(lèi)型捎琐。

  var 結(jié)構(gòu)體實(shí)例 結(jié)構(gòu)體類(lèi)型

例子


type person struct {
    name string
    city string
    age  int8
}

func main() {
    var p1 person
    p1.name = "pprof.cn"
    p1.city = "北京"
    p1.age = 18
    fmt.Printf("p1=%v\n", p1)  //p1={pprof.cn 北京 18}
    fmt.Printf("p1=%#v\n", p1) //p1=main.person{name:"pprof.cn", city:"北京", age:18}
}

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

 var user struct{Name string; Age int}

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

 var p2 = new(person)

使用&對(duì)結(jié)構(gòu)體進(jìn)行取地址操作相當(dāng)于對(duì)該結(jié)構(gòu)體類(lèi)型進(jìn)行了一次new實(shí)例化操作会涎。

p3 := &person{}

結(jié)構(gòu)體初始化

鍵值對(duì)

p6 := &person{
    name: "pprof.cn",
    city: "北京",
    age:  18,
}

可以不寫(xiě)鍵值

p8 := &person{
    "pprof.cn",
    "北京",
    18,
}

注意: 1.必須初始化結(jié)構(gòu)體的所有字段。
2.初始值的填充順序必須與字段在結(jié)構(gòu)體中的聲明順序一致瑞凑。
3.該方式不能和鍵值初始化方式混用

創(chuàng)建構(gòu)造函數(shù)

func newPerson(name, city string, age int8) *person {
    return &person{
        name: name,
        city: city,
        age:  age,
    }
}

方法和接收者

聲明

 func (接收者變量 接收者類(lèi)型) 方法名(參數(shù)列表) (返回參數(shù)) {
        函數(shù)體
    }

指針類(lèi)型接收者
1.需要修改接收者中的值
2.接收者是拷貝代價(jià)比較大的大對(duì)象
3.保證一致性末秃,如果有某個(gè)方法使用了指針接收者,那么其他的方法也應(yīng)該使用指針接收者籽御。

func (p *Person) SetAge(newAge int8) {
        p.age = newAge
    }

值類(lèi)型接收者
修改操作只是針對(duì)副本练慕,無(wú)法修改接收者變量本身惰匙。

func (p Person) SetAge2(newAge int8) {
    p.age = newAge
}

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

//Address 地址結(jié)構(gòu)體
type Address struct {
    Province string
    City     string
}

//User 用戶(hù)結(jié)構(gòu)體
type User struct {
    Name    string
    Gender  string
    Address Address
}

原文 馬魯南的個(gè)人博客

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市铃将,隨后出現(xiàn)的幾起案子项鬼,更是在濱河造成了極大的恐慌,老刑警劉巖劲阎,帶你破解...
    沈念sama閱讀 219,539評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件绘盟,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡哪工,警方通過(guò)查閱死者的電腦和手機(jī)奥此,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)雁比,“玉大人稚虎,你說(shuō)我怎么就攤上這事≠松樱” “怎么了蠢终?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,871評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)茴她。 經(jīng)常有香客問(wèn)我寻拂,道長(zhǎng),這世上最難降的妖魔是什么丈牢? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,963評(píng)論 1 295
  • 正文 為了忘掉前任祭钉,我火速辦了婚禮,結(jié)果婚禮上己沛,老公的妹妹穿的比我還像新娘慌核。我一直安慰自己,他們只是感情好申尼,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評(píng)論 6 393
  • 文/花漫 我一把揭開(kāi)白布垮卓。 她就那樣靜靜地躺著,像睡著了一般师幕。 火紅的嫁衣襯著肌膚如雪粟按。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,763評(píng)論 1 307
  • 那天霹粥,我揣著相機(jī)與錄音灭将,去河邊找鬼。 笑死后控,一個(gè)胖子當(dāng)著我的面吹牛宗侦,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播忆蚀,決...
    沈念sama閱讀 40,468評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼矾利,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼姑裂!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起男旗,我...
    開(kāi)封第一講書(shū)人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤舶斧,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后察皇,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體茴厉,經(jīng)...
    沈念sama閱讀 45,850評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評(píng)論 3 338
  • 正文 我和宋清朗相戀三年什荣,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了矾缓。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,144評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡稻爬,死狀恐怖嗜闻,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情桅锄,我是刑警寧澤琉雳,帶...
    沈念sama閱讀 35,823評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站友瘤,受9級(jí)特大地震影響翠肘,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜辫秧,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評(píng)論 3 331
  • 文/蒙蒙 一束倍、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧盟戏,春花似錦绪妹、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,026評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)格嘁。三九已至笛求,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間糕簿,已是汗流浹背探入。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,150評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留懂诗,地道東北人蜂嗽。 一個(gè)月前我還...
    沈念sama閱讀 48,415評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像殃恒,于是被迫代替她去往敵國(guó)和親植旧。 傳聞我的和親對(duì)象是個(gè)殘疾皇子辱揭,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評(píng)論 2 355

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