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

前言

在上一篇笔记中,已经总结了 Go 语言的基础语法和一些常见标准库的使用方法,本文主要基于之前的基础,通过两个实战的例子对 Go 的基础语法和标准库的使用方法有更深刻的认识。

主要内容

  • 猜谜游戏

  • 在线词典

一、猜谜游戏

使用 Golang 构建一个猜数字游戏,在这个游戏里面,程序首先会生成一个介于1到100之间的随机整数,然后提示玩家进行猜测,生成随机数需要用到 math/rand 包,如果不设置随机数种子,则每次都会产生相同的随机数,因此具体代码如下:

package main
import ("fmt""math/rand""time"
)
func main(){maxNum := 100rand.Seed(time.Now().UnixNano())secretNumber := rand.Intn(maxNum)
}

接下来提示用户输入猜测数字,读取用户猜测数字,这里通过 fmt.Scanf() 函数来实现,需要注意的是如果 %d 后面不加 \n,则会出现异常,可能原因是由于在缓冲区中扔存在上一次输入留下的换行符(\n),具体代码如下

fmt.Println("Please input your guess")
var input int_, err := fmt.Scanf("%d\n", &input)
guess := input
// 异常检测
if err != nil {fmt.Println("An error occured while reading input. Please try again", err)continue
}
if err != nil {fmt.Println("Invalid input. Please enter an integer value")continue
}

如果猜测错误,我们要让玩家重新猜测,因此需要将猜测的主体代码都放到循环中,同时完成判断猜测是否正确的逻辑代码,最终的猜谜游戏全部代码实现如下:

package mainimport ("fmt""math/rand""time"
)func main() {maxNum := 100rand.Seed(time.Now().UnixNano())secretNumber := rand.Intn(maxNum)// fmt.Println("The secret number is ", secretNumber)fmt.Println("Please input your guess")var input intfor {_, err := fmt.Scanf("%d\n", &input)guess := inputif err != nil {fmt.Println("An error occured while reading input. Please try again", err)continue}if err != nil {fmt.Println("Invalid input. Please enter an integer value")continue}fmt.Println("You guess is", guess)if guess > secretNumber {fmt.Println("Your guess is bigger than the secret number. Please try again")} else if guess < secretNumber {fmt.Println("Your guess is smaller than the secret number. Please try again")} else {fmt.Println("Correct, you Legend!")break}}
}

ps:记得注释掉打印随机数的代码

二、在线词典

用户在命令行里面查询一个单词,我们通过调用第三方的 API 查询到单词的翻译并打印出来。这个例子中,将要介绍如何用 Go 语言来发送 HTTP 请求并解析 JSON,同时介绍使用代码生成从而提高开发效率。

首先通过翻译网站抓包可以看到 HTTP 的 post 请求,请求的 header 很复杂,因此通过 https://curlconverter.com/#go 该网站进行代码生成,生成的代码如下:首先第12行创建一个 HTTP 客户端,接下来构造一个 HTTP 请求,调用 client.Do 函数就能得到 response,通过ioutil.ReadAll 来读取流,得到整个 body,为了避免资源泄露,需要利用 defer 手动关闭这个流。

package mainimport ("fmt""io/ioutil""log""net/http""strings"
)func main() {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)if err != nil {log.Fatal(err)}req.Header.Set("Connection", "keep-alive")req.Header.Set("DNT", "1")req.Header.Set("os-version", "")req.Header.Set("sec-ch-ua-mobile", "?0")req.Header.Set("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36")req.Header.Set("app-name", "xy")req.Header.Set("Content-Type", "application/json;charset=UTF-8")req.Header.Set("Accept", "application/json, text/plain, */*")req.Header.Set("device-id", "")req.Header.Set("os-type", "web")req.Header.Set("X-Authorization", "token:qgemv4jr1y38jyq6vhvi")req.Header.Set("Origin", "https://fanyi.caiyunapp.com")req.Header.Set("Sec-Fetch-Site", "cross-site")req.Header.Set("Sec-Fetch-Mode", "cors")req.Header.Set("Sec-Fetch-Dest", "empty")req.Header.Set("Referer", "https://fanyi.caiyunapp.com/")req.Header.Set("Accept-Language", "zh-CN,zh;q=0.9")req.Header.Set("Cookie", "_ym_uid=16456948721020430059; _ym_d=1645694872")resp, err := client.Do(req)if err != nil {log.Fatal(err)}defer resp.Body.Close()bodyText, err := ioutil.ReadAll(resp.Body)if err != nil {log.Fatal(err)}fmt.Printf("%s\n", bodyText)
}

之后需要将 response body 解析出来,从浏览器中可以看到 API 返回的结构很复杂,因此借助网站 https://oktools.net/json2go 进行代码生成,将 json 字符串粘贴进去,就能够生成对应结构体

type DictResponse struct {Rc   int `json:"rc"`Wiki struct {KnownInLaguages int `json:"known_in_laguages"`Description     struct {Source string      `json:"source"`Target interface{} `json:"target"`} `json:"description"`ID   string `json:"id"`Item struct {Source string `json:"source"`Target string `json:"target"`} `json:"item"`ImageURL  string `json:"image_url"`IsSubject string `json:"is_subject"`Sitelink  string `json:"sitelink"`} `json:"wiki"`Dictionary struct {Prons struct {EnUs string `json:"en-us"`En   string `json:"en"`} `json:"prons"`Explanations []string      `json:"explanations"`Synonym      []string      `json:"synonym"`Antonym      []string      `json:"antonym"`WqxExample   [][]string    `json:"wqx_example"`Entry        string        `json:"entry"`Type         string        `json:"type"`Related      []interface{} `json:"related"`Source       string        `json:"source"`} `json:"dictionary"`
}

最终将结果打印出来,通过 for range 循环,整体代码如下:

package mainimport ("bytes""encoding/json""fmt""io/ioutil""log""net/http""os"
)type DictRequest struct {TransType string `json:"trans_type"`Source    string `json:"source"`UserID    string `json:"user_id"`
}type DictResponse struct {Rc   int `json:"rc"`Wiki struct {KnownInLaguages int `json:"known_in_laguages"`Description     struct {Source string      `json:"source"`Target interface{} `json:"target"`} `json:"description"`ID   string `json:"id"`Item struct {Source string `json:"source"`Target string `json:"target"`} `json:"item"`ImageURL  string `json:"image_url"`IsSubject string `json:"is_subject"`Sitelink  string `json:"sitelink"`} `json:"wiki"`Dictionary struct {Prons struct {EnUs string `json:"en-us"`En   string `json:"en"`} `json:"prons"`Explanations []string      `json:"explanations"`Synonym      []string      `json:"synonym"`Antonym      []string      `json:"antonym"`WqxExample   [][]string    `json:"wqx_example"`Entry        string        `json:"entry"`Type         string        `json:"type"`Related      []interface{} `json:"related"`Source       string        `json:"source"`} `json:"dictionary"`
}func query(word string) {client := &http.Client{}request := DictRequest{TransType: "en2zh", Source: word}buf, err := json.Marshal(request)if err != nil {log.Fatal(err)}var data = bytes.NewReader(buf)req, err := http.NewRequest("POST", "https://api.interpreter.caiyunai.com/v1/dict", data)if err != nil {log.Fatal(err)}req.Header.Set("Connection", "keep-alive")req.Header.Set("DNT", "1")req.Header.Set("os-version", "")req.Header.Set("sec-ch-ua-mobile", "?0")req.Header.Set("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36")req.Header.Set("app-name", "xy")req.Header.Set("Content-Type", "application/json;charset=UTF-8")req.Header.Set("Accept", "application/json, text/plain, */*")req.Header.Set("device-id", "")req.Header.Set("os-type", "web")req.Header.Set("X-Authorization", "token:qgemv4jr1y38jyq6vhvi")req.Header.Set("Origin", "https://fanyi.caiyunapp.com")req.Header.Set("Sec-Fetch-Site", "cross-site")req.Header.Set("Sec-Fetch-Mode", "cors")req.Header.Set("Sec-Fetch-Dest", "empty")req.Header.Set("Referer", "https://fanyi.caiyunapp.com/")req.Header.Set("Accept-Language", "zh-CN,zh;q=0.9")req.Header.Set("Cookie", "_ym_uid=16456948721020430059; _ym_d=1645694872")resp, err := client.Do(req)if err != nil {log.Fatal(err)}defer resp.Body.Close()bodyText, err := ioutil.ReadAll(resp.Body)if err != nil {log.Fatal(err)}if resp.StatusCode != 200 {log.Fatal("bad StatusCode:", resp.StatusCode, "body", string(bodyText))}var dictResponse DictResponseerr = json.Unmarshal(bodyText, &dictResponse)if err != nil {log.Fatal(err)}fmt.Println(word, "UK:", dictResponse.Dictionary.Prons.En, "US:", dictResponse.Dictionary.Prons.EnUs)for _, item := range dictResponse.Dictionary.Explanations {fmt.Println(item)}
}func main() {if len(os.Args) != 2 {fmt.Fprintf(os.Stderr, `usage: simpleDict WORD
example: simpleDict hello`)os.Exit(1)}word := os.Args[1]query(word)
}

总结

通过项目实战的练习,对 Go 语言的基础语法以及一些常见的标准库用法有了更深刻的了解,目前还是不太熟练,代码就是需要多写多练,同时对代码生成工具有了一定的了解,可以加快开发的速度,提高开发的效率。

Go语言实战案例 | 青训营笔记相关推荐

  1. 三个小项目入门Go语言|字节青训营笔记

    前言 这是青训营的第一课,今天的课程比较快速的讲解了go语言的入门,并配合三个小的项目实践梳理所学知识点,这里详细回顾一下这三个项目,结合课后作业要求做一些代码补充,并附上自己的分析,青训期间的所有课 ...

  2. HTML+CSS实现按钮手风琴效果 | 青训营笔记

    HTML+CSS实现按钮手风琴效果 | 青训营笔记 需求描述 HTML部分 CSS部分 完整代码 效果展示 这是我参与「第四届青训营」笔记创作活动的的第7天. 需求描述 实现一排居中的五个图标,默认为 ...

  3. Go语言上手(一) | 青训营笔记

    这是我参与「第三届青训营 -后端场」笔记创作活动的的第一篇笔记. 文章目录 语法速览 基础语法 第一:类型 第二:内置库部分 json库的使用 时间库的使用 字符串和数字互转 os相关信息 实战项目 ...

  4. 字节跳动青训营笔记01

    大家好,这里是我参加字节跳动[第五期青训营]的第一篇笔记.一小时多的课程里实现了快速入门Go语言,简要介绍了Go的优点,语法,包括与C语言的异同,以及map.切片等常用的数据结构:后半节课程主要介绍了 ...

  5. 【Go入门】Socks5代理服务器实现 翻译api调用 | 青训营笔记

    这是我参与「第三届青训营 -后端场」笔记创作活动的的第一篇笔记. [课程一]Go基础 主要内容 第一节课主要介绍了go的语法基础,包括变量.循环分支.数组切片.函数方法.错误处理.字符串.格式化处理. ...

  6. Android基础第六天 | 字节跳动第四届青训营笔记

    这是我参与「第四届青训营 」笔记创作活动的的第6天 端智能技术演进与实践 文章目录 端智能技术演进与实践 课程回顾 01 什么是端智能技术 1.1 端智能是什么? 1.2 为什么要做端智能? 1.3 ...

  7. 构建webpack知识体系 | 青训营笔记

    这是我参与「第四届青训营 」笔记创作活动的的第4天. 进阶中高级前端工程师,对webpack打包构建工具的掌握是必不可少的.我也曾经看过许多webpack教程,但无非是记记某些模式怎么配置,根本就没有 ...

  8. GO语言的实战学习(猜谜游戏和在线词典)| 青训营笔记

    一.GO语言的实战学习 1.1 前言 在上文我们急速学习了Go语言的入门,今天我们来学习一下Go语言的实战 本专栏代码,源码打包下载地址如下: https://download.csdn.net/do ...

  9. 存储与数据库 | 字节青训营笔记

    目录 一.存储系统 1.什么是存储系统 2.存储系统的特点 3.RAID技术 RAID出现的背景 RAID 0 RAID 1 RAID 0+1 二.数据库 1.难道数据库和存储系统不一样吗 2.数据库 ...

最新文章

  1. Linux LVM卷挂载
  2. Android 仿微信小视频录制
  3. 关于使浏览器崩溃的代码尝试
  4. HTML5与CSS3基础教程第八版学习笔记16-21章
  5. TrojanDownloader简单分析
  6. 深度学习入门之PyTorch学习笔记:卷积神经网络
  7. c语言 将点同时保证x坐标从小到大,y坐标从小到大地排序,C语言第五六次作业.ppt...
  8. 添加notepad到右键菜单栏
  9. 【小项目】Vue 整合 Axios
  10. UVA1368 UVALive3602 ZOJ3132 DNA Consensus String【贪心】
  11. 话里话外:从纯技术顾问到业务咨询顾问的能力发展路径(上)
  12. groovy java to swift_groovy数据类型 - Groovy教程
  13. [ZZ] Maxwell 架构
  14. 小米手机设备锁定怎么强制解除
  15. 名帖317 沈尹默 行书《春蚕词》
  16. MySQL删除数据后,释放磁盘空间
  17. 人工神经网络英文简称,人工神经网络 英文
  18. JavaScript高阶
  19. 前端入门篇(八)表单
  20. 2011年年终珠三角为主的各种工种收入大全

热门文章

  1. swift3.0中文转拼音
  2. 了解并善于利用人类记忆的特点
  3. Vegas Moive Studio 18 视频剪辑软件
  4. 手把手教你搭建Token-List | 解决uniswap没有logo的问题
  5. Java使用JDBC开发 之 DBCP连接池
  6. 【设备默认口令+弱口令】大道至简
  7. OTP升级(20.3到21.3)
  8. 亚马逊关键词上首页怎么操作?
  9. Python 爬虫总结——案例代码
  10. 中国信息化系统集成行业协会:计算机系统集成行业还有发展空间么?