01 简介
什么是Go语言
- 高性能、高并发
- 语法简单、学习曲线平缓
- 丰富的标准库
- 完善的工具链
- 静态链接
- 快速编译
- 跨平台
- 垃圾回收
02 入门
2.1 开发环境
-
安装Golang
-
配置集成开发环境(VSCode、Goland)
-
基于云的开发环境
2.2 基础语法
🔎示例代码 wangkechun/go-by-example (github.com)
Hello World
package main
import (
"fmt"
)
func main() {
fmt.Println("hello world")
}
变量
Go语言是强类型语言,每一个变量都有变量类型:字符串、整数、浮点型、布尔型……
函数
Golang里面的函数原生支持返回多个值。在实际的业务逻辑代码里面几乎所有的函数都返回两个值,第一个是真正的返回结果,第二个值是一个错误信息。
func exists(m map[string]string, k string) (v string, ok bool) {
v, ok = m[k]
return v, ok
}
指针
支持的操作有限,主要用途就是对传入参数进行修改。
//无用,参入参数是个拷贝,+2仅是对拷贝进行了+2,不起作用。
func add2(n int) {
n += 2
}
//需要起作用要写成指针。
//运算的时候要加 *
func add2ptr(n *int) {
*n += 2
}
//为了匹配类型,调用的时候要加 &
func main() {
n := 5
add2(n)
fmt.Println(n) // 5
add2ptr(&n)
fmt.Println(n) // 7
}
结构体、结构体方法
将一个普通函数改成结构体方法,可以像a.checkPassword("xx")这样调用。
把第一个参数,加上括号,写道函数名称前面。
带指针能对结构体方法进行修改
func (u *user) resetPassword(password string) {
u.password = password
}
JSON操作
- 对一个已有的结构体,可以什么都不做,只要保证每个字段的第一个字母是大写,也就是公开字段。那么这个结构体就能用
JSON.marshaler去序列化,变成一个JSON的字符串。 - 打印字符串要加
string()强转,否则是16进制编码。 - 序列化之后的字符串也能够用
JSON.unmarshaler去反序列化到一个空的变量里面。
//默认风格是大写字母开头,可以用json tag修改结果里的字段名
Age int `json:"age"`
进程信息
- 用
os.Args来获取进程在执行时的一些命令行参数。 - 用
os.Gatenv()获取环境变量。 - 用
os.Setenv()写入环境变量。
func main() {
// go run example/20-env/main.go a b c d
fmt.Println(os.Args) // [/var/folders/8p/n34xxfnx38dg8bv_x8l62t_m0000gn/T/go-build3406981276/b001/exe/main a b c d]
fmt.Println(os.Getenv("PATH")) // /usr/local/go/bin...
fmt.Println(os.Setenv("AA", "BB"))
buf, err := exec.Command("grep", "127.0.0.1", "/etc/hosts").CombinedOutput()
if err != nil {
panic(err)
}
fmt.Println(string(buf)) // 127.0.0.1 localhost
}
03 实战
3.1 猜谜游戏
读取输入要加上\r,否则会读到回车报错。
input = strings.TrimSuffix(input, "\r\n")
3.2 在线字典
拿到请求后加上defer resp.Body.Close()避免资源泄露,手动关闭流。
JSON转Golang Struct - 在线工具 - OKTools
3.3 SOCKS5代理
需要安装netcat