Go start
Go 的入门笔记
Go start
基本概述
C语言与Go语言的对比:https://hyperpolyglot.org/c
C语言与Go语言的对比(多语言版):https://programming-idioms.org/cheatsheet/C/Go
学习文档:
Go语言官网(需要翻墙):https://golang.org/
go中文社区:https://studygolang.com
go中文在线文档:https://studygolang.com/pkgdoc
特点 + 编译
- 没有头文件概念, .go走天下
- 一个go语言的应用程序,在运行的时候是不需要依赖外部库的
- 把执行时需要的所有库都打包到程序中
- go程序比较大
- 如果import的包在程序中没有使用,那么程序不允许编译
- go语法是不区分平台的,在windows下面也可以编译一个程序,在linux下运行,需要两个环境变量来控制:
- GOOS:设定运行的平台
- mac:GOOS=darwin
- linux: GOOS= linux
- windows :GOOS=windows
- GOARCH: 目标平台的体系构架
- 386: GOARCH=386
- amd64: GOARCH=amd64
- arm : GOARCH=arm
- 例:
GOOS=linux GOARCH=amd64 go build -o hello_linux main.go
- 输入
go env
可以查看上述变量环境
go命令(build/run/install/env)
- 编译.go文件,-o指定生成文件的命令
- go build -o test.exe main.go xxx.go
- go build *.go
- 直接运行程序,不会编译成exe文件
- go run *.go
- 安装程序 go install
- 拿到一个c源码,想自己编译出exe
- ./configure
- make
- make install ===> 将编译好的程序安装到指定的目录/usr/bin
- 使用go install,可以将应用程序安装到GOBIN下面: $GOPATH/bin
- go install ==> 需要实现在环境变量中设置GOBIN的目录
- go env,可以查看当前go的环境变量
- go env,可以查看当前go的环境变量
- 如果重新设置了环境变量,需要重新启动编译器才能生效
- 拿到一个c源码,想自己编译出exe
go install 使用
创建一个目录:
mkdir hello cd hello
创建
main.go
文件: 将上述代码保存为main.go
。初始化模块:
go mod init hello
安装程序: 运行以下命令来安装:
go install
验证安装
安装后,你可以在 $GOPATH/bin
目录中找到生成的可执行文件。确保将 $GOPATH/bin
添加到你的 PATH
中,以便直接在命令行中运行。
hello
hello world详解
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//go程序,都有package main
//只有、且都是.go结尾
//pachage 表示定义一个包名,相当于命名空间 std::cout
//main包是特殊的、用于标识可独立运行程序
package main
//导入标准包 fmt, format
//一般用于格式化输出
import "fmt"
//所有函数使用func开头
//一个函数的返回值放在参数后面
//函数的做花括号必须与函数名同行
func main(){
//go语言语句 ;结尾不是必要的
fmt.PrintLn("hello world)
}
工程管理
go语言的项目,有特定的目录结构进行管理,标准Go工程需要由三个目录:
- GOPATH
- src
- 存放源代码
- bin
- 编译后的程序,执行go install后的存放路径
- pkg
- 缓存包
- src
go语言的标准库:
- GOROOT
基础语法
赋值
定义:
1
2
3
4
5
6
7
8
9
10
11
12
13
//单纯定义
var 名字 类型 //变量
const 名字 类型 //常量
//直接赋值定义
var 名字 {类型} = 值
address := "..." // 自动推导类型
//平行赋值
i, j := 10, 20
i, j = j, i
//i:20 j:10
数据类型
1
2
3
4
5
6
7
int,int8 int16, int32, int64
uint8 ... uint64
float32
float64
true/false
自增语法
go语言只有: i++, i– 且必须单独一行
1
2
3
4
5
6
7
8
9
10
11
12
13
package main
import "fmt"
func main() {
i := 20
i++
//++i //这个也是错的, 语义更加明确
//fmt.Println("i:", i++) //这是错误的,不允许和其他代码放在一起,必须单独一行
fmt.Println("i:", i)
}
指针
空指针, c: null , c++: nullptr, go: nil
不同语法汇总
- 不支持地址加减
- 不支持三目运算符 ? :
- 只有false才能代码逻辑假,数字0和nil不能(只有false/true才能表示逻辑真假,数字不能代表逻辑值)
if
if 不加(), 必须有{}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package main
import "fmt"
func main() {
//if 0 {
// fmt.Println("hello")
//}
//if nil {
// fmt.Println("hello")
//}
if true {
fmt.Println("hello")
}
//a, b := 1, 2
//x := a > b ? 0:-1
}
基础函数
输入输出
1
2
3
4
5
6
7
8
9
10
11
12
var name string
name = "ZHQ"
age := 18
fmt.Println("name:", name, age)
//output:
//name:ZHQ 18
//
fmt.Print("name is %s, age %d\n", name, age)
//output:
//name is ZHQ, age 18
//
This post is licensed under CC BY 4.0 by the author.