一:在go语言基础学习的过程中思考的问题
1.如何在使用switch语句的时候同时执行case和default
在go语言中switch语句有一个小小的规定,sitch语句中的case在书写的时候不加break终止,但在运行的时候程序会默认加上break,别的语言在不加的时候会默认运行匹配的case语句和default语句,所以我想了一种无聊的方法可以假装执行case和default。代码示例如下:
package main
func main() {
a := 2
switch a {
case 1:
println("1")
goto defaultCase
case 2:
println("2")
goto defaultCase
case 3:
println("3")
goto defaultCase
default:
println("default")
}
defaultCase:
println("goto default")
}
简单使用一个goto, 实现一个假的default,其实没有多大必要,纯纯因为我好奇。
2.随机数生成样例中让每次生成随机数都一样
rand.Seed(time.Now().UnixNano())
这个函数不是用来生成随机数种子,通过调用 rand.Seed 函数并传入当前时间的纳秒级 Unix 时间戳(time.Now().UnixNano()),可以确保每次程序运行时都使用不同的种子,从而生成不同的随机数序列。但是如果我们让(time.Now().UnixNano())这个东西变成固定的值生成的随机数不就是固定的了。
package main
import (
"fmt"
"math/rand"
)
func main() {
maxNum := 100
rand.Seed(42)
secretNum := rand.Intn(maxNum)
fmt.Println(secretNum)
}
二:第一道课后题(修改代码使用fmt.Scanf来简化代码实现)
原本的代码是从用函数bufio.NewReader(os.Stdin)以及render.ReadString('\n')实现的,要考虑很多东西,比如去除换行符,转为int类型,上面这些操作都可以下面两句代码代替
var guess int
_, err := fmt.Scanf("%d\n", &guess)
完整代码
package main
import (
"fmt"
"math/rand"
"time"
)
func main() {
maxNum := 100
rand.Seed(time.Now().UnixNano())
//rand.Seed(42)
secretNum := rand.Intn(maxNum)
fmt.Println("The secret number is:", secretNum)
fmt.Println("请输入你猜的数字")
//render := bufio.NewReader(os.Stdin)
for {
// 读取一行输入
//input, err := render.ReadString('\n')
//if err != nil {
// fmt.Println(err)
//}
//// 去除换行符
//input = strings.TrimSuffix(input, "\n")
//
//// 转换为int
//guess, err := strconv.Atoi(input)
//if err != nil {
// fmt.Println(err)
//}
// 一行搞定
var guess int
_, err := fmt.Scanf("%d\n", &guess)
if err != nil {
fmt.Println(err)
}
if guess > secretNum {
fmt.Println("猜大了")
continue
} else if guess < secretNum {
fmt.Println("猜小了")
continue
} else {
fmt.Println("猜对了")
break
}
}
}
三:百度翻译引擎在线词典
1.简单展示一下结果
我没有对结果进行删减,所以生成的有点多,但是将就是一个词典,能看。
自我认为写的还挺好,就是没有音标不知道咋回事,可能百度翻译他没带。
2.改造流程
事先说明我用的edge浏览器,谷歌浏览器我也试了一下,两个基本上差不多,首先第一步,进入到百度翻译-您的超级翻译伙伴(文本、文档翻译)里面,然后点击F12进入到检查页面,点击翻译后,进入网络,会有一个名字sug的请求,如下图所示,我鼠标点击的地方。
然后右键点击复制进入到复制页面,点击复制curl(bash)
复制成功后进入到字节官方提供的网站curlconverter.com/go/ 进行代码生成,生成代码如下:
package main
import (
"fmt"
"io"
"log"
"net/http"
"strings"
)
func main() {
client := &http.Client{}
var data = strings.NewReader(`kw=good`)
req, err := http.NewRequest("POST", "https://fanyi.baidu.com/sug", data)
if err != nil {
log.Fatal(err)
}
req.Header.Set("Accept", "*/*")
req.Header.Set("Accept-Language", "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6")
req.Header.Set("Connection", "keep-alive")
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
req.Header.Set("Cookie", `PSTM=1718883789; BIDUPSID=577BE47A9DCAF8C1C40CF4410F88FAF0; BAIDUID=F5021431591B84E9AE01C9349150C158:FG=1; H_WISE_SIDS=60325_60340_60346_60364_60360; H_WISE_SIDS_BFESS=60325_60340_60346_60364_60360; BAIDUID_BFESS=F5021431591B84E9AE01C9349150C158:FG=1; ZFY=rtzV9wZ:AIucm5y1a:BdYdIHXwwlwthctnP4g:BBEh3o10:C; BAIDU_WISE_UID=wapp_1719583056895_522; H_PS_PSSID=60340_60346_60364_60360_60382; __bid_n=19085bf8cf374563673bd3; ab_sr=1.0.1_YzdjYTAzY2U3MjI3YjA5Yzk4N2ZjNGVlNTUxZDBjOWVkZGI2NjZiMmI5ZTg5Y2IwZDg3MTY2ZDJlNWZlMzdhODlkMGY4ZGQ5ODg5ODE4MmNmNmJmN2Y0NGEyNjAwNTI3OWRlZDAwOGE2NjI4Y2JhMDYwYWQ3MmUzMWRjM2MwYTk0MGVjZjQ4ZWViZDE3NzVjZTVhNzQ5MDNkNzBmYTAyZTJmNWNjZGE5NGIzZmM5Nzc0NDVjMzk4NGQ4Yjk1NTMw; RT="z=1&dm=baidu.com&si=a33a0aed-3575-45ca-be1d-0492442b0bb0&ss=m31aw7un&sl=1&tt=rl&bcn=https%3A%2F%2Ffclog.baidu.com%2Flog%2Fweirwood%3Ftype%3Dperf&ld=1jq"`)
req.Header.Set("Origin", "https://fanyi.baidu.com")
req.Header.Set("Referer", "https://fanyi.baidu.com/mtpe-individual/multimodal")
req.Header.Set("Sec-Fetch-Dest", "empty")
req.Header.Set("Sec-Fetch-Mode", "cors")
req.Header.Set("Sec-Fetch-Site", "same-origin")
req.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36 Edg/130.0.0.0")
req.Header.Set("sec-ch-ua", `"Chromium";v="130", "Microsoft Edge";v="130", "Not?A_Brand";v="99"`)
req.Header.Set("sec-ch-ua-mobile", "?0")
req.Header.Set("sec-ch-ua-platform", `"Windows"`)
resp, err := client.Do(req)
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()
bodyText, err := io.ReadAll(resp.Body)
if err != nil {
log.Fatal(err)
}
fmt.Printf("%s\n", bodyText)
}
我们根据课程上面提供的的代码对上面代码进行部分改装,改装部分的代码为:
我们将代码单独放在函数里面,将要查询的单词传进来,然后运行代码,查看一下响应体:
首先解释一下为什么是这样的乱码,因为我们的请求格式是json形式的,返回来的相应也一样,所以就成这样了,我们简单用代码转一下就可以了。得到请求后本来是用字节提供的网站自动构建成结构体的,但是那个网站过期了,所以就只能自己简单的手转一下了,然后通过自己构建的结构体解析一下响应。到这里基本就结束了,完整代码我贴在最后面了。
这样就简单实现了。
3.完成代码演示
package main
import (
"encoding/json"
"fmt"
"io"
"log"
"net/http"
"os"
"strings"
)
// Entry 表示一个词条
type Entry struct {
K string `json:"k"` // 关键词
V string `json:"v"` // 对应的值
}
// Response 表示整个响应结构
type Response struct {
Errno int `json:"errno"` // 错误码
Data []Entry `json:"data"` // 词条列表
Logid int `json:"logid"` // 日志ID
}
func query(word string) {
client := &http.Client{}
// 构建请求体
data := strings.NewReader(fmt.Sprintf("kw=%s", word))
//var data = strings.NewReader(`kw=good`)
req, err := http.NewRequest("POST", "https://fanyi.baidu.com/sug", data)
if err != nil {
log.Fatal(err)
}
req.Header.Set("Accept", "*/*")
req.Header.Set("Accept-Language", "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6")
req.Header.Set("Connection", "keep-alive")
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
req.Header.Set("Cookie", `PSTM=1718883789; BIDUPSID=577BE47A9DCAF8C1C40CF4410F88FAF0; BAIDUID=F5021431591B84E9AE01C9349150C158:FG=1; H_WISE_SIDS=60325_60340_60346_60364_60360; H_WISE_SIDS_BFESS=60325_60340_60346_60364_60360; BAIDUID_BFESS=F5021431591B84E9AE01C9349150C158:FG=1; ZFY=rtzV9wZ:AIucm5y1a:BdYdIHXwwlwthctnP4g:BBEh3o10:C; BAIDU_WISE_UID=wapp_1719583056895_522; H_PS_PSSID=60340_60346_60364_60360_60382; __bid_n=19085bf8cf374563673bd3; ab_sr=1.0.1_YzdjYTAzY2U3MjI3YjA5Yzk4N2ZjNGVlNTUxZDBjOWVkZGI2NjZiMmI5ZTg5Y2IwZDg3MTY2ZDJlNWZlMzdhODlkMGY4ZGQ5ODg5ODE4MmNmNmJmN2Y0NGEyNjAwNTI3OWRlZDAwOGE2NjI4Y2JhMDYwYWQ3MmUzMWRjM2MwYTk0MGVjZjQ4ZWViZDE3NzVjZTVhNzQ5MDNkNzBmYTAyZTJmNWNjZGE5NGIzZmM5Nzc0NDVjMzk4NGQ4Yjk1NTMw; RT="z=1&dm=baidu.com&si=a33a0aed-3575-45ca-be1d-0492442b0bb0&ss=m31aw7un&sl=1&tt=rl&bcn=https%3A%2F%2Ffclog.baidu.com%2Flog%2Fweirwood%3Ftype%3Dperf&ld=1jq"`)
req.Header.Set("Origin", "https://fanyi.baidu.com")
req.Header.Set("Referer", "https://fanyi.baidu.com/mtpe-individual/multimodal")
req.Header.Set("Sec-Fetch-Dest", "empty")
req.Header.Set("Sec-Fetch-Mode", "cors")
req.Header.Set("Sec-Fetch-Site", "same-origin")
req.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36 Edg/130.0.0.0")
req.Header.Set("sec-ch-ua", `"Chromium";v="130", "Microsoft Edge";v="130", "Not?A_Brand";v="99"`)
req.Header.Set("sec-ch-ua-mobile", "?0")
req.Header.Set("sec-ch-ua-platform", `"Windows"`)
resp, err := client.Do(req)
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()
bodyText, err := io.ReadAll(resp.Body)
var dictResponse Response
err = json.Unmarshal(bodyText, &dictResponse)
if dictResponse.Errno != 0 {
log.Fatalf("bad request: %s", dictResponse.Errno)
}
//裁剪一下
input := dictResponse.Data
for i := 0; i < len(input); i++ {
fmt.Println(input[i].V)
}
//fmt.Println(dictResponse.Data)
if err != nil {
log.Fatal(err)
}
//fmt.Printf("%s\n", bodyText)
}
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)
}