這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
golang發現就很好玩。
很久沒有寫日誌了,繼續恢複吧。
// one project main.gopackage mainimport ("errors""fmt""math""os")func main() {/*Go語言基礎類型布爾類型:bool整型:int,int8,int16,int32,int64,uint,uint8,uint16,uint32,uint64,byte,uintptr (一般使用int和unit就好啦)浮點類型:float32,float64複數類型:complex64,complex128字串:string字元類型:rune錯誤類型:errorGo語言複合類型指標 pointer數組 array切片 siice字典 map通道 chan結構體 struct介面 interface*///聲明一個叫v1的int類型變數,預設值為0var v1 int//聲明的變數後就一定要使用(給這個變數賦值不算使用),不然編譯的時候就會報錯:.\main.go:7: v1 declared and not usedfmt.Println(v1) //0//在聲明一個變數的同時初始化var v2 int = 10 //最標準的方法var v3 = 10 //編譯器可以自動推匯出v3的類型v4 := 10 //使用了:=運算子 編譯器可以自動推匯出v4的類型 ,推薦使用這種簡潔明了的方式/*:=符號的左邊變數不可以被聲明過var i inti := 3會報錯:no new variables on left side of :=*///字串v5 := "大連"//數組v6 := [2]int{1, 2}//數組切片v7 := []int{0, 1, 2, 3}//結構體var v8 struct {one inttwo int}//給結構體兩個數賦值v8.one = 520v8.two = 1314//指標,擷取v1的地址var v9 *int = &v1//聲明key為string,value為int的mapvar v10 map[string]int//初始化mapv10 = make(map[string]int)v10["love"] = 1314v10["she"] = 1994//聲明一個函數,參數為一個int,返回為一個intvar v11 func(a int) int //輸出 <nil>//使用var關鍵詞連續定義多個變數var (v12 intv13 float32v14 float64)//使用多重賦值交換兩數i := 6j := 9i, j = j, ifmt.Println(i, j) //9 6//使用匿名變數忽略函數多重傳回值中的部分_, _, nickname := GetName() //_就為匿名變數fmt.Println("this nickname is", nickname) //this nickname is Moss/*字面量常量(literal),是指程式中硬式編碼常量,例如:1126,7.9,true,"xuan"*///定義常量,常量的右值要為字面量常量或者編譯期間預算的常量運算式const PI float64 = 3.14159265358979323846/*預定義常量GO語言預定義了這些常量:true,false,iotaiota是一個可被編譯器修改的常量,在每個const關鍵字出現時被重設為0,然後在下一個const出現之前,每出現一次iota,其所代表的數字會自動增加1*/const (v15 = iota //iota被重設為0v16 = iota // v16 = 1v17 = iota // v17 = 2)//如果兩個const的指派陳述式的運算式是一樣的,那麼可以省略後一個賦值運算式const (v18 = 1 + iotav19v20)//布爾類型不能接受其他類型的賦值,不能自動或者強制轉換,否則會報錯//bool test = "peixuan" //syntax error: unexpected name, expecting semicolon or newline or }//int和int32在Go語言裡面被認為是兩種語言,且不同類型的整型不能進行比較/*var v21 int32v22 := 2014 //v22被自動推斷為int類型v21 = v22 //cannot use v22 (type int) as type int32 in assignment*///複數var v21 complex64v21 = 3.2 + 12i //3.2實部 12虛部v22 := 3.3 + 13iv23 := complex(3.4, 14) //3.4 + 14ifmt.Println("實部:", real(v23), "虛部:", imag(v23))fmt.Println(v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23)//字串v24 := "peixuan,佩璿"v25 := v24[0]//v24[0] = 'A' //cannot assign to v24[0]fmt.Printf("%s:%c\n", v24, v25)//遍曆字串//以位元組數組遍曆l := len(v24)for i := 0; i < l; i++ {ch := v24[i]fmt.Println(i, ch)}//以Unicode字元遍曆//i 是index ,ch 是value。for i, ch := range v24 {fmt.Println(i, ch)}/*數組是實值型別,切片是參考型別*/v26 := [10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}for i, v := range v26 {fmt.Println(i, v)}//根據數組建立數組切片v27 := v26[:5] //前五個fmt.Println(v27) //[1 2 3 4 5]v28 := v26[5:] //從第五個開始到結束fmt.Println(v28) //[6 7 8 9 10]v29 := v26[3:7] //第三個到第七個fmt.Println(v29) //[4 5 6 7]v30 := v26[:] //所有數組fmt.Println(v30)//建立一個初始元素個數為5的數組切片,元素初始值為0,v31 := make([]int, 5)fmt.Println(v31)//建立一個初始元素個數為5的數組切片,元素初始值為0,並預留是個元素的儲存空間。v32 := make([]int, 5, 10)fmt.Println(v32)//直接建立並初始化包含5個元素的數組切片v33 := []int{1, 2, 3, 4, 5}fmt.Println(v33)//cap()函數可以擷取切片的儲存大小,len()可以擷取切片中的個數多少fmt.Println("cap() is ", cap(v32), "len() is ", len(v32))//切片增加元素v33 = append(v33, 11, 12, 13, 14)fmt.Println(v33)//切片增加數組v33 = append(v33, v32...) //v32...相當於把所有元素拆成單個後當做參數傳入fmt.Println(v33)//map//定義lover結構體type Lover struct {Name stringBirthDay string}//聲明map變數shevar she map[string]Lover//初始化sheshe = make(map[string]Lover)//往she中添加元素she["lpx"] = Lover{"liaopeixuan", "1994.11.26"}//從這個map中尋找zyxlover1, ok := she["zyx"]if ok {fmt.Println("you love is ", lover1.Name)} else {fmt.Println("zyx is not found!")}//尋找lpxlover2, ok := she["lpx"]if ok {fmt.Println("you love is ", lover2.Name)} else {fmt.Println("lpx is not found!")}//刪除鍵為"zyx"的索引值對,如果改鍵不存在則不會執行任何東西delete(she, "zyx")/*流程式控制制條件陳述式:if,else, else if選擇語句:switch, case, select迴圈語句:for range跳躍陳述式:goto*///條件陳述式if 3 > 6 {fmt.Println("3 > 6")} else if 2 > 6 {fmt.Println("2 > 6")} else {fmt.Println("else")}//選擇語句sw := 2switch sw {case 1:fmt.Println("case 1")case 2:fmt.Println("case 2")case 3:fallthroughcase 4:fmt.Println("case 4")default:fmt.Println("default")}/*case後面不需要像C語言一樣寫breeak防止一直向下執行,只有case中遇見fallthrough才會繼續向下執行當sw=1 case 1當sw=2 case 2當sw=3 case 4當sw=4 case 4當sw=5 defalut*///switch後面的運算式不是必須的switch {case 1 > 3:fmt.Println("1 > 3")case 1 < 3:fmt.Println("1 < 3")}//迴圈語句for i := 0; i < 10; i++ {fmt.Println(i)}//for無限迴圈count := 0for {count++if count < 100 {continue} else if count > 100 {fmt.Println("count is ", count)break}}JLoop:for i := 0; i < 10; i++ {fmt.Println("label i is ", i)for j := 0; j < 10; j++ {if j > 5 {//跳到外面去啦,但是不會再進來這個for迴圈了break JLoop}}}//跳躍陳述式 goto語句可以跳轉到本函數內的某個標籤gotoCount := 0GotoLabel:gotoCount++if gotoCount < 10 {goto GotoLabel //如果小於10的話就跳轉到GotoLabel}myfunc(999, 998, 997)anyfunc(1, "love", 3.6)//把匿名函數賦值給一個變數f := func(str string) {fmt.Println(str)}f("i love peixuan")//立刻執行匿名函數func(str string) {fmt.Println(str)}("i love peixuan right now") //()裡面的就是傳入的參數//函數閉包out := 100afunc := func() func() {in := 10return func() {fmt.Println("out is ", out, "in is ", in)}}()//panic("nothing")rec := recover()fmt.Println(rec)afunc()//fmt.Println(a.(type)) //use of .(type) outside type switch//cap 的增長模式 1 2 4 8 16 32 64 128 ……testarr := make([]int, 1, 1)for i := 0; i < 1000; i++ {fmt.Println(cap(testarr), len(testarr))testarr = append(testarr, i)}}/*小寫字母開頭的函數只能在本包可見,大寫字母開頭的函數才能被其他包使用。*///如果該函數拋出異常,defer後的語句仍然會被執行。func CopyFile(dst, src string) (w int64, err error) {srcFile, err := os.Open(src)if err != nil {return}defer srcFile.Close()return w, nil}func Add(a, b int) (ret int, err error) {if a+b > 100 {//如果加起來大於100的話就拋出異常err = errors.New("sun must under 100")return}return a + b, nil}//不定參數的函數func myfunc(args ...int) {for _, arg := range args {fmt.Println(arg)}}//任何類型不定參數func anyfunc(args ...interface{}) {for _, arg := range args {switch arg.(type) {case int:fmt.Println("this int is ", arg)case string:fmt.Println("this string is ", arg)default:fmt.Println("not found type ")}}}func GetName() (fistName, lastName, nickName string) {return "Zhou", "Yunxuan", "Moss"}//浮點數比較func IsEqual(f1, f2, p float64) bool {return math.Abs(f1-f2) < p}
文章出自於 http://blog.csdn.net/zhouyunxuan