golang發現就很好玩。
很久沒有寫日誌了,繼續恢復吧。
// one project main.go
package main
import (
"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
錯誤類型:error
Go語言複合類型
指針 pointer
數組 array
切片 siice
字典 map
通道 chan
結構體 struct
接口 interface
*/
//聲明一個叫v1的int類型變量,默認值爲0
var v1 int
//聲明的變量後就一定要使用(給這個變量賦值不算使用),不然編譯的時候就會報錯:.\main.go:7: v1 declared and not used
fmt.Println(v1) //0
//在聲明一個變量的同時初始化
var v2 int = 10 //最標準的方法
var v3 = 10 //編譯器可以自動推導出v3的類型
v4 := 10 //使用了:=運算符 編譯器可以自動推導出v4的類型 ,推薦使用這種簡潔明瞭的方式
/*
:=符號的左邊變量不可以被聲明過
var i int
i := 3
會報錯:no new variables on left side of :=
*/
//字符串
v5 := "大連"
//數組
v6 := [2]int{1, 2}
//數組切片
v7 := []int{0, 1, 2, 3}
//結構體
var v8 struct {
one int
two int
}
//給結構體兩個數賦值
v8.one = 520
v8.two = 1314
//指針,獲取v1的地址
var v9 *int = &v1
//聲明key爲string,value爲int的map
var v10 map[string]int
//初始化map
v10 = make(map[string]int)
v10["love"] = 1314
v10["she"] = 1994
//聲明一個函數,參數爲一個int,返回爲一個int
var v11 func(a int) int //輸出 <nil>
//使用var關鍵詞連續定義多個變量
var (
v12 int
v13 float32
v14 float64
)
//使用多重賦值交換兩數
i := 6
j := 9
i, j = j, i
fmt.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,iota
iota是一個可被編譯器修改的常量,在每個const關鍵字出現時被重置爲0,然後在下一個const出現之前,每出現一次iota,其所代表的數字會自動增加1
*/
const (
v15 = iota //iota被重置爲0
v16 = iota // v16 = 1
v17 = iota // v17 = 2
)
//如果兩個const的賦值語句的表達式是一樣的,那麼可以省略後一個賦值表達式
const (
v18 = 1 + iota
v19
v20
)
//布爾類型不能接受其他類型的賦值,不能自動或者強制轉換,否則會報錯
//bool test = "peixuan" //syntax error: unexpected name, expecting semicolon or newline or }
//int和int32在Go語言裏面被認爲是兩種語言,且不同類型的整型不能進行比較
/*
var v21 int32
v22 := 2014 //v22被自動推斷爲int類型
v21 = v22 //cannot use v22 (type int) as type int32 in assignment
*/
//複數
var v21 complex64
v21 = 3.2 + 12i //3.2實部 12虛部
v22 := 3.3 + 13i
v23 := complex(3.4, 14) //3.4 + 14i
fmt.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 string
BirthDay string
}
//聲明map變量she
var she map[string]Lover
//初始化she
she = make(map[string]Lover)
//往she中添加元素
she["lpx"] = Lover{"liaopeixuan", "1994.11.26"}
//從這個map中查找zyx
lover1, ok := she["zyx"]
if ok {
fmt.Println("you love is ", lover1.Name)
} else {
fmt.Println("zyx is not found!")
}
//查找lpx
lover2, 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 := 2
switch sw {
case 1:
fmt.Println("case 1")
case 2:
fmt.Println("case 2")
case 3:
fallthrough
case 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 := 0
for {
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 := 0
GotoLabel:
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 := 100
afunc := func() func() {
in := 10
return 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