這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
前言
最近一段時間接觸了下go語言,很有興趣,花時間研究了下,覺得可以學一學,然後就不多說了。Ubuntu下配置Go環境的可以參考下博文《Ubuntu 配置 Go 語言開發環境(Sublime Text+GoSublime)》,親測可用。
初識Golang
關於關鍵字、類型和變數:
1,Go在文法上類C,如果希望將兩個(或更多)語句放在一行書寫,必須用分號(“;”)隔開。一般情況下,不需要分號。
eg. for init; condition; post {...}
2, 定義一個變數,預設賦值為其類型null值。引入“
:=”符號在一步內完成聲明與賦值(只用於函數內,此情況下,變數類型由賦值內容自動推演)
3, 特殊變數_(底線),任何賦給它的值將被丟棄。
4,GO編譯器對聲明卻未使用的變數會報錯。
5, int/uint視硬體架構定義為32位或64位,另外有一套完整的類型:int8, int16, int32, int64 / byte(uint8別名), uint8, uint16, uint32, uint64 / float32, float64。各類型完全獨立,不能混合賦值,除非強轉。
6,常量是無類型的。iota關鍵字表示0,重複使用時,每次使用加1。Go使用其演繹枚舉類型。
eg. const (Monday = iotaTuesdayWednesday...SundaynumberOfDays // 該值為包內私人,不可為其他包訪問)
7,字串變數在Go一旦被賦值,字串就不能被修改,除非進行轉換。
eg. // 報錯var s string = "hello"s[0] = 'c' // 正確s := "hello"c := []rune(s) c[0] = 'c's2 := string(c)
8,rune是int32的別名,用UTF-8編碼。該類型在需要遍曆字串中的字元時,可以遍曆每個位元組(PS:使用US ASCII編碼字串時,位元組與字元等價,但Go中不存在ASCII編碼),為了擷取實際的字元,使用該類型。
9,在有傳回值的函數中,不允許將”最終的“retrun語句包含在if...else...中
eg. func example(x int) int { // 報錯: function ends without a return statementif x == 0 {return 1} else {return x}}
10,break除了跳出當前迴圈外,後面還可以接指定標籤,用標籤決定退出哪個迴圈。
eg. J: for j := 9; j < 5; j++ { for i := 9; i < 10; i++ { if i > 5 { break J } } }
11,range相當於迭代器,用於迴圈,從迴圈的內容中返回一個索引值對。
eg.list := []string{"a", "b", "c", "d", "d"}for k, v := range list {... // k為數組下標,v為元素內容}
12,switch後面運算式不必為常量或整數,也可以無運算式。無運算式時,相當於if-else if-else判斷。case匹配失敗不會自動向下嘗試,需要使用fallthrough關鍵字。
eg.switch i {case 0: // i為0時,執行func2()case 1:func1()default:func2()}switch i {case 0: fallthrough // i為0時,執行func1()case 1:func1()default:func2()}
練鰼水題
1,列印1至100數字。當3的倍數列印“Fizz”,5的倍數列印“Buzz”,同時是3,5的倍數列印“FizzBuzz”。
for i := 1; i <= 100; i++ {if (i % 3 == 0) && (i % 5 == 0) {fmt.Println("FizzBuzz")} else if i % 3 == 0 {fmt.Println("Fizz")} else if i % 5 == 0 {fmt.Println("Buzz")} else {fmt.Println(i)}}
2,列印內容“A”三角。
str := "A"for i := 0; i < 10; i++ {fmt.Printf("%s\n", str)str = str + "A"}
總結
在C基礎上轉Go感覺還比較順手。
學習資料
《Go語言編程》《學習Golang》