- 每個Go源碼檔案開頭都是package聲明,表示Go代碼所屬的包
- 要產生Go的可執行程式,需要定義一個main的包,同時建立main目錄
- 外部參數傳入用os模組的os.Args方法擷取,os.Args接收的參數下標從1開始
package mainimport ("fmt""os")func main(){fmt.Println("Hello Test")fmt.Println(os.Args[1])}
- 在函數返回時沒有被明確賦值的傳回值會被設定成預設值,例如float類型傳回值會被設定成0.0,error類型傳回值會被設定成為nil
- 6g和6l是64為版本的Go編譯器和連結器,32為版本的編譯器和連接器是8g和8l,gcc版本的編譯器是gccgo
6g helloworld.go6l helloworld.6./6.out輸出:Hello Test Test os.Args
- xxx_test.go是Go語言中單元測試的命名規則,設定好GOPATH,GOROOT環境變數後運行cmd
GOROOT:D:\goGOPATH: D:\WorkSpace01\GoPractisego test simplemath
- const用於定義常量,iota是一個比較特殊的關鍵字,在下一次常量出現時自動加1,下次以常量出現則重設為0
- 常量枚舉類型定義,小寫字母為包內可見
const (Sunday = iotaMondayTuesdayWednesdayThursdayFridaySaturdaynumberOfDays)
- Go語言中的類型
布爾類型:bool整型:int8 byte(uint8) int16 int uint uintptr浮點類型:float32 float64複數類型: complex64 complex128字串:string字元類型:rune fmt.Println([]rune("Hello")) 輸出為轉換成unicode的字元數組錯誤類型:error指標數組切片字典通道結構體介面
- int和int32之間不會做自動類型轉換,被Go語言定義為兩種類型,會發生異常,除非用強制類型轉換解決問題
- 不能用==來判斷浮點數之間是否相等,這樣會影響結果穩定性,建議下面方法
import "math" // p為使用者自訂的比較精度,比如0.00001 func IsEqual(f1, f2, p float64) bool { return math.Fdim(f1, f2) < p }
- Go語言目前只支援utf8和unicode兩種編碼格式
- map用法樣本
package mainimport ("fmt")type PersonInfo struct {Name stringAge intSex bool}func mapDecalre() {var personDB map[string] PersonInfopersonDB = make(map[string] PersonInfo)personDB["1"] = PersonInfo{"Lucy",20,true}personDB["2"] = PersonInfo{"Lily",21,true}personDB["3"] = PersonInfo{"Lilei",22,false}person,ok := personDB["1"]if ok {fmt.Println(person.Name == "Lucy")fmt.Println("OK")} else {fmt.Println("Fail")}}func main() {mapDecalre()}
- 條件陳述式的語句體必須用花括弧括起來,同時不允許將最終的return語句放到條件判斷中否則編譯報錯
func example(x int) int { if x == 0 { return 5 } else { return x } } 編譯報錯
- switch...case語句中switch後的條件陳述式可以不是必須的
switch { case 0 <= Num && Num <= 3: fmt.Printf("0-3") case 4 <= Num && Num <= 6: fmt.Printf("4-6") case 7 <= Num && Num <= 9: fmt.Printf("7-9") }
- 在switch...case中使用fallthrough來執行緊跟的case語句
switch i { case 0: fmt.Printf("0") case 1: fmt.Printf("1") case 2: fallthrough case 3: fmt.Printf("3") case 4, 5, 6: fmt.Printf("4, 5, 6") default: fmt.Printf("Default") } 運行上面的案例,將會得到如下結果: i = 0時,輸出0; i = 1時,輸出1; i = 2時,輸出3; i = 3時,輸出3; i = 4時,輸出4, 5, 6; i = 5時,輸出4, 5, 6; i = 6時,輸出4, 5, 6; i = 其他任意值時,輸出Default。
- switch同時支援類型判斷
func MyPrintf(args ...interface{}) {for _, arg := range args {switch arg.(type) {case int:fmt.Println(arg, "is an int value.")case string:fmt.Println(arg, "is a string value.")case int64:fmt.Println(arg, "is an int64 value.")default:fmt.Println(arg, "is an unknown type.")}}}
- goto和break語句
func gotoFunc() {i := 0HERE: fmt.Println("HERE") i ++ if i < 10 { goto HERE }}func breakFunc() {JLoop:for j := 0; j < 5; j ++ {for i := 0; i < 10; i ++ {if i > 5 {break JLoop}fmt.Println(i)}}}執行結果HEREHEREHEREHEREHEREHEREHEREHEREHEREHERE012345
- 小寫字母開頭的函數只在本包內可見,大寫字母開頭的函數才能被其他包使用。這個規則也適用於類型和變數的可見度。
- 不定參數傳遞
func myfunc(args ...int) { // 按原樣傳遞 myfunc3(args...) // 傳遞片段,實際上任意的int slice都可以傳進去 myfunc3(args[1:]...) }
- 任意型別參數傳遞可以使用interface{}
func Printf(format string, args ...interface{}) { // ... }
- 匿名函數調用
func(i int) {fmt.Println(i)}(1)
- 匿名函數調用
var j int = 5a := func()(func()) {var i int = 10fmt.Println(i)return func() {fmt.Println(j)}}() //看看去掉括弧會如何 a()不去括弧輸出 10 5去掉括弧輸出10去掉括弧這種情況是因為只拿到傳回值並沒有執行傳回值中的內容
- 一個函數中可以存在多個defer語句,因此需要注意的是,defer語句的調用是遵照先進後出的原則,即最後一個defer語句將最先被執行
- flag包是Go標準庫用來提供快速解析命令列參數的一個包
package mainimport ("flag""fmt")var infile *string = flag.String("i","infile","File contains values for sorting")var outfile *string = flag.String("o","outfile","File to receive sorted values")var algorithm *string = flag.String("a","qsort","Sort algorithm")func main() {flag.Parse()if infile != nil {fmt.Println("infile =", *infile, "outfile =", *outfile, "algorithm =", *algorithm)}}命令列參數:-i unsorted.dat -o sorted.dat -a bubblesort運行結果:infile = unsorted.dat outfile = sorted.dat algorithm = bubblesort如果去掉:flag.Parse()運行結果:infile = infile outfile = outfile algorithm = qsort
- fmt.Println(``)用於多行輸出