最近看了看GoLang,把Go语言的语法总结了一下,做个快速参考
var varName type,var var1,var2… type,var varName type = Value,var varName1,varName2 type = Value1,Value2,var varName1,varName2=Value1,Value2,varName1,varName2:=Value1,Value2,定义数据类型。const varName = Value , const varName type = Valuestring字符串类型值不可改变,但是可以切片,字符串可以使用+进行连接iota用来声明enum,表示自加1,初始为0var arrayName [N]type用来声明数组,或者使用 arrayName := [N]type{ v1,v2…}来声明slice用来表示切片,声明方式var sliceName []type或者sliceName := []type{v1,v2…}slice保存的是引用而非实体slice中有一些内置函数,len获取长度,cap获取最大容量,append追加数据,copy用来拷贝数据map声明方式为var mapName map[keyType] valueType或者mapName := make(map[keyType]valueType)map可通过 key : value 初始化make用于内建类型的内存分配,new用于各种类型的内存分配,new返回指针而make返回非0的值if语句不需要括号,在if语句中可以声明变量,用分好分割if语句的条件判断
if x:=function();x<10 { fmt.Printf("x < 10,%d\n",x); }else{ fmt.Print("x >= 10 ,%d\n",x); }goto语句类似C语言,但是跳转到必须在当前函数内定义的标签for语句类似C语言,但是break和continue可以跟标号,跳出多重循环。switch语句不用break,如果想强行执行下面的case可以使用fallthrough声明方式:
func funcName(input1 type1, input2 type2) (output1 type1, output2 type2)func用来声明函数,函数名为funcName,后面跟输入,输出的数据类型。string,slice,map直接使用的是类似的指针传递,不用使用取地址符,但是,如果需要改变slice的长度,则需要取地址穿指针。defer语句用来表示在函数返回前执行的语句。type typeName func(input1 inputType1 , input2 inputType2 [, ...]) (result1 resultType1 [, ...])用来声明一个函数类型,主要用于高阶函数中。import用来导入包,package用来导出包,包操作使用.操作符.访问type typeName typeLiteral来自定义类型,定义完以后可以使用方法来扩展类型的功能。ReceiverType定义为*指针类型,但是调用的时候不需要,go语言自动帮你完成了。type InterfaceName interface用来定义inerfacevalue, ok = element.(T),这里value就是变量的值,ok是一个bool类型,element是interface变量,T是断言的类型,如果ok为true则表示,element确实是T类型的。interface可以嵌套go关键字+函数名实现并发channel实现线程间通讯,channel通过make构造,使用<-来发送和接受数据。chan是channel的关键字,后面跟数据类型ch <- v发送数据,v:=<-ch接收数据,ch是chan类型。
package main import "fmt" func sum(a []int, c chan int) { total := 0 for _, v := range a { total += v } c <- total // send total to c } func main() { a := []int{7, 2, 8, -9, 4, 0} c := make(chan int) go sum(a[:len(a)/2], c) go sum(a[len(a)/2:], c) x, y := <-c, <-c // receive from c fmt.Println(x, y, x + y) }channel默认是阻塞形式的,可以进行线程同步。ch := make(chan type, value)构造channel时可通过设置不同的value来设定channl的buffer长度。close用来关闭channelselect+case来选择多个channelselect + case <- time.After(5 * time.Second)来设定超时Goexit 退出当前执行的goroutine,但是defer函数还会继续调用Gosched 让出当前goroutine的执行权限,调度器安排其他等待的任务运行,并在下次某个时候从该位置恢复执行。NumCPU 返回 CPU 核数量NumGoroutine 返回正在执⾏行和排队的任务总数GOMAXPROCS 用来设置可以运行的CPU核数