[Go] Go 語言學習筆記- 語法| CK's Notepad

文章推薦指數: 80 %
投票人數:10人

Go 這語言出來也好一段時間了,由於本身後端都是用C# 在開發,一直都沒有很大的動機學習另外一個後端語言。

趁著這次GDG 台中12 月份的大活動,來學習 ... Go這語言出來也好一段時間了,由於本身後端都是用C#在開發,一直都沒有很大的動機學習另外一個後端語言。

趁著這次GDG台中12月份的大活動,來學習一波Go吧 歷史 Go是由Google和眾多的貢獻者一起發展的開源專案(BSD-style授權) 安裝 依官網的安裝文件安裝,基本上是沒有問題的。

編輯器的部分可以使用VSCode+Go的擴充套建,或是使用JetBrainsGoLand編輯器(商用) HelloWorld 第一個Go的程式 12345678//hello-world.gopackagemainimport"fmt"funcmain(){ fmt.Println("Hello,world")} 透過下指令的方式就可以執行Go檔案,gorunhello.world.go 要將Go建置成可以跑執行檔,執行gobuildhello.world.go之後,就可以執行./hello-word 如果要將Go打包成全域可使用的話,可透過goinstall的語法,但要使用這個前置條件是GOBIN的環境變數要設定,windows就加入一個環境參數GOBIN並設定一個資料夾即可 基本語法 packages go世界裡,每一個go檔案都會歸屬到一個packages裡面,就拿上面的hello-world來看 12packagemain.... 要使用其他package就需要透過import 1234import("fmt""math") 當package被import時,就可以使用該package內第一個為大寫的functions。

換句話說,如果functions的名稱第一個是小寫的,就不會被export出去 上圖為使用小寫functions時會出現的錯誤訊息,當改使用大寫的functions,則會是這個結果 functions Go的functions也是要定型別的,只是定型別的順序跟常見的C#等語言不太一樣 123funcadd(xint,yint)int{ returnx+y} 型別都定義在後方,當連續的參數都是同一型別時,也可以這樣寫 123funcadd(x,yint)int{returnx+y} Go另外一個比較特別的地方就是function允許回傳多個值 12345678funcswap(x,ystring)(string,string){returnx,y}funcmain(){a,b:=swap("hello","world")//a=world,b=hello} 換另外一種命名方式回傳(但不太建議這樣子使用) 12345funcsplit(sumint)(x,yint){ x=sum*4/9 y=sum-x return} variables 可愛的var又來了 123456789packagemainimport"fmt"varc,python,javaboolfuncmain(){ variint fmt.Println(i,c,python,java)} 設定預設值的方式,就在後面一順序給要的預設值就可以了,Go會依預設值自行推斷型別 1varc,python,java=true,false,"no!" 另外一種簡化的宣告方式,使用:= 123456789101112//原本的做法funcmain(){ varresultint result=add(1,2) fmt.Println(result)}//使用:=語法糖funcmain(){ result:=add(1,2) fmt.Println(result)} basictypes bool string intint8int16int32int64 uintuint8uint16uint32uint64uintptr byte//aliasforuint8 rune//aliasforint32,representsaUnicodecodepoint float32float64 complex64complex128 defaultValue 各型別如果沒有給予設值的系統預設值為 string=>「」 bool=>false 數字型=>0 如果要轉型的話,可以這樣子操作T(v)會將valuev轉換成T型別 123variint=42varffloat64=float64(i)varuuint=uint(f) consts 使用const宣告常數值,常數值不能使用:=宣告 1constPi=3.14 流程控制 for for迴圈的基本起手式,不需要小括弧,但大括弧是必要的 12345678funcmain(){ sum:=0 fori:=0;i<10;i++{ sum+=i } fmt.Println(sum)} go版本的while,仍是用for表示 12345sum:=1 forsum<1000{ sum+=sum } fmt.Println(sum) 永不停止的寫法,還是用for 123for{...} if 條件判斷應該是最基本的,只是不需要小括弧,但大括弧是必要的 123ifx<0{ returnsqrt(-x)+"i"} 更懶惰但要習慣的寫法是,在if內做變數指定 123456funcpow(x,n,limfloat64)float64{ ifv:=math.Pow(x,n);v10: fmt.Println("value大於10") casev==10: fmt.Println("value等於10") default: fmt.Println("value小於10") }} 12345678910funcmyswitch(vint){ switch{ casev==10: fallthrough casev>10: fmt.Println("數字大於等於10") default: fmt.Println("其他數值") }} fallthrough:執行完此case後,繼續往下走switchcase判斷 12345678910funcmyswitch(vint){ switchv{ case0,1,2,3,4,5: fmt.Println("介於0~5之間") case6,7,8,9,10: fmt.Println("介於6~10之間") default: fmt.Println("其他數值") }} defer defer會等到周圍的function都執行完成後,再執行 12345678910packagemainimport"fmt"funcmain(){ deferfmt.Println("world") fmt.Println("hello")//helloworld} 既然defer會hold住function,那當好幾個defer時,又會怎麼執行呢 1234567891011121314packagemainimport"fmt"funcmain(){ fmt.Println("counting") fori:=0;i<10;i++{ deferfmt.Println(i) } fmt.Println("done")} 輸出結果為 所以defer所堆疊起來的functions,會採後進先出的方式執行,可以讀此文章了解更多 參考資料 ATourofGo-Packages,variables,andfunctions ATourofGo-Flowcontrol… 文章目錄 本站概要 1.歷史2.安裝3.HelloWorld4.基本語法4.1.packages4.2.functions4.3.variables4.4.basictypes4.4.1.defaultValue4.4.2.consts5.流程控制5.1.for5.2.if5.3.switch5.4.defer6.參考資料 KevinYang 319 文章 39 分類 69 標籤 GitHub Twitter FBPage TheWillWillWeb|Will保哥 全端開發人員天梯 POYCHANG|TrialandError JeffsWebTechNote 廣告 0%



請為這篇文章評分?