那曲檬骨新材料有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

在學習go語言的過程踩過的坑

馬哥Linux運維 ? 來源:馬哥Linux運維 ? 2024-11-11 09:22 ? 次閱讀

作為一個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運維】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    手機喇叭氣密性檢測儀選購攻略,避免

    參差不齊,質量也良莠不齊。本文將為讀者提供一些選購氣密性檢測儀的攻略,幫助企業在選擇設備時避免。首先,明確檢測需求是選購氣密性檢測儀的前提。企業需要根據自身的生產規
    的頭像 發表于 02-05 17:04 ?49次閱讀
    手機喇叭氣密性檢測儀選購攻略,避免<b class='flag-5'>踩</b><b class='flag-5'>坑</b>!

    ADC高速采樣電路設計詳解之STM32

    一、過程 最近用STM32F334做數字電源,用到了高速ADC采集電壓電流。設計的參考電壓VREF為3.3V,輸入信號經運放跟隨后直接接入單片機的采樣通道。一開始測試一切正常,但隨著輸入信號
    的頭像 發表于 12-02 09:27 ?1221次閱讀
    ADC高速采樣電路設計詳解之STM32<b class='flag-5'>踩</b><b class='flag-5'>坑</b>

    go語言如何解決并發問題

    作為一個后端開發,日常工作中接觸最多的兩門語言就是PHP和GO了。無可否認,PHP確實是最好的語言(手動狗頭哈哈),寫起來真的很舒爽,沒有任何心智負擔,字符串和整型壓根就不用區分,開發速度真的是比
    的頭像 發表于 10-23 13:38 ?176次閱讀
    <b class='flag-5'>go</b><b class='flag-5'>語言</b>如何解決并發問題

    三十分鐘入門基礎Go Java小子版

    語法與 C 相近,但功能上有:內存安全,GC,結構形態及 CSP-style 并發計算。 適用范圍 本篇文章適用于學習其他面向對象語言(Java、Php),但沒有學過Go
    的頭像 發表于 08-12 14:32 ?786次閱讀
    三十分鐘入門基礎<b class='flag-5'>Go</b> Java小子版

    倉頡語言書籍申請

    有接觸其它的語言,主要是python,python用于機器學習,數據分析是能滿足使用,但是用于開發其他的東西就不能滿足了,我現在想學習另外一種語言
    發表于 08-06 08:37

    【《大語言模型應用指南》閱讀體驗】+ 基礎知識學習

    今天來學習語言模型在自然語言理解方面的原理以及問答回復實現。 主要是基于深度學習和自然語言處理技術。 大
    發表于 08-02 11:03

    【《大語言模型應用指南》閱讀體驗】+ 俯瞰全書

    的機會! 本人曾經也參與語音識別產品的開發,包括在線和離線識別,但僅是應用語言模型實現端側的應用開發,相當于調用模型的接口函數,實際對模型的設計、訓練和運行機理并不了解,我想通過學習《大語言
    發表于 07-21 13:35

    按照這樣學習C語言,成為卷王不是夢!

    一些學習C語言的建議,讓你在學習之路上更加游刃有余,成為C語言的高手。按照這樣學習C語言,成為卷
    的頭像 發表于 07-06 08:04 ?358次閱讀
    按照這樣<b class='flag-5'>學習</b>C<b class='flag-5'>語言</b>,成為卷王不是夢!

    M16連接器12芯采購如何避免

      德索工程師說道在M16連接器12芯的采購過程中,為了避免,確保采購的順利進行以及產品的高質量,我們可以從以下幾個方面進行考慮和規劃:
    的頭像 發表于 06-07 17:46 ?835次閱讀
    M16連接器12芯采購如何避免<b class='flag-5'>踩</b><b class='flag-5'>坑</b>

    語言模型:原理與工程時間+小白初識大語言模型

    開拓深度學習的思路。對于新涌現的大語言模型的能力,主要是表現在學習能力的提升、語言理解和生成能力、創新和探索的能力。 基礎技術 詞表示技術 詞表示一般分為三種,主要是詞的獨熱表示(On
    發表于 05-12 23:57

    家庭路由器如何選?實用技巧讓你不再

    家庭路由器選購需考慮需求、預算、性能指標、硬件配置、軟件功能、認證與測試及售后服務。明確需求,選擇適合的型號和品牌,確保網絡穩定、高速。遵循這些技巧,避免,享受網絡便利。
    的頭像 發表于 04-29 11:38 ?843次閱讀

    關于go中接口類型的表示方法

    go是一個靜態性語言,每個變量都有靜態的類型,因此每個變量在編譯階段中有明確的變量類型,比如像:int、float32、MyType。
    的頭像 發表于 04-28 10:13 ?410次閱讀

    痛苦“電池電壓偵測電路”,含淚總結設計要點

    和大家分享這個電路的設計要點,以及當時的設計失誤,幫助大家積累經驗,以后不要這種。 設計要點一:設定分壓電阻的大小 這種便攜式掌上閱讀器,當然是內置鋰電池的:
    的頭像 發表于 04-07 14:31 ?3986次閱讀
    痛苦<b class='flag-5'>踩</b><b class='flag-5'>坑</b>“電池電壓偵測電路”,含淚總結設計要點

    學習筆記|如何用Go程序采集溫濕度傳感器數據

    在共創社內部的交流中,先前有一位成員展示了如何借助C語言來實現對AHT20溫濕度傳感器數據的讀取。這一實例觸發了另一位共創官的靈感,他決定采納Go語言重新構建這一數據采集流程。接下來,我們將詳細解析
    的頭像 發表于 03-21 11:46 ?806次閱讀
    <b class='flag-5'>學習</b>筆記|如何用<b class='flag-5'>Go</b>程序采集溫濕度傳感器數據

    高低溫試驗箱選購指南—防秘籍

    選購高低溫試驗箱需要綜合考慮多方面因素。通過明確需求、選擇知名品牌、對比性能指標、權衡價格與性價比、保障售后服務以及參考用戶評價與案例等步驟,可以幫助您避免風險,選購到一款性價比高、適合自己需求的高低溫試驗箱。
    的頭像 發表于 02-24 09:22 ?638次閱讀
    高低溫試驗箱選購指南—防<b class='flag-5'>踩</b><b class='flag-5'>坑</b>秘籍
    墓地风水24山| 澳门百家乐哪家信誉最好| 3U百家乐官网游戏| 大发888怎么能不卡| 百家乐投注软件有用吗| 玩百家乐官网游戏的最高技巧| 六安市| 大发888娱乐场ylc8| 百家乐透明出千牌靴| 百家乐官网官网| 跪求百家乐官网打法| 百家乐官网免费试玩游戏| 皇冠现金投注网| 大发888娱乐场下载iypu| 百家乐稳赢投资法| 网络百家乐官网会作假吗| 百家乐官网庄闲几率| 足球竞猜| 大发888老虎机手机版下载安装| 唐人街百家乐的玩法技巧和规则| 免费百家乐游戏机| rmb百家乐官网的玩法技巧和规则| 新朝代百家乐官网开户网站| 百家乐官网佣金计算| E乐博网址| 亚洲顶级赌场手机版| 德州百家乐21点桌| 百家乐时时彩网站| 百家乐论坛白菜| 怎么赢百家乐官网的玩法技巧和规则 | 真人百家乐官网是骗局| 西和县| 金都国际娱乐| 大发888官方备用| 网络百家乐开户网| 百家乐衬衣| 百家乐明灯| 优博家百家乐娱乐城| 百家乐国际娱乐城| 百家乐注码论坛| 24风水|