书写规则
除了一般通用的语法外,Go语言有一些强制型的书写规则。
Go语言语句结束符为换行跟Python一样,不象C或者Java使用";"表示语句结束。
var i = 10 var b = 20
命名
需要向外暴漏的函数、常量、全局变量、结构等,统一使用首字母大写。并采用驼峰(Camel Case)命名法进行命名。
注释
Go语言支持单行和多行注释
/* 多行注释(块注释) */
// 单行注释(行注释)
语句块
if a == 0 { // 左括号必须在最最右侧结尾处 }
变量
Go语言通过var关键字声明变量;
// 声明变量 var s1 string var i, j, k int // 变量初始化 var s1 string = "hello" var s1 = "hello" var i, j, k int = 1, 2, 3 // 变量赋值 s1 = "hello"
另外一种方式是,使用:=进行声明并初始化,不过不能用于全局变量的声明
// 声明并赋值 s1 := "hello" i, j, k := 1, 2, 3
多重赋值
// 使用多重赋值而不使用中间变量进行值交换 j, i = i, j
常量
单个常量定义
const Zero = 0.0 const BufferSize = 1204 const Eof = -1
同时定义多个常量
const ( BufferSize = 1024 Eof = -1 ) const BufferSize, Eof = 1024, -1
使用iota,iota可以被认为是一个可被编译器修改的常量,在每一个const关键字出现时被重置为0,每出现一次iota值加1,直到碰见下个const关键字
const ( Sun = iota Mon = iota Tue = iota Wed = iota Thu = iota Fri = iota Sat = iota )
流程控制
流程控制是语言必须的语法,每种语言用法也基本一样。
- if else
- switch case
- for range, break, continue
- goto
if else
注意括号的位置,这些必须在一行;条件表达式中可以省略小括号
if err == nil { fmt.Println("Success.") } else { fmt.Println("Failure.") }
swtich case
for range, break, continue
常用写法
sum :=0 for i := 0; i < 10; i++ { sum += i }
使用for range可以对,字符串,slice,map进行迭代
str := "hello" for i,ch := range str { //ch的类型为rune fmt.Println(i, ch) } // 访问slice slice2 := [5]int{1, 2, 3, 4, 5} for i,v := range slice2 { // i是索引,v是值 fmt.Println("slice2[",i,"] =",v) } // 访问map m1 := map[string]int{"one": 1, "two": 2, "three": 3} for key, val := range m1{ fmt.Printf("%s => %d \n", key, val) }
goto
还没使用过,暂时不说
函数
在Go中有特殊的两个函数main()和init(),这两个函数会被自动执行,main()时程序的入口,init()在包被导入时执行。
单返回值
func 函数名(参数名 参数类型)返回值类型 { ... return 值 }
多返回值
func 函数名(参数名 参数类型)(类型, 类型) { ... return 值1, 值2 }
处理过程中直接使用参数的名称进行引用,return语句后可以不写返回的参数名称。
func 函数名(参数名 参数类型)(返回值 类型, 返回值 类型) { ... return }
当有多个值返回而你只是使用了其中一些参数,可以使用匿名变量来处理。
_, err := PutSupplier(supplier)
变长参数
匿名函数
Go 也支持匿名函数,可以像变量一样进行传递
// 定义匿名函数 f := func() { fmt.Println("我是匿名函数") } // 调用匿名函数 f()