Go语言基础实践 | 青训营笔记

175 阅读3分钟

这是我参与「第五届青训营 」笔记创作活动的第1天

Day1

基础语法

var a = "initial"
var b, c int = 1, 2
var d = true
var e float64
f := float32(e)

go的变量声明有多种方式,如果不带初始值必须声明变量类型并在前面加上var关键字。如果带初始值可以不用声明类型,编译器会自动推断类型,同时命名方式可以使用:=或前面加var。还有一个关键点在于go语言变量类型的声明都是后置的,不同于很多其他语言的前置用法。

for j := 7; j < 9; j++ {
	fmt.Println(j)
}

go语言没有while循环或do...while循环,可以用一个for循环全部代替。go的条件控制语句不需要加括号,可以简化代码。整体使用风格类似c++循环风格的三段式,其中任何一段皆可省去,如果全部省去则为死循环,如果保留条件判断句则相当于while循环。

if语句可以在条件句中进行变量初始化和赋值,同时if语句不能像c++那样省略大括号并将代码写在同一行。

switch用法和c++基本一致

数组固定长度,使用较为不便,平时多使用切片,切片由一个指向数组的指针和长度及容量组成。长度指切片的长度,容量指底层数组的容量,容量不足时会对底层数组进行扩容。同时切片还拥有类似python中数组的切片功能,可以对切片进行“切片”,即通过连续索引对数组中连续的一段进行查询。

实例

import (
	"math/rand"
)
secretNumber := rand.Intn(maxNum)

直接使用rand生成随机数会在后续都输出同一个数字,因此设置随机数种子,一般使用time.Now()种子设置,因为每个时间点的time都不同,这样每次设置的随机数种子也就不相同。

bufio读取命令行并通过strings包以及strconv转换为数字最终输出。这样每次运行只能进行一次猜谜。可以加入for循环,并用条件控制在猜对字谜时break跳出循环。

client := &http.Client{}
var data = strings.NewReader(`{"trans_type":"en2zh","source":"good"}`)
req, err := http.NewRequest("POST", "https://api.interpreter.caiyunai.com/v1/dict", data)

resp, err := client.Do(req)
if err != nil {
	log.Fatal(err)
}
defer resp.Body.Close()

先创建client,然后生成request,request中第三个参数为传送的数据,因为数据有可能十分大,为了防止数据太大占用内存,这里一般使用reader作为第三个参数。后续可以通过header.set进行头文件中参数的设置,最终注意需要在获取响应后及时对reply.body进行close,防止数据泄露。

image.png

Socks原理:工作机制分为四阶段,1.客户端先与socks协商。2.客户端认证。3.客户端向目标网站发起建立TCP连接请求,Socks server收到后与服务端建立连接,再与目标服务器建立连接。4.正常数据请求与回应,中间经过socks server转发,socks协议与VPN的差别在于socks是明文传输,不经过加密。