后端进阶-go基础 | 青训营笔记

46 阅读4分钟

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

go是静态编译的

静态编译和动态编译看静态编译和动态编译 - 简书 (jianshu.com)

image.png

image.png

image.png

image.png go是静态编译的

常量没有确定的类型会根据上下文自动确定类型

 

switch 可以使用任意数据类型

甚至可以在case里写判断语句 然后Switch后面什么都不写,来代替长长的if else

切片在append的时候需要赋值回原切片,这是切片底层是指向一个数组,可能会因为容量不足

导致扩容,然后就会指向一个新数组,所以需要赋值回去

map是直接下标写入或者读取

读取的是否可以接受ok来看是否存在 不存在返回value的默认值

go的map完全是无序的,输出的时候随机

delete可以删除键值对

slice map 数组可以用range输出

会返回两个值,不需要就_

也可把方法直接变成结构体的方法,然后就可以通过.直接调用

相当于把之前的函数的结构体传入参数拿到前面

有指针和非指针写法 指针就可以直接对结构体进行修改

 
 
 要先判断是否有err 然后再取返回值不然可能会有空指针错误
 

go的错误处理习惯是使用一个单独的返回值类传递错误信息

这样就可以非常明确的知道哪个函数返回了错误,可以简单的通过if else去处理错误

错误的处理方法errors.New

 

最后一个len如果字符串有中文  一个中文就会对应多个字符

可以转成rune

直接使用%v 而不用区分类型 相当于一个类型推导

%+v 打印详细  %#v则会进一步详细

json 需要建一个结构体 其中每个字段首字母大写 也可以在后面加上想在json中展示的字段,比如上面的age

然后序列化只需要调用json.Marshal 会转成byte数组

反序列化调json.Unmarshal

 
 
 获取时间戳
 

猜数比较简单,不做记录

 

package main

 

import (

"bufio"

"fmt"

"math/rand"

"os"

"strconv"

"strings"

"time"

)

 

func main() {

maxNum := 100

rand.Seed(time.Now().UnixNano())

secretNum := rand.Intn(maxNum)

fmt.Println(secretNum)

reader := bufio.NewReader(os.Stdin)

for {

fmt.Println("请输入你猜的数")

input, err := reader.ReadString('\n')

if err != nil {

fmt.Println("读取输入错误")

continue

}

input = strings.TrimSuffix(input, "\r\n")

guess, err := strconv.Atoi(input)

fmt.Println("你猜的数是", guess)

if err != nil {

fmt.Println("请输入一个整数")

continue

}

if guess < secretNum {

fmt.Println("你猜的数小了")

} else if guess > secretNum {

fmt.Println("你猜的数大了")

} else {

fmt.Println("猜对了")

break

}

}

}

 

 

本项目:

调第三方API完成查询

了解如何发送http请求 如何去使用json

 

因为header太多了,直接手写比较麻烦,

介绍生成请求的一种简单方式,直接在那个发送的请求上右键 copy  copy as cUrl

找个终端粘贴这个命令 (相当于在每行末尾加上了\)

Convert curl to Go (curlconverter.com)

获得的代码直接粘到IDE 可能会有几个head比较复杂 会因为转义导致编译错误,可以直接删掉

httpclient实际可以指定很多参数,比如超时时间,这边没有设置就是不超时

why data是一个流 而不是我们通常输入的字符串

因为这个data可能会很大 或者是一个比较大的文件,此时就会占用很大的内存,因此设定成流可以降低内存的开销

如果因为断网等原因连不上就会直接log.Fatal退出进程

因为返回的body也是一个流,所以需要关闭

deffer是在函数最后从下往上执行

自己定义结构体进行序列化

序列化后是byte数组所以用了bytes.NewReader

自己写结构体比较麻烦,将请求的preview里的json放到JSON转Golang Struct - 在线工具 - OKTools

可以自动生成go的结构体

转换展开就是生成多个结构体 转换嵌套是生成一个

因为这边我们不需要更进一步操作,所以选择嵌套

golang的log.Fatal()和panic()函数的区别 - 简书 (jianshu.com)



socks5是互联网早期的代理协议。企业内网为了安全性配置了很严格的防火墙策略

以至于管理员访问资源也很麻烦。socks5相当于在防火墙上开了一个口子,让授权的用户

可以通过单个端口访问所有资源。很多翻墙软件最终暴露的也是sock5端口给浏览器使用

go process是一个go routine 相当于其他语言中开启一个子线程

不过开销会比其他语言小很多,可以轻松处理上万并发

27行的for是每次读一个字节,但是其实每读一次会把后面很多的字节也一起读进来。后面读的时候就会瞬间返回

后面的听不太懂 有时间再看