近几年,各编程语言中,最火的莫过于Go了。
Go诞生于Google, 是由以下三位计算机领域的大师写的
Go的亲爹们
由于出身名门,Go在诞生之初就吸引了大批开发者的关注。诞生十年以来,已经有很多基于Go的应用,一直有传言Go在将来是要取代现在Java的位置。对于一门只有十年历史的新语言,Go的发展势头是相当迅猛的。
国外的docker就是用Go写的,国内的七牛团队广泛使用Go。而今如火如荼的区块链技术更是将Go推上了热潮
听起来这么牛逼的技术,少年,你不想学下么?
在 官网 下载go的安装包
如果是mac,可直接用brew安装:
brew intall go
查看go版本
☁ go [master] :zap: go version go version go1.10.2 darwin/amd64
关于编辑器,推荐使用jetbrains出品的 golang
按照官网的demo,运行第一个go程序
新建hello.go文件
package main import "fmt" func main() { fmt.Println("Hello, 世界") }
运行go可以有两种方式:
☁ demo [master] :zap: go run hello.go Hello, 世界
☁ demo [master] :zap: go build hello.go # 生成可执行文件 hello ☁ demo [master] :zap: ls hello hello.go ☁ demo [master] :zap: ./hello # 运行可执行文件 Hello, 世界
代码解析
go是一门有着语法洁癖的语言,如强制规定了大括号的写法。长期以来,关于大括号是否要另起一行,是程序员界的圣战,且这个圣战跨越了语言,操作系统,编辑器。战斗双方多年来厮杀无数回合,不分胜负。python之父Guido van Rossum直接取消了大括号,完全采用缩进,绕过了圣战。与之相比,go就显得很霸道了,直接下了死命令:
"大括号只能在当前行开始,不能另起一行,另起一行是异教徒,直接编译出错!"
让我们来试下:
大括号报错
对于另起一行的强迫症程序员,想用go,惟有屈服。
此外,如果程序中有冗余变量,或引入了没有用到的包,都会报错
package main import "fmt" // 引入了fmt包,但没有使用 func main() { }
报错:
☁ demo [master] :zap: go build hello.go # command-line-arguments ./hello.go:3:8: imported and not used: "fmt"
变量声明后不用
对于从其他语言转过来的程序员,一开始会不习惯go的霸道规定,尤其是我大PHP程序员。PHP的规范是出了名的松散,随便写都行,程序员在写代码时是挺爽的,怎么开心怎么来,但是要维护别人的代码就感到很恶心了。
go的设计理念既简洁又严谨,用强制性的规则保证了代码的一致性。
go在定义变量的规范上,有些反人类。c++, java 都是在变量名之前声明数据类型,而go却别出心裁的将数据类型声明置于变量名后面。
变量的命名规则:以字母或下划线开头,对大小写敏感。不能使用go的保留关键字
go保留关键字
变量作用域
函数内部变量
包内全局变量
如果变量名要共享到其他包,就需要将包名改成大写
创建以下目录结构:
☁ demo [master] :zap: tree -L 2 . ├── main │ └── main.go └── test └── test.go
main.go
package main import ( "fmt" "../test" // 引入test包 ) func main() { fmt.Println(test.NAME) // 获取test包的NAME变量 }
test.go
package test var NAME = "章鱼喵" // 变量名大写,才能被其他包引用,类似于java中的public关键字
结果:
☁ demo [master] :zap: go run main/main.go 章鱼喵
你可以试下将test中的NAME改为name,go会报错,小写的变量是模块的私有变量,其他模块无法引用
常量使用 const
关键字表示,常量一旦定义了,就不可再更改。因此常量只适用于布尔型、数字型(整数型、浮点型和复数)和字符串型。
package main import "fmt" const name = "章鱼喵" const say = "喜欢我的文章,点个赞吧,或者赏杯咖啡钱" const year = 2018 func main() { fmt.Println(name) fmt.Println(say) fmt.Println(year) }
这种写法显得很啰嗦,可以用更简洁的方式:
package main import "fmt" const ( name = "章鱼喵" say = "喜欢我的文章,点个赞吧,或者赏杯咖啡钱" year = 2018 ) func main() { fmt.Println(name) fmt.Println(say) fmt.Println(year) }
☁ demo [master] :zap: go run main/main.go 章鱼喵 喜欢我的文章,点个赞吧,或者赏杯咖啡钱 2018
go的数据类型从大类划分为:布尔型,数字类型,字符串类型,派生类型
各个类型的具体说明,请自行查阅 Go 语言数据类型
go是强类型语言,每个变量都要指定类型,如果不指定,go在编译时会自动根据变量的值推导变量的数据类型。
变量的类型不能更改,广大PHP开发者要谨记了,PHP是弱类型语言,同一个变量,可以随时切换存储的数据类型。PHP的变量不好比是一个万能的筐,什么都可以装。而go的变量是专器专用
package main import "fmt" func main() { var name string = "章鱼喵" // 指定了数据类型为string var say = "智慧如你,有什么要说的,要评论区发表吧..." // 可省略数据类型 //say = 2018 // 编译报错:不能篡改类型 fmt.Println(name) fmt.Println(say) }
☁ demo [master] :zap: go run main/main.go 章鱼喵 智慧如你,有什么要说的,要评论区发表吧...
值类型:变量存储的是数据本身,如基本数据类型:字符串,布尔型,数字等
引用类型:变量存储的是数据所在的内存地址,如:指针,map, chan等
package main import "fmt" func main() { var content = "跟章鱼喵一起学go吧..." // 值类型 var pipe = make(chan int, 1) // 引用类型 fmt.Println(content) // 存储具体数据 fmt.Println(pipe) // 存储内存地址 }
☁ demo [master] :zap: go run main/main.go 跟章鱼喵一起学go吧... 0xc42005a070
笔记总结
如果觉得本文对你有所帮助,点个赞,或者赏杯咖啡钱,你的认可对我很重要