GO基础语法及课堂练习 | 青训营笔记

126 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 1 天,今天的学习内容是Go的基础语法及实战案例。

Go语言的优点

  • 高性能、高并发
  • 丰富的标准库
  • 完善的工具链
  • 静态链接
  • 快速编译
  • 跨平台
  • 垃圾回收

高性能、高并发是选择Go语言最重要的一个点。

实战案例

猜谜游戏

猜谜游戏逻辑简单,首先生成一个随机数,然后读入用户输入的数,输出相应结果,直到用户输入数与结果数一致。 生成随机数的方法:

    maxNum := 100
    rand.Seed(time.Now().UnixNano())
    secretNumber := rand.Intn(maxNum)

使用系统时间戳初始化随机数种子,然后获取随机数,不然每次获取的随机数都是一样的。

课后练习:使用fmt.Scanf简化代码

    _, err := fmt.Scanf("%d ", &guess)
    if err != nil {
       fmt.Println("Invalid input. Please enter an integer value")
       continue
    }

只需要将原本的输入改为上述代码即可。

在线词典

使用go发送http请求给翻译网站并接收返回数据显示到结果目录中。使用net/http包的http类相关函数很容易能实现这个功能。接收到返回的数据之后,使用io.ReadAll进行读取数据,然后建一个对应的结构体使用json.Unmarshal进行转换,最后输出。

课程代码中使用的是ioutil.ReadAll,git到本地之后在GoLand上有提示已弃用就修改为了io.ReadAll

课后练习:使用另一个翻译引擎并并发进行翻译。

使用了百度翻译引擎进行了翻译。

首先通过视频方法获取到url,如下

req, err := http.NewRequest("POST", "https://fanyi.baidu.com/v2transapi?from=en&to=zh", data)

定义对应的结构体转换输出,如下

for _, res := range ans.TransResult.Data {
   fmt.Println("百度翻译结果:" + res.Dst)
}

注:百度翻译的json好像里面还有例句之类的,导致结构体非常的大,不太清楚是不是自己找错了

然后运行两个协程来跑两个查询函数,使用wg sync.WaitGroup来保证所有携程结束之后才结束主程序。

两个子线程中,my_query的查询比较慢(怀疑跟上述说的json包含东西太多有关),基本上每次query携程跑完my_query也不会跑完,所以如果将query放到携程,my_query在主线程也不会有啥影响(应该是这样)

SOCKS5代理

暂时不是很清楚,以后明白了再写。