聲明:本文為終端研發(fā)部原創(chuàng)痒玩,未經(jīng)允許不得轉(zhuǎn)載
最近想搞搞后臺(tái)開發(fā)淳附,話說注意力就轉(zhuǎn)移到了公司用的golang。用Go做微服務(wù)比較方便蠢古,或許是因?yàn)間olang強(qiáng)悍的語(yǔ)法吧奴曙,看到go的語(yǔ)法,自己已被深深的吸引草讶。
來我們一起感受下Go的風(fēng)騷式的代碼風(fēng)格洽糟。
1、魔鬼式變量聲明
2堕战、數(shù)組的聲明
array就是數(shù)組坤溃,它的定義方式如下:
var arr [n]type
在[n]type中,n表示數(shù)組的長(zhǎng)度嘱丢,type表示存儲(chǔ)元素的類型薪介。對(duì)數(shù)組的操作和其它語(yǔ)言類似,都是通過[]來進(jìn)行 讀取或賦值:
var arr [10]int // 聲明了一個(gè)int類型的數(shù)組
arr[0] = 42 // 數(shù)組下標(biāo)是從0開始的
arr[1] = 13 // 賦值操作
fmt.Printf("The first element is %d\n", arr[0]) // 獲取數(shù)據(jù)越驻,返回42
fmt.Printf("The last element is %d\n", arr[9]) //返回未賦值的最后一個(gè)元素汁政,默認(rèn)返回0
由于長(zhǎng)度也是數(shù)組類型的一部分,因此[3]int與[4]int是不同的類型缀旁,數(shù)組也就不能改變長(zhǎng)度记劈。數(shù)組之間的賦值是 值的賦值,即當(dāng)把一個(gè)數(shù)組作為參數(shù)傳入函數(shù)的時(shí)候并巍,傳入的其實(shí)是該數(shù)組的副本抠蚣,而不是它的指針。如果要使用指 針履澳,那么就需要用到后面介紹的slice類型了嘶窄。
數(shù)組可以使用另一種:=來聲明
a := [3]int{1, 2, 3} // 聲明了一個(gè)長(zhǎng)度為3的int數(shù)組
b := [10]int{1, 2, 3} // 聲明了一個(gè)長(zhǎng)度為10的int數(shù)組怀跛,其中前三個(gè)元素初始化為1、2柄冲、3吻谋,其它默認(rèn)為0
c := [...]int{4, 5, 6} // 可以省略長(zhǎng)度而采用`...`的方式,Go會(huì)自動(dòng)根據(jù)元素個(gè)數(shù)來計(jì)算長(zhǎng)度
3现横、 go語(yǔ)言強(qiáng)大的slice操作
golang 中的 slice 非常強(qiáng)大漓拾,讓數(shù)組操作非常方便高效。在開發(fā)中不定長(zhǎng)度表示的數(shù)組全部都是 slice 戒祠。但是很多同學(xué)對(duì) slice 的模糊認(rèn)識(shí)骇两,造成認(rèn)為golang中的數(shù)組是引用類型,結(jié)果就是在實(shí)際開發(fā)中碰到很多坑姜盈,以至于出現(xiàn)一些莫名奇妙的問題低千,數(shù)組中的數(shù)據(jù)丟失了
slice 的數(shù)據(jù)結(jié)構(gòu),它很簡(jiǎn)單馏颂,一個(gè)指向真實(shí) array 地址的指針 ptr 示血,slice 的長(zhǎng)度 len 和容量 cap 。
其中 len 和 cap 就是我們?cè)谡{(diào)用 len(slice) 和 cap(slice) 返回的值救拉。
我們來按照 slice 的數(shù)據(jù)結(jié)構(gòu)定義來解析出 ptr, len, cap
// 按照上圖定義的數(shù)據(jù)結(jié)構(gòu)
type Slice struct {
ptr unsafe.Pointer // Array pointer
len int // slice length
cap int // slice capacity
示例代碼
4难审、map的聲明
注意由于go語(yǔ)言是一個(gè)強(qiáng)類型的語(yǔ)言,因此hashmap也是有類型的亿絮,具體體現(xiàn)在key和value都必須指定類型告喊,比如聲明一個(gè)key為string,value也是string的map派昧,
需要這樣做
go語(yǔ)言中的枚舉
5黔姜、for循環(huán)的遍歷
func formapTest() {
var arrayi= [...] int{1, 2, 3, 4, 5, 6, 7, 78, 9, 10}
for index, c := range arrayi {
fmt.Printf("array[%d] = %d", index, c)
}
str := "go語(yǔ)言的學(xué)習(xí)和啪啪"
for i, ch := range str {
fmt.Println(i, ch) //ch的類型為rune unicode編碼
}
//輸出為:28907 (Unicode編碼時(shí),兩個(gè)字節(jié)代表一個(gè)字符)
n := len(str)
for i := 0; i < n; i++ {
ch := str[i] // 依據(jù)下標(biāo)取字符串中的字符斗锭,類型為byte
fmt.Println(i, ch)
//輸出為utf-8編碼地淀,一個(gè)漢字字符占三個(gè)字節(jié)
}
array := []rune(str)
n = len(array)
for i := 0; i < n; i++ {
ch := array[i] // 依據(jù)下標(biāo)取字符串中的字符,類型為byte
fmt.Println(i, ch) //unicode 編碼轉(zhuǎn)十進(jìn)制輸出
//golang中字符類型的實(shí)際數(shù)據(jù)類型為uint32,以for循環(huán)遍歷的方式輸出結(jié)果都是Unicode編碼的
}
//var str string= "yyh岖是,hello帮毁,卡卡論壇,好厲害哦"
//fmt.Print(str)
fmt.Print("\n================================\n")
for i , ch := range str{
//fmt.Printf("(%d, %c)",i,ch)
fmt.Printf("(%d, %x)",i,ch)
}
fmt.Print(utf8.RuneCountInString(str))
fmt.Print("================================\n")
bytes := [] byte(str)
//for len(bytes) > 0 {
r, size := utf8.DecodeRune(bytes)
fmt.Printf("%c %d",r,size)
//}
fmt.Println()
fmt.Println()
fmt.Println()
for i,c := range bytes{
r,_ :=utf8.DecodeRune(bytes)
fmt.Printf("%d %c %x \n",i,r,c)
}
for i ,ch := range []rune(str){
fmt.Printf("%d: %c ",i,ch)
}
str2 := "123 我按時(shí) 的發(fā)ad fg票 是否 adfg 發(fā) 發(fā)生a f發(fā) 的sj df"
sps := strings.Split(str2," ")
sps = strings.Fields(str2)
var isContact = strings.Contains(str2,"你們")
fmt.Println(sps)
fmt.Println(isContact)
}
6豺撑、 golang中的結(jié)構(gòu)體和繼承
7烈疚、 golang中的接口
8、 golang中的空interface
類似于java中的object聪轿,空interface(interface{})不包含任何的method爷肝,正因?yàn)槿绱耍械念愋投紝?shí)現(xiàn)了空interface〉婆祝空interface對(duì)于
描述起不到任何的作用(因?yàn)樗话魏蔚膍ethod)金赦,但是空interface在我們需要存儲(chǔ)任意類型的數(shù)值的時(shí)候相當(dāng)有用,因?yàn)樗梢源鎯?chǔ)任意類型的數(shù)值对嚼。它有點(diǎn)類似于C語(yǔ)言的void*類型夹抗。
一個(gè)函數(shù)把interface{}作為參數(shù),那么他可以接受任意類型的值作為參數(shù)纵竖,如果一個(gè)函數(shù)返回interface{},那么也
就可以返回任意類型的值漠烧。是不是很有用啊靡砌!
9已脓、結(jié)構(gòu)體中可以定義字段,但接口不行
structs與interfaces不能具有相同的API通殃,因?yàn)閕nterfaces無法定義字段度液。這個(gè)問題并算很大,因?yàn)榭梢栽诮涌谥卸xgetter和setter方法邓了,雖然這有點(diǎn)混亂恨诱。 eg:
10媳瞪、Public和Private命名
Golang將Python的public和private方法命名方案做了進(jìn)一步發(fā)展骗炉。當(dāng)我最初發(fā)現(xiàn)以大寫字母開頭的函數(shù)、結(jié)構(gòu)體是public蛇受,而小寫開頭的則是private的時(shí)候句葵, 感覺不可思議,但我很享受這種語(yǔ)法兢仰。
type PublicStructName struct {} //public 外部能調(diào)用
type privateStructName struct {} // 私有 結(jié)構(gòu)體乍丈,僅內(nèi)部函數(shù)能調(diào)用
最后
今天就先到這里,golang語(yǔ)法很多把将,這里只是其中的冰山一角轻专。如果大家想學(xué)習(xí)golang,我這里推薦:https://github.com/Unknwon/the-way-to-go_ZH_CN
閱讀更多
31道Android面試題 察蹲,牢固你的基礎(chǔ)请垛!
做后臺(tái)是選擇Java 、Go 洽议,還是 PHP?
AndroidUtils:Android開發(fā)不得不收藏的Utils
美團(tuán)面試題:Java-線程池 ThreadPool 專題詳解
相信自己宗收,沒有做不到的,只有想不到的
在這里獲得的不僅僅是技術(shù)亚兄!