1. 猜数字游戏
需要用到的点
1. 随机数种子,需要用到math/rand库和time库
在使用时先设置随机数种子再在需要的地方用随机数函数生成随机数,这样生成的随机数
就是活的,不是一直是一个数
rand.Seed(time.Now().UnixNano())//设置随机数种子
Num:=rand.Intn(max)//生成一个最大值为max的随机数并将它赋值给Num
2.格式化输入scanf()这个方法有个bug,将被赋值的变量放在for里面输入一个值会循环两次,查了网上关于这个问题的说法——我猜应该是Windows上回车键产生的是"\r\n"。
scanf这类方法的工作方式都比较诡异,我觉得是一个历史遗留的设计错误。
解决方法,先尝试将代码改成fmt.Scanf("%d\n",&num) 试下看看(这里"\n"不是表示它吃掉换行符,而是表示消耗掉其后的其它空白字符),不过这样在LINUX上则行不通了。
原网址:go - 这一段代码为什么会判断两次 - SegmentFault 思否
另一种避免该问题的方法:引入bufio和os库
先设置输入流(可能是实例化方法?)stdin := bufio.NewReader(os.Stdin)
然后在需要输入字符的地方 fmt.Fscan(stdin, &num)
stdin.ReadString('\n')
指定了字符结束的地方是”\n”就不会引发问题
`package main
import (
"fmt"
"math/rand"
"time"
)
func main() {
var i int
max := 100
rand.Seed(time.Now().UnixNano()) //设置随机数种子
number := rand.Intn(max)
fmt.Println(number)
for j := 5; j >= 0; j-- {
fmt.Scanf("%d\n", &i)
if i == number {
fmt.Println("猜对了")
break
} else if i > number {
fmt.Printf("猜大了,还有%d次机会\n", j)
continue
} else if i < number {
fmt.Printf("猜小了,还有%d次机会\n", j)
continue
} else {
fmt.Printf("请输入正确的输入,还有%d次机会\n", j)
continue
}
}
}`
2. 用彩云api弄个控制台字典
因为技术有限所以没法弄别的api
先生成函数体,(用的是Windows系统的edge浏览器)
先右键->检查->在上方的选项卡里面找到“网络”栏
然后在彩云翻译网随便翻译一个单词
翻译完了以后在网络栏的第一个子导航栏里面有一个“全部”栏
在那个栏里面找到名称为“dict”的一个请求(可能有多个,找有字的那个)
比如这个
在那个dict字段处右键->复制->复制为cURL(bash)
然后打开Convert curl commands to Go (curlconverter.com)选择go语言
将刚刚复制的内容粘贴,这样我们就得到了一个函数体
将得到的内容直接粘贴到编辑器里面
这段代码是可以直接运行的,来看主函数
`package main
import (
"fmt"
"io"
"log"
"net/http"
"strings"
)
func main() {
client := &http.Client{}
var data = strings.NewReader({"trans_type":"en2zh","source":"good"})
req, err := http.NewRequest("POST", "api.interpreter.caiyunai.com/v1/dict", data)
if err != nil {
log.Fatal(err)
}
req.Header.Set("authority", "api.interpreter.caiyunai.com")
req.Header.Set("accept", "application/json, text/plain, /")
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("app-name", "xy")
req.Header.Set("content-type", "application/json;charset=UTF-8")
req.Header.Set("device-id", "c241d94a4f77332a8bff09bc8c4b3223")
req.Header.Set("origin", "fanyi.caiyunapp.com")
req.Header.Set("os-type", "web")
req.Header.Set("os-version", "")
req.Header.Set("referer", "fanyi.caiyunapp.com/")
req.Header.Set("sec-ch-ua", "Not/A)Brand";v="99", "Microsoft Edge";v="115", "Chromium";v="115")
req.Header.Set("sec-ch-ua-mobile", "?0")
req.Header.Set("sec-ch-ua-platform", "Windows")
req.Header.Set("sec-fetch-dest", "empty")
req.Header.Set("sec-fetch-mode", "cors")
req.Header.Set("sec-fetch-site", "cross-site")
req.Header.Set("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36 Edg/115.0.1901.183")
req.Header.Set("x-authorization", "token:qgemv4jr1y38jyq6vhvi")
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)
}`
13行的data就是浏览器向服务端发送的数据,用了一个构造结构体的方法
“source”:“good”就是我们输入的单词,他和转换语言的类型en2zh被封装在结构体中
然后用http包里面的方法http.NewRequest(method(get/post),URL,body(要传输的数据内容))来构建request请求
下面的if语句用于获取并且抛出异常
在下面的set方法用于向请求中增加字段,下面的一系列set都是
还可以用req.Header.Add()来添加,这两者可以用req.Header.Get()来获取添加的信息
下面的resp,err:=client.Do(req)用来获取服务器的response
在下面io.ReadAll()将返回的Body转为了字节数组,返回到bodyText里面
最后打印字节数组
这样你的控制台里面就会出现一大串返回,其中包含了我们需要获取的信息,接下来用了将返回的数组用结构体包装然后从结构体中提取信息的方式获取我们想要的输出结果
先要获取结构体
从之前获取函数体的地方找到预览然后复制object再打开JSON转Golang Struct - 在线工具 - OKTools将它转换为结构体并复制在你的函数中
`package main
import (
"encoding/json"
"fmt"
"io"
"log"
"net/http"
"strings"
)
type DictResponse struct {
Rc int json:"rc"
Wiki struct {
} 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 trans(word string) {
client := &http.Client{}
w := fmt.Sprintf("%s", word)
//fmt.Println(w)
var data = strings.NewReader({"trans_type":"en2zh","source": + w + })
req, err := http.NewRequest("POST", "api.interpreter.caiyunai.com/v1/dict", data)
if err != nil {
log.Fatal(err)
}
req.Header.Set("authority", "api.interpreter.caiyunai.com")
req.Header.Set("accept", "application/json, text/plain, /")
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("app-name", "xy")
req.Header.Set("content-type", "application/json;charset=UTF-8")
req.Header.Set("device-id", "c241d94a4f77332a8bff09bc8c4b3223")
req.Header.Set("origin", "fanyi.caiyunapp.com")
req.Header.Set("os-type", "web")
req.Header.Set("os-version", "")
req.Header.Set("referer", "fanyi.caiyunapp.com/")
req.Header.Set("sec-ch-ua", "Not/A)Brand";v="99", "Microsoft Edge";v="115", "Chromium";v="115")
req.Header.Set("sec-ch-ua-mobile", "?0")
req.Header.Set("sec-ch-ua-platform", "Windows")
req.Header.Set("sec-fetch-dest", "empty")
req.Header.Set("sec-fetch-mode", "cors")
req.Header.Set("sec-fetch-site", "cross-site")
req.Header.Set("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36 Edg/115.0.1901.183")
req.Header.Set("x-authorization", "token:qgemv4jr1y38jyq6vhvi")
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)
if resp.StatusCode != 200 {
log.Fatal("errorCode:", resp.StatusCode, "body", string(bodyText))
}
var dr DictResponse
err = json.Unmarshal(bodyText, &dr)
if err != nil {
log.Fatal(err)
}
//fmt.Printf("%#v\n", dr)
fmt.Println(w, "英音:", dr.Dictionary.Prons.En, "美音:", dr.Dictionary.Prons.EnUs)
for _, item := range dr.Dictionary.Explanations {
fmt.Println(item)
}
}
func main(){
trans("good")
}`
最后用json.Unmarshal(bodyText, &dr)将json对象反序列化为我们的结构体
序列化是把对象转换成数据形式(json形式)传输,反序列化就是把数据还原成对象
(可能类似于数据报的封装?)
最后打印结构体中的信息
运行效果