Go语言入门指南|青训营
1 特性介绍
- 语言简洁、学习曲线平缓:一名学习过c++的程序员从上手Go语言,到熟练使用,只需要一周左右时间
- 开发效率高:Go语言内置垃圾回收机制,大大提高其开发效率
- 代码风格统一:Go语言提供了一套格式化工具------fmt,可以保证不同开发者提交的代码都是统一的格式。
- 支持并发
- 有丰富的标准库
- 跨平台
2 基础语法
2.1 从Hello world走进Go语言
如果说有什么是一个程序员上手一门新语言的重要一环,那一定是用新语言输出Hello,world无疑了。那么,今天就让我们从这个新语言入门标志出发,开始我们Go语言的学习之旅。
打印Hello,world的Go语言代码如下:
go
package main
import {
"fmt"
}
func main(){
fmt.Println("Hello,world")
}
这是Go语言中较为简单的一类代码。但麻雀虽小,五脏俱全。先看第一行package,顾名而思义,肯定指的就是一种包,具体而言,当然就是我们这里的main包了。实际上在Go语言中,package就是其源代码的一个集合,像os、io,以及后面的fmt都是这样的一个包。那么它在使用时有哪些注意事项呢?
- 使用main包时,即为使用应用程序的入口包,编译后会得到一个可执行文件,至于其他的包则没有这个效果
- 可以自定义包,看作是一个存放.go文件的文件夹,该文件夹下所有go文件都要在第一行添加
go
package 包名
再看第二行,我们用到了import,这就又牵涉到包的另一种操作,包的导入。这是为了在文件中引用其他包的内容,这里就有点像我们c语言中的include添加头文件的用法。
最后就是我们代码的主题部分:在main函数中调用fmt包中的输出函数Println,实现对Hello,world的打印。
简单总结下:为了使程序可执行,我们在一开始声明了main包,然后为了使用标准输出函数,我们又导入了fmt包,最后调用fmt中的Println,实现打印Hello,world。顺带提一句,如果要实现程序的运行,只需要在命令行里输入go run 文件地址,即可。
2.2 变量
go
//两种声明变量的方式
var a ="Hello,world"//或者var a string ="Hello,world"
a:="Hello,world"
从以上两种方式可以看出,Go语言作为一门高级语言,具有自动推导类型的功能,因此,也就不必写出具体变量类型,但如果要写,应注意类型名在变量名后。另外一个细节,在前面没有var时,赋值所用为":=",而非"="
2.3 语句
if-else语句:后面的条件不需要加括号,而且括号后紧跟大括号,不可像c语言中将大括号中的内容写在同一行。
循环:只有for循环,其他类似c语言中的循环,则用for进行等价表示。
switch语句:一个重要区别是,在Go语言中如果有匹配项,不需要break,就会自动跳出。由此我们得到了一个不同于c语言中switch的用法,用来代替if-else语句。
go
switch{
case a<10 :
fmt.Println("It's too small.")
default:
fmt.Println("It's too big.")
}
2.4 数组与切片
数组和c语言中的类似,只需要记住它在Go语言中的类型是[n]+元素类型
而切片是一类可变长度的数组,常见操作如下:
go
//声明和赋值
s := make([]string,5)
s[0] = "a"
//追加
s = append(s,"g")
2.5 map
就是其他语言中的字典,重点在于key和value的对应,以下是它的常见操作:
go
m := make(map[int]string)
m[1] = "one"
fmt.Println(r,ok)//r是一个value,此处用于表示判断r是否在m中
delete(m,1)
2.6 错误处理
go
//一个运用到error的函数
func findUser(users []user,name string)(v *user,err error){//返回值加上error
for _,u:= range users{
if u.name == name{
return &u,nil//代表没有出错
}
}
return nil,errors.New("not found")//代表有问题
}
这里相当于在函数中就考虑到了出错的可能,这样在后面调用函数时,只需要根据返回值来判断是否出错,从而达到错误处理的目的。
2.7 时间处理
go
now := time.Now()//用于获取现在的时间
t.Format("2006-01-02 15:04:05")//用于格式化当前时间,应注意的是,后面的这串时间是固定的,不能随便写
diff := t2.Sub(t)//对两段时间做减法