Golang开发,关联 编程开发, web, gin,

Golang 的一些知识

  • Go 不支持 面向对象的语法

Go 帮助文档查看

在线文档 : https://pkg.go.dev

本地文档

  • godoc

安装: 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

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

  1. 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

  • fmt.Println
1
fmt.Println("Initial j value:", j)
  • fmt.Printf
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"

数据类型

  • string 转 interger
1
i, err := strconv.Atoi(k)
  • string 转 float
1
f, err := strconv.ParseFloat(k, 64)

字符串 string

fmt.Sprintf 生成格式化字符串

1
full_name := fmt.Sprintf("%s %s", last_name, first_name)

字符串连接方法

  1. 使用 +
  2. 使用 string.Join()
    1
     s := string.Join([]string{last_name,first_name}, ",")
    
  3. 使用 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
}

转义字符

1
s := "Hello\tWorld!"

Go 的并发模型 / concurrency model

mod 项目

  • 初始化

例如:

1
2
3
mkdir my-little-mod
cd my-little-mod
go mod init my-little-mod