这是我参与「第五届青训营」伴学笔记创作活动的第2天。
最近在通过 books.studygolang.com/gopl-zh/ 和 github.com/wangkechun/… 学习Go语言的基础语法,这里进行整理和总结。
基本概念
首先介绍Go语言中变量、函数、包的命名规则。在Go语言中,一般使用驼峰法命名变量和函数,使用全小写并以下划线分割单词的命名方法命名包和Go文件。特别的,Go语言规定以小写字母开头的函数和全局变量只能在本package内使用;以大写字母开头的函数和全局变量可以在任何地方使用。
下面以一段代码为例总结Go语言中的一些基本概念。
package main
import "fmt"
func main() {
var a = "initial"
var b int = 1
var d bool
d = true
e := b + 2
const f = 100
const g int = 100
fmt.Println("Hello, World")
}
在Go语言中,每个Go文件都有一个package,特别的,main package并不是项目目录下的main/子目录,而是项目根目录。main package表示一个Go程序而非一个Go库。在main package中需要定义一个main函数作为程序入口,Go程序将会从main函数开始运行。
上面代码的第1行声明了这段代码位于main package。第3行是一个import语句,与Java的import、C的include语句一样,Go的import语句用来引入其他的库,这里的fmt是Go语言的标准库之一,提供字符串格式化相关的函数,例如向stdout输出格式化字符串等。Go语言不同于Java、C++等语言,在两行代码之间不需要加入分号作为分割。
在main函数中,展示了几种不同的变量和常量定义方法,Go语言是静态强类型语言,需要在定义变量时指定类型,或者在定义时给出初始值让Go语言自动推断类型。Go语言的类型跟在变量名之后,例如上面代码中的var d bool。不指定类型时,Go语言将自动推断类型,例如上面代码中的var a = "initial"。还有一种变量定义方法是使用:=操作符,这时不需要写明var指定为变量,也不需要指定类型,只需要写明变量名即可,例如e := b + 2,这一句等价于var e int = b + 2。Go语言定义常量使用const关键字,例如const f = 100,常量的值会在编译期确定下来,而不会等到运行时再计算。
函数与错误处理
Go语言以func作为函数声明的关键字,如果有返回值,则返回值类型需要写在函数名之后,例如func foo() string声明了一个名为foo的返回值为string类型的函数。此外,Go语言的函数支持多返回值,例如:
func foo1() (string, bool, error) {
return "foo1", true, nil
}
func foo() {
str, result, err := foo1()
if err != nil {
return
}
}
上面的foo1函数返回了3个返回值,类型分别是string、bool和error,foo函数调用了foo1函数。上面的例子引出了Go语言的另一个编码约定:将错误放在返回值的最后,如果没有发生错误,则将返回结果和nil(作为错误的占位符);否则返回任意的值(作为结果的占位符)和具体错误。
循环
在Go语言中,循环语句依赖于for关键字,下面是几种不同的循环:
i := 1
for {
fmt.Println("loop")
break
}
for j := 7; j < 9; j++ {
fmt.Println(j)
}
for n := 0; n < 5; n++ {
if n%2 == 0 {
continue
}
fmt.Println(n)
}
for i <= 3 {
fmt.Println(i)
i = i + 1
}
只使用for而不加其他修饰,则与Java中的while(true)类似(上面代码中的第一个循环);只在for之后加条件,则与Java中的while(condition)类似(上面代码中的最后一个循环);也可以像Java、C中一样使用for语句(上面代码中的第二和第三个循环)。总之,Go语言中的for用法非常丰富。