Golang开发,关联 编程开发, web, gin,
June 01, 2022
Golang 的一些知识
Go 帮助文档查看
在线文档 : https://pkg.go.dev
本地文档
安装: go get golang.org/x/tools/cmd/godoc
使用:
godoc
会在本地启动一个web server.
1
2
3 godoc -http= :8081
# 或者,
godoc -http :8081
然后,浏览器访问: http://localhost:8081/
go doc
就是一个纯粹执行一次的命令行,例如:
1
2 go doc fmt
go doc fmt.Printf
安装
manjaro
1
2
3
4
5 sudo pacman -Syy go
# 安装好看下版本和环境设置
go version
go env
debian
1 sudo apt install golang-go
Hello World
hello-world.go
~~~go
package main
import “fmt”
func main() {
fmt.Println(“hello world!”);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
1. 运行方法一: 编译&运行
`go build` 会生成一个没有go后缀的可执行文件
~~~sh
go build hello-world.go
./hello-world
~~~
1. 运行方法一: 脚本方式执行
~~~sh
go run hello-world.og
~~~
## 开发工具
### Visual Studio Code
* 参考
* [2 Ways to install VS code on Debian 11 Bullseye Linux](https://www.how2shout.com/linux/ways-to-install-vscode-on-debian-11-bullseye-linux/)
* []()
* []()
1. 安装 vscode
~~~sh
# Arch linux 安装
sudo pacman -S code
~~~
~~~sh
# debian
curl -sSL https://packages.microsoft.com/keys/microsoft.asc -o microsoft.asc
gpg --no-default-keyring --keyring ./ms_vscode_key_temp.gpg --import ./microsoft.asc
gpg --no-default-keyring --keyring ./ms_vscode_key_temp.gpg --export > ./ms_vscode_key.gpg
sudo mv ms_vscode_key.gpg /etc/apt/trusted.gpg.d/
echo "deb [arch=amd64] https://packages.microsoft.com/repos/vscode stable main" | sudo tee /etc/apt/sources.list.d/vscode.list
sudo apt update
sudo apt install code
~~~
1. 安装插件
1. 启动 vscode ,左边导航条 Extension 按钮
1. 查找插件: Go , Code Runner, 点击 安装。
* 代码模板生成
* `pkgm` 自动生成 `package main + func main()`
* 变量名.print 自动生成 打印变量的Printf语句
* `fp` 生成 `fmt.Println()`
## 语言的格式特性
* 不要import 包,而不使用包的功能
* 不要定义了变量,而不使用
* `{}` 只能使用一种格式缩进
正确缩进格式:
~~~go
func main {
fmt.Println("Hello")
}
~~~
错误大括号格式,编译器会报错:
~~~go
func main
{
fmt.Println("Hello")
}
~~~
* 代码段,必须放入 `{}`,哪怕只有一句话
* 函数可以返回多个值
* 不能进行数据类型的隐式转换
## 变量定义和使用
* 如果赋予初始值,编译器会猜测变量类型。
* 如果没有赋予初始值,编译器会以变量类型,赋予一个空值。
* `:=` official name: short assignment statement
用在 func 内部。
* `var` 关键词在日常使用不多,主要使用:
* 在没有初始值的全局变量和局部变量。也就是,在 func 代码块之外的变量,都用 `var` 声明一下。
* 需要显式定义变量的类型
~~~go
var Global int = 1234 // int 类型的Global 全局变量
var AnotherGlobal = -2123
匿名变量 _
用_
忽略部分函数返回值:
1
2
3
4
5 func getNameAndAge () {
return "john" , 22
}
_ , age := getNameAndAge ()
常量定义
const
关键词定义常量,常量名称一般是全部大写
1 const constantName [ type ] = value
调试 Debug
1 fmt . Println ( "Initial j value:" , j )
1
2
3
4
5
6 fmt . Printf ( "Global=%d, i=%d, j=%d, k=%.2f. \n " , Global , i , j , k )
fmt . Printf ( "age: %v \n " , age )
// %T 来查看变量类型
fmt . Printf ( "myVar's data type is: %T \n " , myVar )
控制流语法
if…else
1
2
3
4 err := anyFunctionCall ()
if err != nil {
// Do sth if there's an error
}
switch
switch 有2种写法
switch 带判断条件:
1
2
3
4
5
6
7
8
9
10
11 switch argument {
case "0" :
fmt . Println ( "Zero!" )
case "1" :
fmt . Println ( "One!" )
case "2" , "3" , "4" :
fmt . Println ( "2 or 3 or 4" )
fallthrough // fallthrough 表示继续下一个判断,而不是跳出switch
default :
fmt . Println ( "Value:" , argument )
}
case 带判断条件:
1
2
3
4
5
6
7
8
9
10 switch {
case value == 0 :
fmt . Println ( "args[1] = 0" )
case value > 0 :
fmt . Println ( "args[1] is positive integer" )
case value < 0 :
fmt . Println ( "args[1] is negative integer" )
default :
fmt . Println ( "SHALL NOT happen: " , value )
}
循环和遍历
Go 只支持 for ,不支持 while,各种循环模式都靠 for 和 range 来实现。
简单的for
1
2
3
4 for i := 0 ; i < 10 ; i ++ {
fmt . Print ( i * i , " " )
}
fmt . Println ()
当while 用的for
1
2
3
4
5
6
7
8
9
10 // for loop used as while
i := 0
for {
if i == 10 {
break
}
fmt . Print ( i * i , " " )
i ++
}
fmt . Println ()
用 for + range 遍历数组
1
2
3
4 aSlice := [] int { - 2 , - 1 , 0 , 1 , 2 }
for i , v := range aSlice {
fmt . Println ( "index:" , i , " Value:" , v )
}
for _, v := range aSlice
中的 _
表示不需要使用index,就不用变量来存储了。
用户输入
1
2
3
4 fmt . Printf ( "Please give me your name:" )
var name string
fmt . Scanln ( & name )
fmt . Println ( "Your name is " , name )
命令行参数
存放在 os.Args
中。
例子:
1
2
3
4
5
6
7
8 go run some.go fileToProcess -n 10 /tmp "A phrase"
os.Args[0] some.go
os.Args[1] fileToProcess
os.Args[2] -n
os.Args[3] 10
os.Args[4] /tmp
os.Args[5] "A phrase"
数据类型
1 i , err := strconv . Atoi ( k )
1 f , err := strconv . ParseFloat ( k , 64 )
字符串 string
fmt.Sprintf
生成格式化字符串
1 full_name := fmt . Sprintf ( "%s %s" , last_name , first_name )
字符串连接方法
使用 +
号
使用 string.Join()
1 s := string . Join ([] string { last_name , first_name }, "," )
使用 bytes.Buffer
字符串内容提取
1
2
3
4
5
6
7
8 func main () {
str := "hello world"
fmt . Printf ( "str[n]: %c \n " , str [ 0 ]) // 第1个字符 h
fmt . Printf ( "str[n]: %c \n " , str [ 10 ]) // 第10个字符 d
fmt . Printf ( "str[3:5]: %v \n " , str [ 3 : 7 ]) // lo w
fmt . Printf ( "str[3:]: %v \n " , str [ 3 : ]) // lo world
fmt . Printf ( "str[:7]: %v \n " , str [ : 7 ]) // hello w
}
转义字符
Go 的并发模型 / concurrency model
mod 项目
例如:
1
2
3 mkdir my - little - mod
cd my - little - mod
go mod init my - little - mod