這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
運行:go run xxx.go
編譯:go build xxx.go 產生可執行檔
程式開始:package main
引入包:import “fmt” 或者 import (
“fmt"
“os"
)
注意:Println不支援,Printf才支援%式的輸出
變數和常量:
在函數外聲明變數用:var a 或者 var (
a int
b str = “hi"
)
在函數裡用: := 聲明,如 t := 10
註:在go裡,聲明變數可以不宣告類型,可以通過值來自動推斷
常量定義 : 用const關鍵字 const s string = “hi” 或者 const(
s string = “hi"
pi float32 = 3.1415926
)
數組:
var a [5]int 定義長度為5的值為int類型的數組
var b [3]int{1, 2, 3}定義長度為3,值為int類型的1,2,3 結果為 =》[1, 2, 3]
用len()方法返回數組的長度
數組切片操作:
var a [5]int
或者 a := [5]int{0,1,2,3,4}
a[2:4]從2到4,不包括4
a[:4]從0到4,不包括4
a[2:]從2到最後包括2
條件陳述式:
if len(a) == 5 { …. } else { …. } switch a { case a[0] >0 : …. case a[2] == 2 : …. default: …. }
注意go語言中switch語句沒有break,因為go裡的casa不會下穿
迴圈語句:
for i := 0; i < 5; i++ {} range關鍵字迴圈數組,map等 i := [3]int{2, 3, 4} for a, v := range i { fmt.Println(a) fmt.Println(v) } 死迴圈: for {}
map
package mainimport"fmt" func main(){ m := make(map[string]int) //使用make建立一個空的map m["one"] = 1 m["two"] = 2 m["three"] = 3 fmt.Println(m) //輸出 map[three:3 two:2 one:1] (順序在運行時可能不一樣) fmt.Println(len(m)) //輸出 3 v := m["two"] //從map裡取值 fmt.Println(v) // 輸出 2 delete(m, "two") fmt.Println(m) //輸出 map[three:3 one:1] m1 := map[string]int{"one": 1, "two": 2, "three": 3} fmt.Println(m1) //輸出 map[two:2 three:3 one:1] (順序在運行時可能不一樣) for key, val := range m1{ fmt.Printf("%s => %d \n", key, val) /*輸出:(順序在運行時可能不一樣) three => 3 one => 1 two => 2*/ }}
指標
var i int= 1var pInt *int= &i//輸出:i=1 pInt=0xf8400371b0 *pInt=1fmt.Printf("i=%d\tpInt=%p\t*pInt=%d\n", i, pInt, *pInt) *pInt = 2//輸出:i=2 pInt=0xf8400371b0 *pInt=2fmt.Printf("i=%d\tpInt=%p\t*pInt=%d\n", i, pInt, *pInt) i = 3//輸出:i=3 pInt=0xf8400371b0 *pInt=3fmt.Printf("i=%d\tpInt=%p\t*pInt=%d\n", i, pInt, *pInt)
Go具有兩個分配記憶體的機制,分別是內建的函數new和make。他們所做的事不同,所應用到的類型也不同,這可能引起混淆,但規則卻很簡單。
記憶體配置
new 是一個分配記憶體的內建函數,但不同於其他語言中同名的new所作的工作,它只是將記憶體清零,而不是初始化記憶體。new(T)為一個類型為T的新項目分配了值為零的儲存空間並返回其地址,也就是一個類型為*T的值。用Go的術語來說,就是它返回了一個指向新分配的類型為T的零值的指標。
make(T, args)函數的目的與new(T)不同。它僅用於建立切片、map和chan(訊息管道),並傳回型別T(不是*T)的一個被初始化了的(不是零)執行個體。這種差別的出現是由於這三種類型實質上是對在使用前必須進行初始化的資料結構的引用。例如,切片是一個具有三項內容的描述符,包括指向資料(在一個數組內部)的指標、長度以及容量,在這三項內容被初始化之前,切片值為nil。對於切片、映射和通道,make初始化了其內部的資料結構並準備了將要使用的值。如:
下面的代碼分配了一個整型數組,長度為10,容量為100,並返回前10個數組的切片
make([]int, 10, 100)
以下樣本說明了new和make的不同。
varp *[]int = new([]int) // 為切片結構分配記憶體;*p == nil;很少使用varv []int = make([]int, 10) // 切片v現在是對一個新的有10個整數的數組的引用// 不必要地使問題複雜化:var p *[]int = new([]int)fmt.Println(p) //輸出:&[]*p = make([]int, 10, 10)fmt.Println(p) //輸出:&[0 0 0 0 0 0 0 0 0 0]fmt.Println((*p)[2]) //輸出: 0 // 習慣用法:v := make([]int, 10)fmt.Println(v) //輸出:[0 0 0 0 0 0 0 0 0 0]
以上內容是平凡公子本人的一些學習筆記和總結,感謝學習時所看到的各篇文章的作者!