一、简介
1. 软件开发的新挑战
- 多核硬件架构
- 超大规模分布式计算集群
- Web 开发的前所未有的开发规模,更新速度。
BAT、滴滴等公司在使用,知乎舍弃 Python 转向 Go。Docker、K8s 也在使用,又称云端开发语言。又是区块链开发语言。
2. 开发人员喜欢的特性
- 简单,25 个关键字
- 内置并发支持,垃圾回收
- 高效,编译静态语言
- 生产力,简介清晰的依赖管理,独特的接口类型设计,编程方式约束。参考 iOS 操作剁掉很多。大道至简。
3. 误区
共享内存并发控制,忽略 Go 语言本身 CSP 并发机制。再者,Java 的不优雅引发的坑。
4. Google 安装以及官方文档
- Frequently Asked Questions (FAQ) - The Go Programming Language
- The Go Programming Language (google.cn)
二、编写第一个 Go 程序
1. 开发环境构建
GOPATH:
- 在1.8版本前必须设置这个环境变量
- 在 1.8 版本后(含 1.8),如果没有设置使用默认值。
- 在 Unix 上默认为
$HOME/go
,在 Windows 上默认为%USERPROFILE%/go
。 - 在 Mac 上 GOPATH 可以通过修改
~/.bash_profile
来设置。
2. 编写一个 Go 程序
// 查看 Go 版本
go version
// 创建 Go 学习的总目录 d:\Gocode
// src 是源码路径,在下面建立 ch1/main/hello_world.go,记得 helloworld 文件拓展名记得要写 go
package main
import "fmt"
func main() {
fmt.Println("Hello World")
}
//在 cmd 里面:
>d:
>cd d:\Gocode\src\ch1\main
// 运行代码
go run hello_world.go
// 编译代码,会生成一个 hello_world 的二进制文件,执行这个二进制文件也会直接回显出来 Hello World
go build hello_world.go
// Go 在默认情况下都会使用静态连接,编译完的 Go 程序是一个独立的二进制文件,有很好的便携性。可以拷贝到不同的机器上运行
3. 基本程序结构
package main // 包,表明代码所在的模块(包)
import "fmt" // 引入的代码依赖
// 功能实现
func main() {
fmt.Println("Hello World")
4. 应用程序入口
- 必须是
main
包:package main
(package的声明必须是main,不过目录名不需要是main)
// 新建一个目录`\Gocode\src\ch1\hello`,把前面的`hello_world.go`文件复制过去,依然执行正常
> go run hello_world.go
Hello World
//但如果把`hello_world.go`里面的`package main`改成`package main1`再`go run`运行就会报错
> go run hello_world.go
package command-line-arguments is not a main package
- 必须是
main
方法:func main()
- 文件名不一定是
main.go
5. 退出返回值
与其他主要编程语言的差异:
- Go 中
main
函数不支持任何返回值 - 通过
os.Exit
来返回状态
package main
import (
"fmt"
"os"
)
func main() {
fmt.Println("Hello World")
os.Exit(-1)
}
输出结果:
> go run hello_world.go
Hello World
exit status 255
6. 获取命令行参数
与其他主要编程语言的差异
main
函数不支持传入参数- 在程序中直接通过
os.Args
获取命令行参数
package main
import (
"fmt"
"os"
)
func main() {
fmt.Println(os.Args)
fmt.Println("Hello, world!")
os.Exit(-1)
}
加一个参数执行该文件,输出一个二进制的命令和我们的命令行参数
>go run hello_world.go ddao
[C:\Users\xxxxxxxx\xxx\xxxxxxxxxx\go-build2455331386\b001\exe\hello_world.exe ddao]
Hello, world!
exit status 255
package main
import (
"fmt"
"os"
)
func main() {
if len(os.Args) > 1 {
fmt.Println("Hello, world!", os.Args[1])
}
}
>go run hello_world.go ddao
Hello, world! ddao