Go lang Learn Note
标签(空格分隔): Go
Go安装和Go目录
设置环境变量GOROOT
和GOPATH
,前者是go的安装目录,后者是开发工作目录。go get
包只会将包下载到第一个工作目录(多个GOPATH的时候)。
Go语言命令行工具介绍
- go build 用于编译源码文件、代码包、李赖堡
- go run 可以编译并运行go源码文件
- go get 主要是用来动态获取远程代码包
GoLand编辑器选择和配置
一、GO语言基础语法
1. 关键字、标识符
- GO中保留的关键字(25个)
break | default | func | interface | select |
---|---|---|---|---|
case | defer | go | map | struct |
chan | else | goto | package | switch |
const | fallthrough | if | range | type |
continue | for | import | return | var |
- GO中预定的标识符,包括基础数据类型和系统内嵌函数(36个)
append | bool | byte | cap | close | complex |
---|---|---|---|---|---|
complex64 | complex128 | uint16 | copy | false | float32 |
float64 | imag | int | int8 | int16 | uint32 |
int32 | int64 | iota | len | make | new |
nil | panic | uint64 | printIn | real | |
recover | string | TRUE | uint | uint8 | uintprt |
2. 注释
// 单行注释
/* 多行注释 */
3. 基础结构
// 程序所属包
package main
// 导入依赖包
import "fmt"
// 常量定义
const NAME string = "John"
// 全局变量声明与赋值
var name string = "Bob"
// 一般类型声明
type typeInt int
// 结构声明
type Learn struct { }
// 接口声明
type ILeran interface { }
// 函数定义
func learnFoo() {
fmt.Println("learn foo")
}
// main()函数
func main() {
fmt.Println("simple demo")
fmt.Println(NAME)
fmt.Println(name)
learnFoo()
}
运行结果
simple demo
John
Bob
learn foo
Process finished with exit code 0
4. Package用法
- package是最基本的分发单位和工程管理中依赖关系的体现。
- 每个GO语言源代码文件开头都拥有一个package声明,表示源码文件所属代码包。
- 要生成GO语言可执行程序,必须要有main的package包,且必须在该包下有main()函数。
- 同一个路径下只能存在一个package,一个package可以拆分成多个源文件组成。
- 建议package名称和目录名称一致
- 同一路径下只能有同一个package名
5.1 import用法
- 可以导入源代码文件所依赖的package包。
- 不得导入源代码文件中没有用到的package,否则会编译错误。
- 两种格式:
import "package1"
import "package2"
...
import (
"package1"
"package2"
...
)
导入未使用包,会抛出如下错误:
import-demo\import-demo.go:5:2: imported and not used: "time"
Compilation finished with exit code 2
- 如果一个main导入其它包,包将被顺序导入。
- 如果导入的包中依赖其它包(包B),会首先导入包B,然后初始化包B中的常量和变量,最后如果包B中有init,会自动执行init(),然后回到main中。
- 所有包导入完成后才会对main中常量和变量进行初始化,然后执行main中的init函数,最后执行main函数。
- 如果一个包被导入多次,则该包只会被导入一次。
import-demo.go
package main
import (
"fmt"
"./src/show"
"./src/learn"
)
// 所有依赖包初始化完成后
// 才执行main的初始化函数
func init() {
fmt.Println("import-demo init")
}
func main() {
// learn的init函数只执行了一次
// 可知多次导入只被导入一次
learn.Learn()
show.Show()
fmt.Println("Hello world")
}
show/show.go
package show
import (
"fmt"
"../learn"
)
func init() {
fmt.Println("show init")
}
func Show() {
learn.Learn()
fmt.Println("show func")
}
learn/learn.go
package learn
import "fmt"
func init() {
fmt.Println("learn init")
}
func Learn() {
fmt.Println("learn func")
}
然后我们运行import-demo.go,可见执行结果:
learn init
show init
import-demo init
learn func
learn func
show func
Hello world
Process finished with exit code 0
5.2 import别名
- 将导入的包命名为另一个容易记忆的别名。
- 点(.)标识的包导入后,调用改包中的函数时可以省略前缀包名。
- 下划线(_)表示导入该包,但不导入整个包,而是执行该包中的init函数,因此无法通过包名来调用包中的其它函数。使用下划线操作往往是为了注册包里的引擎,让外部可以方便的使用。
别名
import (
myFmt "fmt"
)
未完待续...