Golang開(kāi)發(fā)新手常犯的錯(cuò)誤

初級(jí)

1、不允許左大括號(hào)單獨(dú)一行

2、不允許出現(xiàn)未使用的變量

3、不允許出現(xiàn)未使用的import

解決方法:使用_作為引入包別名

package main

import (  
    _ "fmt"         // 指定別名為`_`
    "log"
    "time"
)

var _ = log.Println // 變量名為`_`

func main() {  
    _ = time.Now
}

4秀仲、短的變量聲明(Short Variable Declarations)只能在函數(shù)內(nèi)部使用

package main

// myvar := 1   // error
var myvar = 1   // ok

func main() {  
}

5、不能使用短變量聲明(Short Variable Declarations)重復(fù)聲明

6壶笼、不能使用短變量聲明(Short Variable Declarations)這種方式來(lái)設(shè)置字段值

package main

func main() {  
    one := 0
    // one := 1                   //error: Redeclaring Variables Using Short Variable Declarations
    // data.result, err := work() //error:Can't Use Short Variable Declarations to Set Field Values
    data.result, err = work()     //ok
}

8神僵、不能使用nil初始化一個(gè)未指定類型的變量

// var x = nil                 //error
var x interface{} = nil  // OK
_ = x

9、不能直接使用nil值的Slice和Map

10覆劈、map使用make分配內(nèi)存時(shí)可指定capicity保礼,但是不能對(duì)map使用cap函數(shù)

11沛励、字符串不允許使用nil值
在golang中,nil只能賦值給指針炮障、channel目派、func、interface胁赢、map或slice類型的變量企蹭。

var x string = nil  //error
if x == nil {       //error
    x = "default"
}

//var x string      //defaults to "" (zero value)
if x == "" {
    x = "default"
}

12、數(shù)組用于函數(shù)傳參時(shí)是值復(fù)制

注意:方法或函數(shù)調(diào)用時(shí)智末,傳入?yún)?shù)都是值復(fù)制(跟賦值一致)谅摄,除非是map、slice系馆、channel送漠、指針類型這些特殊類型是引用傳遞。

x := [3]int{1,2,3}

// 數(shù)組在函數(shù)中傳參是值復(fù)制
func(arr [3]int) {
    arr[0] = 7
    fmt.Println(arr) //prints [7 2 3]
}(x)
fmt.Println(x)       //prints [1 2 3] (not ok if you need [7 2 3])

// 使用數(shù)組指針實(shí)現(xiàn)引用傳參
func(arr *[3]int) {
    (*arr)[0] = 7
    fmt.Println(arr) //prints &[7 2 3]
}(&x)
fmt.Println(x)       //prints [7 2 3]

13由蘑、range關(guān)鍵字返回是鍵值對(duì)闽寡,而不是值

x := []string{"a","b","c"}

// for v := range x {
//     fmt.Println(v) //prints 0, 1, 2
// }

for _, v := range x {
    fmt.Println(v) //prints a, b, c
}

14、Slice和Array是一維的

Go表面上看起來(lái)像多維的尼酿,實(shí)際上只是一維的爷狈。但可以使用原始的一維數(shù)組、一維的切片來(lái)實(shí)現(xiàn)多維裳擎。

15淆院、從不存在key的map中取值時(shí),返回的總是”0值”

x := map[string] string {"one":"1", "two":"2"}
if _,ok := x["two"]; !ok { // 判斷是否存在句惯,x[key]始終有返回值

}

16、字符串是不可變

x := "text"
// x[0] = 'T'       // error

xtytes := []byte(x) 
xbytes[0] = 'T'     // ok

fmt.Println(string(xbytes)) //prints Text

17支救、字符串與[]byte之間的轉(zhuǎn)換是復(fù)制(有內(nèi)存損耗)抢野,可以用map[string] []byte建立字符串與[]byte之間映射,也可range來(lái)避免內(nèi)存分配來(lái)提高性能

//[]byte: 
for i,v := range []byte(str) {
}

21各墨、在Slice指孤、Array、Map的多行書寫最后的逗號(hào)不可省略

x := []int{
    1,
    // 2    //error
    3,      // ok
}

y := []int {1, 2, 3,}   // ok
z := []int {1, 2, 3}    // 單行書寫贬堵,最后一個(gè)元素的逗號(hào)可省略

24恃轩、使用for range迭代map時(shí)每次迭代的順序可能不一樣,因?yàn)閙ap的迭代是隨機(jī)的黎做。

25叉跛、switch的case默認(rèn)匹配規(guī)則不同于其它語(yǔ)言的是,匹配case條件后默認(rèn)退出蒸殿,除非使用fallthrough繼續(xù)匹配筷厘;而其它語(yǔ)言是默認(rèn)繼續(xù)匹配鸣峭,除非使用break退出匹配。

31酥艳、對(duì)于無(wú)緩存區(qū)的channel摊溶,寫入channel的goroutine會(huì)阻塞直到被讀取,讀取channel的goroutine會(huì)阻塞直到有數(shù)據(jù)寫入充石。

32莫换、從一個(gè)closed狀態(tài)的channel讀取數(shù)據(jù)是安全的,可通過(guò)返回狀態(tài)(第二個(gè)返回參數(shù))判斷是否關(guān)閉骤铃;而向一個(gè)closed狀態(tài)的channel寫數(shù)據(jù)會(huì)導(dǎo)致panic拉岁。

33、向一個(gè)nil值(未用make分配空間)的channel發(fā)送或讀取數(shù)據(jù)劲厌,會(huì)導(dǎo)致永遠(yuǎn)阻塞膛薛。

package main

import (  
    "fmt"
    "time"
)

func main() {  
    var ch chan int
    for i := 0; i < 3; i++ {
        go func(idx int) {
            ch <- (idx + 1) * 2
        }(i)
    }

    //get first result
    fmt.Println("result:",<-ch)
    //do other work
    time.Sleep(2 * time.Second)
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市补鼻,隨后出現(xiàn)的幾起案子哄啄,更是在濱河造成了極大的恐慌,老刑警劉巖风范,帶你破解...
    沈念sama閱讀 217,734評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件咨跌,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡硼婿,警方通過(guò)查閱死者的電腦和手機(jī)锌半,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)寇漫,“玉大人刊殉,你說(shuō)我怎么就攤上這事≈莞欤” “怎么了记焊?”我有些...
    開(kāi)封第一講書人閱讀 164,133評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)栓撞。 經(jīng)常有香客問(wèn)我遍膜,道長(zhǎng),這世上最難降的妖魔是什么瓤湘? 我笑而不...
    開(kāi)封第一講書人閱讀 58,532評(píng)論 1 293
  • 正文 為了忘掉前任瓢颅,我火速辦了婚禮,結(jié)果婚禮上弛说,老公的妹妹穿的比我還像新娘挽懦。我一直安慰自己,他們只是感情好木人,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布巾兆。 她就那樣靜靜地躺著猎物,像睡著了一般。 火紅的嫁衣襯著肌膚如雪角塑。 梳的紋絲不亂的頭發(fā)上蔫磨,一...
    開(kāi)封第一講書人閱讀 51,462評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音圃伶,去河邊找鬼堤如。 笑死,一個(gè)胖子當(dāng)著我的面吹牛窒朋,可吹牛的內(nèi)容都是我干的搀罢。 我是一名探鬼主播,決...
    沈念sama閱讀 40,262評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼侥猩,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼榔至!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起欺劳,我...
    開(kāi)封第一講書人閱讀 39,153評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤唧取,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后划提,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體枫弟,經(jīng)...
    沈念sama閱讀 45,587評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評(píng)論 3 336
  • 正文 我和宋清朗相戀三年鹏往,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了淡诗。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,919評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡伊履,死狀恐怖韩容,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情唐瀑,我是刑警寧澤宙攻,帶...
    沈念sama閱讀 35,635評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站介褥,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏递惋。R本人自食惡果不足惜柔滔,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望萍虽。 院中可真熱鬧睛廊,春花似錦、人聲如沸杉编。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,855評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至嘶朱,卻和暖如春蛾坯,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背疏遏。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,983評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工脉课, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人财异。 一個(gè)月前我還...
    沈念sama閱讀 48,048評(píng)論 3 370
  • 正文 我出身青樓倘零,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親戳寸。 傳聞我的和親對(duì)象是個(gè)殘疾皇子呈驶,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評(píng)論 2 354

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