Go语言基础语法笔记
最近在学习Go语言的基础语法,学习教程为 A tour of go ,本文记录了Go语言的最基础知识,包括基础的程序代码结构,变量以及函数的定义,和基础常量的定义等。
一段最简单的Go语言程序示例如下:
package main
import (
"fmt"
)
func sayhellowtoOne(name string) bool {
fmt.Printf("Hellow %v\n", name)
return true
}
func main() {
var name string = "dlk"
ok := sayhellowtoOne(name)
if ok {
fmt.Println("OK")
}
}
观察这段代码我们可以发现,Go语言的代码和从前我所熟悉的C++、Java有许多类似的地方,但也有一些差别,其中最明显的应该就是Go语言的变量定义方式和其他语言有很大的不同。下面以这段代码为引,总结记录一下Golang语言的一些最基础的语法知识。
1.整体框架
Go语言与其他语言类似,也是由包名的定义与引入、函数的定义、变量的定义以及控制语句等部分组成。在本段代码中,引入了fmt包,以main包里面的main函数作为程序的入口函数,同时定义了一个sayhellowtoOne()
的函数。本段程序运行的结果就是简单的调用一个打印函数,根据传入函数的变量值的不同,输出不同的内容。
2.包
Go语言与Java等语言类似,利用包结构来管理组织代码文件。
定义当前包
Go语言与其他语言一样,使用package
来定义一个包,通常程序由main包作为程序的入口。
示例:
package main
引用其他包
与很多语言类似,Go语言同样是利用import来引入其他包,就比如import "fmt"
这种形势,但是GO语言同时还支持利用一个import关键词同时引入多个包,就像下面这段代码一样。
import (
"fmt"
"runtime"
)
如代码所示,一个import关键词后面跟一个圆括号,里面就可以同时引用多个包。
3.如何进行定义
变量的定义
与其他语言不同,Go语言采用了先指出变量名,再指出变量类型的方式来定义变量。例如:var x,y,z int
这样我们就定义了三个整数类型的变量(注意在Go中声明了变量而不使用的话会提示错误)。据官方文档中的解视,这种定义方法比传统方法更可读,可以按自然逻辑从左相右阅读。例子中的代码的意思就是首先声明了要定义变量,然后定义了三个变量,他们的类型为整数类型,据说这样理解比较自然。另外在函数的一些复杂情况的声明中,这样也比较有优势,具体可以看官方文档 declaration-syntax 。
Notes:
- 变量的默认值
如果没有对变量设置初始值的话,数值类变量的默认值将为零,字符串默认为一个空串,指针类型默认为nli - 快速定义变量
在Go语言中可以利用:=运算符快速定义一个变量,且这种变量会自动根据右边的类型推导左边变量的类型,实现快速定义的目的。例如:i:=1
,这种方法便快速定义了一个整数变量并赋予了值。
函数的定义
定义函数使用关键词func,例如例子中的代码func sayhellowtoOne(name string) bool
该段代码简单定义了一个sayhellowtoOne函数,并且如Go语言中所规定的那样,名在前类型在后,从左往右读。首先是变量名,然后圆括号里面定义函数参数,函数参数也是使用一般变量的定义方式,然后圆括号后面定义返回值的类型(注意这里可以同时定义多个返回值),最好尖括号里面是函数的主体部分。
4.函数的编写
在上一节的例子中已经知道了如何定义一个函数,但是在函数的具体编写过程中,还有一些特殊的值得注意的地方。
多个返回值
Go语言支持同时返回多个返回值,只需要在返回值定义的地方进行定义,然后利用return关键词进行返回即可。
func swap(a,b string)(string,string){
}
预定义的返回值
Go语言可以不使用return语句显式的进行返回值,而是在定义返回值类型的时候,同时给出返回值的变量名(即定义了用于返回值的变量),这样,在函数结束后,将自动的返回定义的变量的值。但是这样做会牺牲代码的可读性,因此一般用在较为简单的函数中。
func returnAvalue() (a int) {
var x, y int
x = 0
y = 1
a = x + y
return
}
5.控制语句的使用
5.1 if...else...语句
if语句是最常见的条件判断语句,在Go中,基本上所有的控制语句的判断部分都不需要加圆括号括上,但是后面的执行部分必须要尖括号括起来。同时,Go语言支持在if后面临时定义变量,但必须用:=符号进行定义,不支持使用var的方式,同时该变量的作用域直到该条件判断语句结束为止。
例如:
if ok := sayhellowtoOne(name); ok {
fmt.Println("OK")
} else {
fmt.Println("error")
}
5.2 for 控制语句
for循环的书写使用方式与if...else...语句类似。举例如下:
//实现求开根值的算法
func sqrt(x float64) float64 {
var z float64 = 1
for i := 0; i < 10; i++ {
z -= (z*z - x) / (z * 2)
fmt.Printf("%v\n", z)
}
return z
}
同时。利用for循环语句,我们可以实现类似while语句的效果
var i int = 0
for i<20 {
i++
}
5.3 defer语句
被defer关键词标记的语句会在他所在的函数执行完return语句后开始执行
例如我们在执行文件的读取操作时,利用该语句来保证文件被正确关闭
func CopyFile(dstName, srcName string) (written int64, err error) {
src, err := os.Open(srcName)
if err != nil {
return
}
defer src.Close()
dst, err := os.Create(dstName)
if err != nil {
return
}
defer dst.Close()
return io.Copy(dst, src)
}
以官方提供的这段代码为例,利用defer语句实现了如果文件被正确打开,那么他将在函数整个执行完成之后被正确的关闭,而不用担心因为出现erro导致函数提前返回而有的文件无法关闭的问题。有点类似JAVA里面的try...catch...finally语句里面的finally部分。