批里批里 (゜-゜)つ🍺 干杯~|

七つ一旋桜

园龄:4年2个月粉丝:6关注:3

Day1 golang基础语法实战案例 | 青训营笔记

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

猜谜游戏

流程为

  1. 生成一个数字作为答案
  2. 获取用户输入的字符并转换为数字
  3. 比较答案和用户输入的数字的值,如果相等则结束游戏,否则继续让用户输入

这个流程中要对用户的输入做错误处理,因为用户输入的值并不总是正确的

首先是随机数的生成部分

使用如下的函数即可获取一个随机数

rand.Seed(seed)

但是如果不设置随机数种子的话,生成的随机数就会永远是同一个

课程中示范使用当前的时间戳作为随机数种子

由于我是一个喜欢特立独行的人

这里我使用变量的指针地址作为随机数种子,即用空间的值作为随机数种子

maxNum := 100
seed, _ := strconv.ParseInt(fmt.Sprintf("%v", &maxNum)[2:], 16, 64)
rand.Seed(seed)
answer := rand.Intn(maxNum)

下一步是获取用户的输入

使用fmt.Scan()函数即可获取用户的输入并自动绑定值给变量

例子如下

var num int
fmt.Scan(&num)

掘金课上的案例是使用bufio.NewReader(os.Stdin)来作为用户输入的处理

用go打过算法的都知道使用使用reader处理输入会比fmt.Scan更快一些,输出也是一样

不过这里使用fmt.Scan,更方便一些,以及作业要求用这个

最后一步直接用if else判断数字大小就行

在线词典

流程如下

  1. 获取用户输入的单词
  2. 对固定api进行网络请求并获取请求结果
  3. 对输出结果进行筛选然后再输出到命令行

第一步获取用户的输入可以使用os.Args

例如go run main.go a b c,连着main.go和后面的a,b,c都会被作为args参数读入

第二步是使用http库对翻译网站的api进行请求,由于我是一个喜欢特立独行的人,因此我并不使用golang内置的http请求库,我使用req工具库

首先请求api时使用的请求数据和响应结果都需要用go结构体代码进行映射,因此先定义所需的数据结构 这种复杂繁琐的工作就不自己来做了,掘金课介绍了一个网站可以自动将json转换所需的go结构体代码 oktools.net/json2go

用法很简单,进入翻译网站,打开开发者工具,然后查看网络请求

负载即这次请求所用的请求数据 image.png

响应下是这次请求的响应数据 image.png

直接复制json粘贴到工具网站就可以转换了

req请求api使用如下

type CaiyunRequestBody struct {
...
}

type CaiyunApiResult struct {
...
}

func main() {
    client := req.C().DevMode()
    var result CaiyunApiResult

    resp, err := client.R().
    SetBody(&CaiyunRequestBody{...}).
    SetResult(&result).
    Post("https://httpbin.org/post")
    ...
}

请求过程中还需要用到请求头 下面这个网站可以获取所需要的请求头 Convert curl commands to Go (curlconverter.com)

点击复制为cURL image.png 然后粘贴到curlconverter.com就能获取所需的一堆请求头

复制req.Header.Set开头的代码

image.png

并批量将他们改为client.SetCommonHeader开头 image.png

vim下这个批量修改操作可以使用:%s/req.Header.Set/client.SetCommonHeader/g来进行

然后是对结果进行输出,这个步骤就是无脑查看结构体,然后调需要的部分进行输出即可

作业要求并行查询两个翻译api 并行查询那就得用go的一大特性goroutine了 大致流程如下

w := new(sync.WaitGroup)
w.Add(2)
go query1(...)
go query2(...)
w.Wait()

其中w.Add()就是使用计数器来觉得需要等待完成的协程数量 然后用w.Wait()就可以让当前的程序等待协程执行完毕 query1query2就是所用到的查询函数了 在两个查询函数定义大致如下

func query(w *sync.WaitGroup, ...) {
    defer w.Done()
    ...
}

w.Done的作用就是让计数器知道当前有一个协程已经执行完毕了 相当于w.Add(-1) 当计数器的值为0,这个WaitGroup将不会再继续等待 当计数器的值小于0,会报错

sock5代理

WIP

本文作者:七つ一旋桜

本文链接:https://www.cnblogs.com/poifa/p/17716926.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   七つ一旋桜  阅读(14)  评论(0编辑  收藏  举报  
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起