1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        go新手常踩的坑

        共 2400字,需瀏覽 5分鐘

         ·

        2024-06-17 18:21

        作為一個(gè)5年的phper,這兩年公司和個(gè)人都在順應(yīng)技術(shù)趨勢(shì),新項(xiàng)目慢慢從php轉(zhuǎn)向了go語(yǔ)言,從2021年到現(xiàn)在,筆者手上也先后開發(fā)了兩個(gè)go項(xiàng)目。在學(xué)習(xí)go語(yǔ)言的過程中也學(xué)習(xí)并總結(jié)了一些相關(guān)的東西,這篇文章就分享下自己踩過的一些坑吧。

        1、函數(shù)的寫法

        問題:

        func main()
        {
        fmt.Println("php是世界上最好的語(yǔ)言")
        }

        解決:
        如上所示,這種函數(shù)的定義寫法,在go語(yǔ)言中是錯(cuò)誤的,就是 "{" 必須得和函數(shù)名在同一行。當(dāng)然,這種錯(cuò)誤在編輯器檢測(cè)語(yǔ)法的時(shí)候就會(huì)暴露出來了,正確寫法應(yīng)該如下所示:

        func main() {
        fmt.Println("php是世界上最好的語(yǔ)言")
        }

        2、map定義和初始化

        問題:

        func main() {
        var m map[string]string
        m["php"] = "世界上最好的語(yǔ)言"
        m["go"] = "世界上最好的語(yǔ)言"
        fmt.Println(m)
        }

        解決:
        如上所示,這種定義了map,然后直接使用的方式是錯(cuò)誤的,會(huì)拋出一個(gè)panic。少了一個(gè)重要的步驟,必須使用make()函數(shù)去給map分配內(nèi)存空間,才能使用。這個(gè)對(duì)于phper來說,剛開始可能會(huì)經(jīng)常忘掉。正確使用方式如下:

        func main() {
        m := make(map[string]string, 2)
        m["php"] = "世界上最好的語(yǔ)言"
        m["go"] = "世界上最好的語(yǔ)言"
        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é)會(huì)轉(zhuǎn)換成json格式的數(shù)據(jù)是必備技能啊。但上面的寫法是錯(cuò)誤的,打印出來的為空值。這是因?yàn)镾tudent結(jié)構(gòu)體中的元素都是小寫的,對(duì)外是不可訪問的,所以必須改成大寫的,才能對(duì)外輸出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)
        }

        解決:
        如上所示,我們本身是想對(duì)data里面的元素做加1操作的,但發(fā)現(xiàn)沒有成功。那是因?yàn)?,我們循環(huán)所引用的變量是臨時(shí)變量,去修改的時(shí)候并不會(huì)改變數(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語(yǔ)言中的參數(shù)傳遞是值傳遞,所以不會(huì)改變?cè)械臄?shù)組值。如果需要實(shí)現(xiàn)上述效果,可以改用切片,因?yàn)榍衅旧聿粫?huì)存儲(chǔ)數(shù)據(jù),他的底層數(shù)據(jù)會(huì)指向一個(gè)底層數(shù)組,因此在修改切片的元素時(shí),會(huì)修改底層數(shù)組的相應(yīng)元素,同時(shí)共享同一個(gè)底層數(shù)組的切片也會(huì)相應(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,又重新聲明了一個(gè)變量flag,但它作用的僅僅是if 判斷邏輯里面的,并沒有作用到整個(gè)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)。后面,我也會(huì)繼續(xù)深入學(xué)習(xí)go,總結(jié)更多的經(jīng)驗(yàn)!

        一個(gè)人可以被毀滅,但不可以被打敗。

        鏈接:https://www.cnblogs.com/lmz-blogs/p/16352023.html

        (版權(quán)歸原作者所有,侵刪)


        瀏覽 69
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            亚洲婷婷综合网 | 超污动态图| 少妇一区二区三区免费观看 | 中文字幕第二页在线 | 色综合天天色 | 麻豆成人精品 | 国产人妻| 做爱视频在线观看网站 | 做爱成人网站视频免费观看做爱 | 国产啊~cao死你个小sao货 |