作為一個5年的phper,這兩年公司和個人都在順應技術趨勢,新項目慢慢從php轉向了go語言,從2021年到現在,筆者手上也先后開發了兩個go項目。在學習go語言的過程中也學習并總結了一些相關的東西,這篇文章就分享下自己踩過的一些坑吧。
1、函數的寫法
問題:
func main() { fmt.Println("php是世界上最好的語言") }
解決:
如上所示,這種函數的定義寫法,在go語言中是錯誤的,就是 "{" 必須得和函數名在同一行。當然,這種錯誤在編輯器檢測語法的時候就會暴露出來了,正確寫法應該如下所示:
func main() { fmt.Println("php是世界上最好的語言") }
2、map定義和初始化
問題:
func main() { var m map[string]string m["php"] = "世界上最好的語言" m["go"] = "世界上最好的語言" fmt.Println(m) }
解決:
如上所示,這種定義了map,然后直接使用的方式是錯誤的,會拋出一個panic。少了一個重要的步驟,必須使用make()函數去給map分配內存空間,才能使用。這個對于phper來說,剛開始可能會經常忘掉。正確使用方式如下:
func main() { m := make(map[string]string, 2) m["php"] = "世界上最好的語言" m["go"] = "世界上最好的語言" fmt.Println(m) }
3、json格式轉換
問題:
type Student struct { id int name string score int } func main() { s := Student{1, "小明", 99} jsonS, _ := json.Marshal(s) fmt.Println(string(jsonS)) }
解決:
在做web開發過程中,基本上每天都要和json格式數據打交道,所以學會轉換成json格式的數據是必備技能啊。但上面的寫法是錯誤的,打印出來的為空值。這是因為Student結構體中的元素都是小寫的,對外是不可訪問的,所以必須改成大寫的,才能對外輸出json格式的數據。正確寫法如下:
type Student struct { Id int Name string Score int } func main() { s := Student{1, "小明", 99} jsonS, _ := json.Marshal(s) fmt.Println(string(jsonS)) }
4、循環中處理業務問題
問題:
func main() { data := []int{1, 2, 3} for _, value := range data { value += 1 } fmt.Println(data) }
解決:
如上所示,我們本身是想對data里面的元素做加1操作的,但發現沒有成功。那是因為,我們循環所引用的變量是臨時變量,去修改的時候并不會改變數組中的原有結構。正確的做法應該是根據切片的索引去修改,其實就類似于php的foreach,改變數組中的值,也是需要根據索引去改的。如下所示:
func main() { data := []int{1, 2, 3} for key := range data { data[key] += 1 } fmt.Println(data) }
5、數組和切片的區別
問題:
func change(data [2]int) { data[0] = 4 } func main() { data := [2]int{1, 2} change(data) fmt.Println(data) }
解決:
如上所示,運行的結果是[1 2] ,而不是[4 2] 。原因是main方法中聲明的data是數組,而go語言中的參數傳遞是值傳遞,所以不會改變原有的數組值。如果需要實現上述效果,可以改用切片,因為切片本身不會存儲數據,他的底層數據會指向一個底層數組,因此在修改切片的元素時,會修改底層數組的相應元素,同時共享同一個底層數組的切片也會相應修改。正確做法如下所示:
func change(data []int) { data[0] = 4 } func main() { data := []int{1, 2} change(data) fmt.Println(data) }
6、:= 聲明和初始化變量
問題:
func main() { flag := 1 if true { flag := 2 flag++ } fmt.Println(flag) }
解決:
如上所示,運行結果仍然是1,而不是2或者3。上述代碼中,flag := 2,又重新聲明了一個變量flag,但它作用的僅僅是if 判斷邏輯里面的,并沒有作用到整個main函數全局中。如果要正確影響,應將 := 改為 =,如下所示,結果則為3:
func main() { flag := 1 if true { flag = 2 flag++ } fmt.Println(flag) }
總結:以上,就是本人在實際開發中,結合自己所學,遇到的一些比較常見的坑點了。當然,也是比較基礎的一些點。后面,我也會繼續深入學習go,總結更多的經驗!
一個人可以被毀滅,但不可以被打敗。
-
函數
+關注
關注
3文章
4346瀏覽量
62971 -
go語言
+關注
關注
1文章
158瀏覽量
9089
原文標題:go新手常踩的坑
文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論