Go语言实战案例 | 青训营笔记
这是我参与「第五届青训营 」伴学笔记创作活动的第 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语言实战案例 | 青训营笔记相关推荐
- 三个小项目入门Go语言|字节青训营笔记
前言 这是青训营的第一课,今天的课程比较快速的讲解了go语言的入门,并配合三个小的项目实践梳理所学知识点,这里详细回顾一下这三个项目,结合课后作业要求做一些代码补充,并附上自己的分析,青训期间的所有课 ...
- HTML+CSS实现按钮手风琴效果 | 青训营笔记
HTML+CSS实现按钮手风琴效果 | 青训营笔记 需求描述 HTML部分 CSS部分 完整代码 效果展示 这是我参与「第四届青训营」笔记创作活动的的第7天. 需求描述 实现一排居中的五个图标,默认为 ...
- Go语言上手(一) | 青训营笔记
这是我参与「第三届青训营 -后端场」笔记创作活动的的第一篇笔记. 文章目录 语法速览 基础语法 第一:类型 第二:内置库部分 json库的使用 时间库的使用 字符串和数字互转 os相关信息 实战项目 ...
- 字节跳动青训营笔记01
大家好,这里是我参加字节跳动[第五期青训营]的第一篇笔记.一小时多的课程里实现了快速入门Go语言,简要介绍了Go的优点,语法,包括与C语言的异同,以及map.切片等常用的数据结构:后半节课程主要介绍了 ...
- 【Go入门】Socks5代理服务器实现 翻译api调用 | 青训营笔记
这是我参与「第三届青训营 -后端场」笔记创作活动的的第一篇笔记. [课程一]Go基础 主要内容 第一节课主要介绍了go的语法基础,包括变量.循环分支.数组切片.函数方法.错误处理.字符串.格式化处理. ...
- Android基础第六天 | 字节跳动第四届青训营笔记
这是我参与「第四届青训营 」笔记创作活动的的第6天 端智能技术演进与实践 文章目录 端智能技术演进与实践 课程回顾 01 什么是端智能技术 1.1 端智能是什么? 1.2 为什么要做端智能? 1.3 ...
- 构建webpack知识体系 | 青训营笔记
这是我参与「第四届青训营 」笔记创作活动的的第4天. 进阶中高级前端工程师,对webpack打包构建工具的掌握是必不可少的.我也曾经看过许多webpack教程,但无非是记记某些模式怎么配置,根本就没有 ...
- GO语言的实战学习(猜谜游戏和在线词典)| 青训营笔记
一.GO语言的实战学习 1.1 前言 在上文我们急速学习了Go语言的入门,今天我们来学习一下Go语言的实战 本专栏代码,源码打包下载地址如下: https://download.csdn.net/do ...
- 存储与数据库 | 字节青训营笔记
目录 一.存储系统 1.什么是存储系统 2.存储系统的特点 3.RAID技术 RAID出现的背景 RAID 0 RAID 1 RAID 0+1 二.数据库 1.难道数据库和存储系统不一样吗 2.数据库 ...
最新文章
- Linux LVM卷挂载
- Android 仿微信小视频录制
- 关于使浏览器崩溃的代码尝试
- HTML5与CSS3基础教程第八版学习笔记16-21章
- TrojanDownloader简单分析
- 深度学习入门之PyTorch学习笔记:卷积神经网络
- c语言 将点同时保证x坐标从小到大,y坐标从小到大地排序,C语言第五六次作业.ppt...
- 添加notepad到右键菜单栏
- 【小项目】Vue 整合 Axios
- UVA1368 UVALive3602 ZOJ3132 DNA Consensus String【贪心】
- 话里话外:从纯技术顾问到业务咨询顾问的能力发展路径(上)
- groovy java to swift_groovy数据类型 - Groovy教程
- [ZZ] Maxwell 架构
- 小米手机设备锁定怎么强制解除
- 名帖317 沈尹默 行书《春蚕词》
- MySQL删除数据后,释放磁盘空间
- 人工神经网络英文简称,人工神经网络 英文
- JavaScript高阶
- 前端入门篇(八)表单
- 2011年年终珠三角为主的各种工种收入大全