DAY2 | Go语言的实战案例
1、猜数字游戏
package main
import (
"fmt"
"math/rand"
"time"
)
func main() {
maxNum := 100
rand.Seed(time.Now().UnixNano())
//rand.Seed后面加时间戳
secretNumber := rand.Intn(maxNum)
fmt.Println("The secret number is", secretNumber)
}
使用package main对包进行声明,main函数作为函数的入口点
"fmt"
: 这是Go语言的标准库中提供的格式化输入输出包,用于在控制台上打印输出。"math/rand"
: 这是Go语言的标准库中提供的用于生成随机数的包。"time"
: 这是Go语言的标准库中提供的用于时间相关操作的包。
首先定义一个设置随机数最大范围的变量maxNum,生成的随机数范围在0到maxNum-1
接着初始化随机数生成器,rand.Seed
是用来初始化伪随机数生成器的种子(seed)的函数。
在计算机中,由于随机数实际上是伪随机数,所以需要一个种子来初始化生成器。time.Now().UnixNano()
返回当前时间的时间戳,这个时间戳会不断变化,因此可以用时间戳初始化随机数种子,以确保每次程序运行时生成的随机数都是不同的。
最后将生成的随机数赋值给secretNum,打印出来
接下来再对代码进行改进
import (
"bufio"
"fmt"
"math/rand"
"os"
"strconv"
"strings"
"time"
)
"bufio"
: 提供带缓冲的 I/O 操作,用于读取用户输入。"os"
: 提供与操作系统交互的功能,这里用来访问标准输入。"strconv"
: 用于字符串和数字之间的转换。"strings"
: 用于处理字符串相关的操作。
1、reader := bufio.NewReader(os.Stdin)
: 创建一个 bufio.Reader
对象,用于从标准输入(键盘)读取用户输入。
2、加入了一个循环以便于让用户一直猜测
for {
input, err := reader.ReadString('\n')
if err != nil {
fmt.Println("An error occured while reading input. Please try again", err)
continue
}
input = strings.Trim(input, "\r\n")
guess, err := strconv.Atoi(input)
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
}
}
3、guess, err := strconv.Atoi(input)
: 使用 strconv.Atoi
函数将字符串类型的输入转换为整数类型,并将结果保存到 guess
变量中。同时,检查是否发生了错误。
4、将用户的输入转换为整数:guess, err := strconv.Atoi(input): 使用
strconv.Atoi函数将字符串类型的输入转换为整数类型,并将结果保存到
guess` 变量中。同时,检查是否发生了错误。
5、判断用户猜测是否正确,并给予反馈:
fmt.Println("You guess is", guess)
: 打印用户的猜测值。- 使用条件语句对用户猜测的数字进行判断,根据与
secretNumber
的比较给予相应的反馈。如果猜测的数字大于secretNumber
,则提示用户猜测过大;如果猜测的数字小于secretNumber
,则提示用户猜测过小。 - 如果用户猜测的数字等于
secretNumber
,则打印 "Correct, you Legend!" 并结束循环。
2、词典
通过调用彩云小译的API接口实现英汉翻译
导入依赖包
import (
"fmt"
"io/ioutil"
"log"
"net/http"
"strings"
)
"io/ioutil"
: 用于读取 HTTP 响应的主体内容。"log"
: 用于日志记录,这里用来处理错误信息。"net/http"
: 用于发送 HTTP 请求和处理响应。
-
创建HTTP客户端
client := &http.Client{}
创建一个名为client的客户端,使用默认配置
-
构建HTTP请求
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) }
创建一个POST请求,并且设置请求的URL以及请求体
strings.NewReader
函数用于将字符串转换为io.Reader
接口类型,以便将 JSON 数据作为请求体发送 -
设置HTTP请求头
req.Header.Set("Connection", "keep-alive") // ... (省略其他头部设置,类似上述设置) req.Header.Set("Cookie", "_ym_uid=16456948721020430059; _ym_d=1645694872")
-
发送HTTP请求并获取响应
resp, err := client.Do(req) if err != nil { log.Fatal(err) } defer resp.Body.Close()
使用 HTTP 客户端
client
发送 HTTP 请求,并获取响应。client.Do(req)
发送请求并返回响应 -
读取响应主体内容
bodyText, err := ioutil.ReadAll(resp.Body) if err != nil { log.Fatal(err) }
使用
ioutil.ReadAll
函数从 HTTP 响应主体中读取全部数据,并将结果保存在bodyText
变量中
改进思路:功能上新增英文词典查询的能力。用户只需在命令行中输入英文单词,程序就会向彩云小译的 API 发送请求,并输出该英文单词的中文解释以及一些其他相关信息
新增 "encoding/json"
包,用于处理 JSON 数据的编码和解码
首先定义结构体
type DictRequest struct {
TransType string `json:"trans_type"`
Source string `json:"source"`
UserID string `json:"user_id"`
}
type DictResponse struct {
// ... (省略了 DictResponse 的其他字段定义,与 JSON 数据对应)
}
DictRequest
和 DictResponse
,用于描述请求和响应的 JSON 数据的结构
再增加一个 query
函数:
func query(word string) {
// ... (函数体,用于发送 HTTP 请求和解析响应,获取词典数据)
}
用于向彩云小译的 API 接口发送 HTTP POST 请求,查询英文单词的词典数据。它使用 word
作为输入参数,表示要查询的英文单词
添加两个结构体DictRequest
和 DictResponse
request := DictRequest{TransType: "en2zh", Source: word}
buf, err := json.Marshal(request)
// ... (省略了后续的请求头设置和发送请求的代码)
var dictResponse DictResponse
err = json.Unmarshal(bodyText, &dictResponse)
// ... (省略了处理响应结果并打印的代码)
DictRequest
结构体构建请求的 JSON 数据,并使用 json.Marshal
将结构体转换为 JSON 字节流。而后,使用 json.Unmarshal
将获取的 JSON 数据转换为 DictResponse
结构体,以便处理和打印词典查询的结果
错误处理:在发送请求和处理响应时,通过使用 log.Fatal
记录错误并退出程序
命令行参数处理:通过 os.Args
获取用户输入的命令行参数,指示用户如何使用这个简单词典查询程序