这是我参与「第五届青训营 」伴学笔记创作活动的第 1 天
一、目录
本节课主要分为三个部分:
1.Go 语言简介
2.Go 语言开发入门,包括开发环境配置、基础语法、标准库
3.Go 实战,包括三个实战项目
二、Go 语言简介
Go(又称Golang)是Google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言,具有高性能、高并发、语法简单、学习曲线平缓、标准库丰富等优点。
Go 语言凭借其优秀的性能和优异的特性得到了字节跳动、腾讯、百度的广泛应用,同时美团、滴滴、深信服、平安、OPPO、知乎、去哪儿、360、金山、微博、哔哩哔哩、七牛等公司也在大量使用Go 语言。
三、Go 语言开发入门
笔者主要使用C/C++,在学习新语言时习惯将新语言与旧语言做对比,通过差异处学习这门新语言,这里简要列出两者的部分差异之处(或者不熟悉之处)以供学习和复习。
1. 运行与编译
使用 go run 直接运行,使用 go build 编译为二进制。
2. 变量与常量声明
声明方式差异:
var a = "initial"
var b, c int = 1, 2
var d = true
var e float64
const s string = "constant"
3. 条件语句
if后不接括号,格式必须为大括号不换行;
switch语句中无需写break。
4. 循环语句
只有for循环,for后不接括号。
5.切片
切片是可变长度的数组。
a := make([]string, 3)
b = append(a, "d")
c := copy(d, e)
make:创建切片,确定数据类型和默认长度。
append:追加元素。
copy:复制切片。
6. map
map是无序的。
7. 结构体
结构体方法与普通函数的区别是函数名之前有类成员。
8. JSON处理
对于一个结构体,只要保证每个字段的第一个字母是大写(即公开字段),就可以使用JSON序列化。 json.Marshal()序列化:返回两个参数,一个是序列化后的值,一个是error。 json.Unmarshal()反序列化:得到原来的结构体。
type userInfo struct {
Name string
Age int `json:"age"`
Hobby []string
}
func main() {
// 序列化
a := userInfo{Name: "wang", Age: 18, Hobby: []string{"Golang", "TypeScript"}}
buf, err := json.Marshal(a)
if err != nil {
panic(err)
}
fmt.Println(buf) // [123 34 78 97...]
fmt.Println(string(buf)) // {"Name":"wang","age":18,"Hobby":["Golang","TypeScript"]}
buf, err = json.MarshalIndent(a, "", "\t")
if err != nil {
panic(err)
}
fmt.Println(string(buf))
// 反序列化
var b userInfo
err = json.Unmarshal(buf, &b)
if err != nil {
panic(err)
}
fmt.Printf("%#v\n", b) // main.userInfo{Name:"wang", Age:18, Hobby:[]string{"Golang", "TypeScript"}}
}
9. 时间处理、数字解析、进程信息
分别需要调用"time"、"strconv"、"os"中的函数进行相应操作。
四、Go 实战
1. 猜谜游戏
使用随机数时注意要更改时间戳从而改变随机数种子。
maxNum := 100
rand.Seed(time.Now().UnixNano())
secretNumber := rand.Intn(maxNum)
fmt.Println("The secret number is ", secretNumber)
读取用户标准输入
reader := bufio.NewReader(os.Stdin)
input, err := reader.ReadString('\n')
if err != nil {
fmt.Println("An error occured while reading input. Please try again", err)
return
}
input = strings.Trim(input, "\r\n")
2.在线词典
1.发送http请求:可在浏览器中copy as curl,再在curlconverter.com中粘贴,即可得到代码。
2.解析response body:返回的json需要反序列化到结构体中,自定义结构体比较麻烦且容易
出错,使用oktools.net/json2go来实现。
3. SOCKS5代理
1.实现TCP echo server
2.实现代理服务器过程中常用的函数,如
获得一个输入流bufio.NewReader(conn)
读取多个字节:method := make([]byte, methodSize) io.ReadFull(reader, method)
将输入流传到输出流:io.Copy(writer,reader)
连接服务器: dest, err := net.Dial("tcp", fmt.Sprintf("%v:%v", addr, port))
使用context取消go routine的执行