最近在学习Go语言的基础语法,学习教程为 A tour of go ,本文记录了Go语言的最基础知识,包括基础的程序代码结构,变量以及函数的定义,和基础常量的定义等。golang
一段最简单的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语言的一些最基础的语法知识。框架
Go语言与其余语言相似,也是由包名的定义与引入、函数的定义、变量的定义以及控制语句等部分组成。在本段代码中,引入了fmt包,以main包里面的main函数做为程序的入口函数,同时定义了一个sayhellowtoOne()
的函数。本段程序运行的结果就是简单的调用一个打印函数,根据传入函数的变量值的不一样,输出不一样的内容。函数
Go语言与Java等语言相似,利用包结构来管理组织代码文件。学习
Go语言与其余语言同样,使用package
来定义一个包,一般程序由main包做为程序的入口。指针
示例:code
package main
与不少语言相似,Go语言一样是利用import来引入其余包,就好比import "fmt"
这种形势,可是GO语言同时还支持利用一个import关键词同时引入多个包,就像下面这段代码同样。blog
import ( "fmt" "runtime" )
如代码所示,一个import关键词后面跟一个圆括号,里面就能够同时引用多个包。教程
变量的定义作用域
与其余语言不一样,Go语言采用了先指出变量名,再指出变量类型的方式来定义变量。例如:var x,y,z int
这样咱们就定义了三个整数类型的变量(注意在Go中声明了变量而不使用的话会提示错误)。据官方文档中的解视,这种定义方法比传统方法更可读,能够按天然逻辑从左相右阅读。例子中的代码的意思就是首先声明了要定义变量,而后定义了三个变量,他们的类型为整数类型,听说这样理解比较天然。另外在函数的一些复杂状况的声明中,这样也比较有优点,具体能够看官方文档 declaration-syntax 。
Notes:
i:=1
,这种方法便快速定义了一个整数变量并赋予了值。函数的定义
定义函数使用关键词func,例如例子中的代码func sayhellowtoOne(name string) bool
该段代码简单定义了一个sayhellowtoOne函数,而且如Go语言中所规定的那样,名在前类型在后,从左往右读。首先是变量名,而后圆括号里面定义函数参数,函数参数也是使用通常变量的定义方式,而后圆括号后面定义返回值的类型(注意这里能够同时定义多个返回值),最好尖括号里面是函数的主体部分。
在上一节的例子中已经知道了如何定义一个函数,可是在函数的具体编写过程当中,还有一些特殊的值得注意的地方。
多个返回值
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 }
if语句是最多见的条件判断语句,在Go中,基本上全部的控制语句的判断部分都不须要加圆括号括上,可是后面的执行部分必需要尖括号括起来。同时,Go语言支持在if后面临时定义变量,但必须用:=符号进行定义,不支持使用var的方式,同时该变量的做用域直到该条件判断语句结束为止。
例如:
if ok := sayhellowtoOne(name); ok { fmt.Println("OK") } else { fmt.Println("error") }
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++ }
被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部分。