Go
是Google开发的一种静态强类型、编译型,并发型,并具有垃圾回收功能的编程语言 常用类型 bool byte(uint8) string int(类型多, 就不一一列出了) float(float32, float64) complex(complex64, complex128)
var 语句定义了一个变量的列表
// 变量定义语法: var var_name type varandrewstring varliustring="andrewliu" // 段声明语法只能用在函数内 k :=3 // 表达式 T(v) 将值 v 转换为类型 T, Go不支持隐式转换! 必须显示转换类型 varffloat32=3.2222 varzuint=uint(f) // 定义一个常量 constWorld ="世界"
// if语句后没有小括号, 但是逻辑题要使用{} ifv := math.Pow(x, n); v < lim { returnv // v的生命周期在if-else语句内部 } else{ fmt.Printf("%g>=%g/n", v, lim) }
break
, 满足条件后会自动终止 funcmain(){ t := time.Now() switch { // switch后可以没有语句, 类似于if-else if- else case t.Hour() <12: fmt.Println("Good morning!") //满足条件后会自动退出 case t.Hour() <17: fmt.Println("Good afternoon.") default: fmt.Println("Good evening.") } }
// 类似于c语言, 只是没有小括号, 循环体使用{} import "fmt" func main() { sum:=0 fori :=0; i <10; i++ { sum+= i } fmt.Println(sum) } // c语言中的while语句, 在Go依然为for关键字 forsum<1000{ sum+=sum } // while(true)语句 for{ fmt.Println("andrewliu") }
值得一提的是 range
, 类似迭代器操作, 返回 (索引, 值)
或 (键, 值)
// range操作类似于python中的enumerate varpow = []int{1,2,4,8,16,32,64,128} funcmain() { fori, v :=rangepow { fmt.Printf("2**%d = %d/n", i, v) } }
Go竟然有指针, 我简直惊呆了
->
运算符, 直接 .
访问成员 i, j := 42,2701 p := &i // p指针指向变量i fmt.Println(*p)// p解引用操作, 读取内存地址上的值 *p = 21// 通过指针来设置i的值 fmt.Println(i)
type
定义新的结构体 typeVertexstruct{ X float64 Y float64 } // Go没有类, 但可以通过结构体定义方法, 方法接收者 出现在 func 关键字和方法名之间的参数中 func(v *Vertex) Abs()float64{ returnmath.Sqrt(v.X * v.X + v.Y * v.Y) } funcmain() { fmt.Println(Vertex{1,2}) }
slice
并不是数组或数组指针, slice通过内部指针和相关属性引用数组片段, 从来实现变长数组 // 定义一个长度为10的定长数组 vara[10]int // slice, 支持切片操作 s := []int{2,3,5,7,11,13} // 使用make函数构造一个slice a := make([]int,5) // 第一个参数为slice, 其余的元素被添加到slice尾部, 最终返回新slice对象 funcappend(s []T, vs ...T) []T
(==、!=)
类型, 如 number、string、 pointer、array、struct,以及对应的 interface varmmap[string]Vertex // map需要通过make创建, []中为key的类型, 后面为value的类型 m = make(map[string]Vertex) varm =map[string]Vertex{ "Bell Labs": Vertex{ 40.68433,-74.39967, }, "Google": Vertex{ 37.42202,-122.08408, }, }
不支持默认参数
// 函数定义 funcadd(xint, yint)int{ returnx + y// 可以有多个返回值 }
packagemain // 通过()一次导入多个包 import( "fmt" "time" ) funccompute(fnfunc(float64,float64)float64)float64{ returnfn(3,4) } funcmain() { fmt.Println("The time is", time.Now()) fmt.Println(" My name is Liubin") }
typeFormatFuncfunc(sstring, x, yint)string// 定义函数类型。 funcformat(fn FormatFunc, sstring, x, yint)string{ returnfn(s, x, y) }
functest(sstring, n ...int)string{ varxint for_, i :=rangen { x += i } returnfmt.Sprintf(s, x) }
error
是一个 build-in
的接口
typeerror interface{ Error()string }