GO語言學習筆記(一)

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

  1. 每個Go源碼檔案開頭都是package聲明,表示Go代碼所屬的包
  2. 要產生Go的可執行程式,需要定義一個main的包,同時建立main目錄
  3. 外部參數傳入用os模組的os.Args方法擷取,os.Args接收的參數下標從1開始
    package mainimport ("fmt""os")func main(){fmt.Println("Hello Test")fmt.Println(os.Args[1])}
  4. 在函數返回時沒有被明確賦值的傳回值會被設定成預設值,例如float類型傳回值會被設定成0.0,error類型傳回值會被設定成為nil
  5. 6g和6l是64為版本的Go編譯器和連結器,32為版本的編譯器和連接器是8g和8l,gcc版本的編譯器是gccgo
    6g helloworld.go6l helloworld.6./6.out輸出:Hello Test      Test os.Args
  6. xxx_test.go是Go語言中單元測試的命名規則,設定好GOPATH,GOROOT環境變數後運行cmd
    GOROOT:D:\goGOPATH: D:\WorkSpace01\GoPractisego test simplemath
  7. const用於定義常量,iota是一個比較特殊的關鍵字,在下一次常量出現時自動加1,下次以常量出現則重設為0
  8. 常量枚舉類型定義,小寫字母為包內可見
    const (Sunday = iotaMondayTuesdayWednesdayThursdayFridaySaturdaynumberOfDays)
  9. Go語言中的類型
    布爾類型:bool整型:int8 byte(uint8) int16 int uint uintptr浮點類型:float32 float64複數類型: complex64 complex128字串:string字元類型:rune  fmt.Println([]rune("Hello")) 輸出為轉換成unicode的字元數組錯誤類型:error指標數組切片字典通道結構體介面
  10. int和int32之間不會做自動類型轉換,被Go語言定義為兩種類型,會發生異常,除非用強制類型轉換解決問題
  11. 不能用==來判斷浮點數之間是否相等,這樣會影響結果穩定性,建議下面方法
    import "math"  // p為使用者自訂的比較精度,比如0.00001 func IsEqual(f1, f2, p float64) bool {  return math.Fdim(f1, f2) < p } 
  12. Go語言目前只支援utf8和unicode兩種編碼格式
  13. 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()}
  14. 條件陳述式的語句體必須用花括弧括起來,同時不允許將最終的return語句放到條件判斷中否則編譯報錯
    func example(x int) int {  if x == 0 {  return 5  } else {  return x  } } 編譯報錯
  15. 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") } 
  16. 在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。
  17. 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.")}}}


  18. 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
  19. 小寫字母開頭的函數只在本包內可見,大寫字母開頭的函數才能被其他包使用。這個規則也適用於類型和變數的可見度。
  20. 不定參數傳遞
    func myfunc(args ...int) {   // 按原樣傳遞  myfunc3(args...)   // 傳遞片段,實際上任意的int slice都可以傳進去  myfunc3(args[1:]...) } 
  21. 任意型別參數傳遞可以使用interface{}
    func Printf(format string, args ...interface{}) {  // ... } 
  22. 匿名函數調用
    func(i int) {fmt.Println(i)}(1)
  23. 匿名函數調用
    var j int = 5a := func()(func()) {var i int = 10fmt.Println(i)return func() {fmt.Println(j)}}()  //看看去掉括弧會如何 a()不去括弧輸出 10 5去掉括弧輸出10去掉括弧這種情況是因為只拿到傳回值並沒有執行傳回值中的內容
  24. 一個函數中可以存在多個defer語句,因此需要注意的是,defer語句的調用是遵照先進後出的原則,即最後一個defer語句將最先被執行
  25. 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
  26. fmt.Println(``)用於多行輸出

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.