这是我参与「第五届青训营 」笔记创作活动的第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,防止数据泄露。
Socks原理:工作机制分为四阶段,1.客户端先与socks协商。2.客户端认证。3.客户端向目标网站发起建立TCP连接请求,Socks server收到后与服务端建立连接,再与目标服务器建立连接。4.正常数据请求与回应,中间经过socks server转发,socks协议与VPN的差别在于socks是明文传输,不经过加密。