Go语言基础-基础语法 | 青训营笔记

120 阅读3分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 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的执行