作為一個5年的phper,這兩年公司和個人都在順應(yīng)技術(shù)趨勢,新項(xiàng)目慢慢從php轉(zhuǎn)向了go語言,從2021年到現(xiàn)在,筆者手上也先后開發(fā)了兩個go項(xiàng)目。在學(xué)習(xí)go語言的過程中也學(xué)習(xí)并總結(jié)了一些相關(guān)的東西,這篇文章就分享下自己踩過的一些坑吧。
1、函數(shù)的寫法
問題:
func main()
{
fmt.Println("php是世界上最好的語言")
}
解決:
如上所示,這種函數(shù)的定義寫法,在go語言中是錯誤的,就是 "{" 必須得和函數(shù)名在同一行。當(dāng)然,這種錯誤在編輯器檢測語法的時候就會暴露出來了,正確寫法應(yīng)該如下所示:
func main() {
fmt.Println("php是世界上最好的語言")
}
2、map定義和初始化
問題:
func main() {
var m map[string]string
m["php"] = "世界上最好的語言"
m["go"] = "世界上最好的語言"
fmt.Println(m)
}
解決:
如上所示,這種定義了map,然后直接使用的方式是錯誤的,會拋出一個panic。少了一個重要的步驟,必須使用make()函數(shù)去給map分配內(nèi)存空間,才能使用。這個對于phper來說,剛開始可能會經(jīng)常忘掉。正確使用方式如下:
func main() {
m := make(map[string]string, 2)
m["php"] = "世界上最好的語言"
m["go"] = "世界上最好的語言"
fmt.Println(m)
}
3、json格式轉(zhuǎn)換
問題:
type Student struct {
id int
name string
score int
}
func main() {
s := Student{1, "小明", 99}
jsonS, _ := json.Marshal(s)
fmt.Println(string(jsonS))
}
解決:
在做web開發(fā)過程中,基本上每天都要和json格式數(shù)據(jù)打交道,所以學(xué)會轉(zhuǎn)換成json格式的數(shù)據(jù)是必備技能啊。但上面的寫法是錯誤的,打印出來的為空值。這是因?yàn)镾tudent結(jié)構(gòu)體中的元素都是小寫的,對外是不可訪問的,所以必須改成大寫的,才能對外輸出json格式的數(shù)據(jù)。正確寫法如下:
type Student struct {
Id int
Name string
Score int
}
func main() {
s := Student{1, "小明", 99}
jsonS, _ := json.Marshal(s)
fmt.Println(string(jsonS))
}
4、循環(huán)中處理業(yè)務(wù)問題
問題:
func main() {
data := []int{1, 2, 3}
for _, value := range data {
value += 1
}
fmt.Println(data)
}
解決:
如上所示,我們本身是想對data里面的元素做加1操作的,但發(fā)現(xiàn)沒有成功。那是因?yàn)椋覀冄h(huán)所引用的變量是臨時變量,去修改的時候并不會改變數(shù)組中的原有結(jié)構(gòu)。正確的做法應(yīng)該是根據(jù)切片的索引去修改,其實(shí)就類似于php的foreach,改變數(shù)組中的值,也是需要根據(jù)索引去改的。如下所示:
func main() {
data := []int{1, 2, 3}
for key := range data {
data[key] += 1
}
fmt.Println(data)
}
5、數(shù)組和切片的區(qū)別
問題:
func change(data [2]int) {
data[0] = 4
}
func main() {
data := [2]int{1, 2}
change(data)
fmt.Println(data)
}
解決:
如上所示,運(yùn)行的結(jié)果是[1 2] ,而不是[4 2] 。原因是main方法中聲明的data是數(shù)組,而go語言中的參數(shù)傳遞是值傳遞,所以不會改變原有的數(shù)組值。如果需要實(shí)現(xiàn)上述效果,可以改用切片,因?yàn)榍衅旧聿粫鎯?shù)據(jù),他的底層數(shù)據(jù)會指向一個底層數(shù)組,因此在修改切片的元素時,會修改底層數(shù)組的相應(yīng)元素,同時共享同一個底層數(shù)組的切片也會相應(yīng)修改。正確做法如下所示:
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)
}
解決:
如上所示,運(yùn)行結(jié)果仍然是1,而不是2或者3。上述代碼中,flag := 2,又重新聲明了一個變量flag,但它作用的僅僅是if 判斷邏輯里面的,并沒有作用到整個main函數(shù)全局中。如果要正確影響,應(yīng)將 := 改為 =,如下所示,結(jié)果則為3:
func main() {
flag := 1
if true {
flag = 2
flag++
}
fmt.Println(flag)
}
總結(jié):以上,就是本人在實(shí)際開發(fā)中,結(jié)合自己所學(xué),遇到的一些比較常見的坑點(diǎn)了。當(dāng)然,也是比較基礎(chǔ)的一些點(diǎn)。后面,我也會繼續(xù)深入學(xué)習(xí)go,總結(jié)更多的經(jīng)驗(yàn)!
一個人可以被毀滅,但不可以被打敗。
-
函數(shù)
+關(guān)注
關(guān)注
3文章
4417瀏覽量
67499 -
go語言
+關(guān)注
關(guān)注
1文章
159瀏覽量
9778
原文標(biāo)題:go新手常踩的坑
文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
從踩坑到高效落地:關(guān)鍵詞搜索淘寶天貓商品列表 API 的實(shí)操心得
頻率源/信號源模塊設(shè)備怎么選?避坑指南
塑料激光焊接機(jī)怎么選?看完這篇不踩坑
Docker容器化部署完全指南
K8s生產(chǎn)環(huán)境10大踩坑記錄復(fù)盤
記ESP32CAM踩坑解決指南,已反映商家
RK3576+Android15+Linux6.1調(diào)試EM05 4G模塊全記錄:從底層到上層的踩坑與破局
智能工廠改造踩坑?有人物聯(lián)網(wǎng)手把手教你挑對系統(tǒng)
工業(yè)電子EMC整改:工業(yè)場景下90%工程師踩過的雷區(qū)
STM32 5 個容易踩坑的外設(shè)使用技巧
JLink、RV Debugger及串口下載使用體驗(yàn)和踩坑
UWB自動跟隨技術(shù)原理、算法融合優(yōu)化和踩坑實(shí)錄
PLC工業(yè)智能網(wǎng)關(guān):功能解析、場景落地與選型避坑攻略
使用Word/Excel管理需求的10個痛點(diǎn)及解決方案Perforce ALM
在學(xué)習(xí)go語言的過程踩過的坑
評論