Golang Note
Last updated on 9 months ago
环境部署
Go语言入门教程,Golang入门教程(非常详细) (biancheng.net)
Go
编译器
安装位置:
C:\Program Files\Go
其他配置
创建一个任意的目录
GolangProjects
,目录结构如下1
2
3
4
5
6
7
8
9
10
11GolangProjects
--bin
--- crm.exe //主程序入口文件
--pkg
--- commlib.A //包文件
--src
配置环境变量
- 添加环境变量
GOROOT
:C:\Program Files\Go
Go 编译器的安装目录 - 添加环境变量
GOBIN
:E:\Code\GoLangProjects\bin
方便直接 Go - 添加环境变量
GOPATH
:E:\Code\GoLangProjects
vs code
配置环境
tools 怎么来的
github中文:https://github.com/Go-zh/tools.git
github英文:https://github.com/golang/tools.git
上述俩 GitHub 地址没有通天的手段基本上是整不下来的,这个时候
码云
可以出来了把上述的那俩git地址都挪到码云里,这个方便本地clone
Clone 无需多言
推荐使用:SourceTree ,主要界面看着挺爽
怎么摆放
在本地go_path
目录下新建文件夹,如下结构
1 |
|
安装命令
1 |
|
注意:
我个人在第4点出错了,原因是因为英文官方的tools中按照位置找过去没有gopls;
百度过后才下载的中文社区的,由此才看到前面的目录结构。
所以到这要安装gopls
,执行如下命令:
1 |
|
vscode
运行代码
一般姿势:
启动vscode终端,cd 到
go-path
目录下的src
,再找到指定指定go
文件,例如:go run app.go
进阶姿势:
启动vscode扩展,安装 code run 插件,安装按完重启编辑器,只需要右键选择code run 即可,或者快捷键
ctrl + alt + n
运行代码
src
目录下添加go文件
-src
–crm
—app.go
1 |
|
–commlib
—page
1 |
|
运行有三种方式:
进入项目目录执行:
go run app.go
go build app.go
执行完此命令后,会在同级目录下面添加同名exeapp.exe
可执行程序,然后cmd
中执行exe
程序即可。与第一种方式相同,只是go run
相当于一起把此方式中的两步骤一次执行完毕。go install
执行完命令后,会在外面那个Bin
文件夹生产一个exe
可执行文件,crm.exe
,也可以在cmd
命令中执行,于上面第二种方式的区别在于,会在Bin
文件夹中生成exe
可执行文件。但是如果生成的项目不是主程序入口、只有方法的话,就会生成包文件commlib.A
文件,类似于C# 中类,存放在bin文件夹的同级目录pkg
文件夹中。
Go
包管理
初识包管理
- 一个文件夹也可以称之为一个包
- 在文件夹(包)中可以创建多个文件
- 在同一个包下的每个文件中必须指定
包名称且相同
包的分类
main
包,如果是main
包,必须写一个main
函数,以此作为程序的入口,又称为主函数,编译生成后会生成一个可执行文件。- 非
main
包
调用包
调用包文件内的方法:
1 |
|
1 |
|
包定义规范
- 定义包文件之后,包内的函数首字母必须得大写
- 大写和小写的区别:
- 大写:类似于C# 中的 public 修饰符,包的外部可以进行调用
- 小写:类似于C# 中的 internal修饰符,仅限于包内部使用
截图
基础知识
输出
在终端输出前置语言例如:请输入账户名或者密码等等…
- 内置函数
print
- 默认打印两个
print
是连在一起的,如果想要达到换行效果需要在内容尾部加上\n
- 默认打印两个
println
- 默认打印两个
println
是自带换行效果的
- 默认打印两个
fmt
fmt.print
- 效果通内置函数 print 相仿
fmt.println
- 同上,平时推荐使用此方法
fmt.println
扩展:fmt.println("我叫","Harris","年龄","18")
中间自带空格- 格式化显示:
fmt.printF()
- 在以上两种方式的输出中推荐使用
fmt
,原因:Golang
官方给出的回答是,在以后的规划中,不保证内置函数可以继续使用,为防止后面禁用内置函数后,代码出问题。
注释
- 单行注释 //
- 多行注释 /* */
GoLand
快捷键Ctrl+?
变量
概述
- Go 是静态类型语⾔,不能在运⾏期改变变量类型
- 使⽤关键字 var 定义变量,⾃动初始化为零值。如果提供初始化值,可省略变量类型,由 编译器⾃动推断。
- 声明的变量必须使用 如果声明不使用,则报错 编译器会将未使⽤的局部变量当做错误
变量的作用域
全局变量:没有写在函数内的变量,称之为全局变量,个人理解。
1
2
3
4
5
6
7
8
9var name string = "Harris"
var name = "Harris"
var {
v1 = "a"
v2 = "b"
v3 = 18
v4 int
}
name := "Harris" //这种不行滴局部变量:函数内的变量 局部就和C#差不多了
1
2
3
4
5
6
7
8
9func main(){
var name string = "Harris"
name := "Harris"
var name = "Harris"
var{
name = "Harris"
age = 18
}
}多变量赋值时,先计算所有相关值,然后再从左到右依次赋值
1
2
3
4data, i := [3]int{0, 1, 2}, 0
i, data[i] = 2, 100 // (i = 0) -> (i = 2), (data[0] = 100)
fmt.Println(i,data)
//结果:2 [100 1 2]特殊只写变量 “_”,⽤于忽略值占位
1
2
3
4
5
6
7
8
9func test() (int, string) {
return 1, "abc"
}
func main() {
_, s := test()
fmt.Println(s)
//结果:abc
}编译器会将未使⽤的局部变量当做错误
1
2
3func main() {
i := 0 // Error: i declared and not used。(可使⽤ "_ = i" 规避)
}
常量
常量值必须是编译期间固定的数字、字符串、布尔值
1
2
3
4
5
6
7
8
9
10
11
12const x,y int = 1,2 //多常量初始化
const z = "Hello World" //类型推断
const{
a,b = 1,2
c bool = true
}
func main(){
const x = "xxxx" //这个时候如果没有使用上述已经定义好的常量,不会报错
}常量可以使用在编译期间确定的函数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25const a,b int =1,2
const c = "abc"
const x = len(c)
const y = unsafe.Sizeof(x) //这个方法是用来计算字节的,64为系统中,字符串和整形的字节一个都是8
fmt.Println(a)
fmt.Println(b)
fmt.Println(c)
fmt.Println(x)
fmt.Println(y)
//结果:
/*
1
2
abc
3
8*/
枚举
关键字 iota 定义常量组中从 0 开始按⾏计数的⾃增枚举值。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18const(
Sunday = iota //0
Monday //1,通常省略后面的表达式
Tuesday //2
Wednesday //3
Thursday //4
Friday //5
Saturday //6
)
const (
_ = iota // iota = 0
KB int64 = 1 << (10 * iota) // iota = 1 << 是左移运算符
MB // 与 KB 表达式相同,但 iota = 2
GB
TB
)
fmt.Println(KB,MB,GB) //1024 1048576 1073741824在同⼀常量组中,可以提供多个 iota,它们各⾃增⻓。
1
2
3
4
5
6const (
A, B = iota, iota << 10 // 0, 0 << 10
C, D // 1, 1 << 10
)
fmt.Println(A,B,C,D) //0 0 1 1024如果 iota ⾃增被打断,须显式恢复
1
2
3
4
5
6
7
8
9
10const (
A = iota // 0
B // 1
C = "c" // c
D // c,与上⼀⾏相同。
E = iota // 4,显式恢复。注意计数包含了 C、D 两⾏。
F // 5
)
fmt.Println(A,B,C,D,E,F)//0 1 c c 4 5可通过⾃定义类型来实现枚举类型限制
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18type Color int
const (
Black Color = iota
Red
Blue
)
func test(c Color)Color {
return c
}
func main() {
c := Black
fmt.Println(test(c)) // 0
x := 1
test(x) // Error: cannot use x (type int) as type Color in function argument;写的时候就会报错没法转换
}
数据类型
- 空指针值 nil,⽽⾮ C/C++ NULL。
引用类型
切片(Slice)
实现类似动态数组的功能
1 |
|
输出结果:
channel 通道
表达式
常用
1 |
|
执行结果:
标签
for
标签
1 |
|
输出结果:
goto
跳跃
- 跳跃到指定行,然后向下执行代码
1 |
|
字符串格式化
1 |
|
输出:
运算符
位运算符
进制转换:
例如:101000 -> 2*5 + 2**3 -> 32 + 8 = 40
1 |
|
补充:
十进制转二进制
十进制 二进制(逢二进一) 0 0 1 1 2 10 3 11 4 100 5 101 6 110 7 111 8 1000 9 1001 10 1010
函数
1 |
|
执行:
1 |
|
执行结果:
常见问题
go.mod file not found in current directory or any parent directory; see 'go help modules'
问题是go环境的问题:执行
go env -w GO111MODULE=auto
修改配置:运行种类和包位置 可以解决运行只局限在某个文件的问题