这是我参与「第三届青训营-后端场」笔记创作活动的第1篇笔记
一、基于够浪实现猜数字游戏
1. 版本一
package main
import (
"fmt"
"math/rand"
)
func main() {
maxNum := 100 // 设置生成随机数的最大值
secretNumber := rand.Intn(maxNum) // 生成一个小于maxNum的随机整数
fmt.Println("The secret number is ", secretNumber)
}
这里我们会发现,生成的随机数字一直是81,因为我们没有设置随机数种子。
2. 版本二
package main
import (
"fmt"
"math/rand"
"time"
)
func main() {
maxNum := 100 // 设置生成随机数的最大值
rand.Seed(time.Now().UnixNano()) // 设置随机数种子,一般都是使用时间戳
secretNumber := rand.Intn(maxNum) // 生成一个小于maxNum的随机整数
fmt.Println("The secret number is ", secretNumber)
}
现在生成的随机数就不是固定的了。
3.版本三
package main
import (
"bufio"
"fmt"
"math/rand"
"os"
"strconv"
"strings"
"time"
)
func main() {
maxNum := 100
rand.Seed(time.Now().UnixNano())
secretNumber := rand.Intn(maxNum)
fmt.Println("The secret number is ", secretNumber)
fmt.Println("Please input your guess")
reader := bufio.NewReader(os.Stdin)
input, err := reader.ReadString('\n')
if err != nil {
fmt.Println("An error occured while reading input. Please try again", err)
return
}
input = strings.TrimSuffix(input, "\n")
guess, err := strconv.Atoi(input)
if err != nil {
fmt.Println("Invalid input. Please enter an integer value")
return
}
fmt.Println("You guess is", guess)
}
在此版本中,主要是增加了一些交互功能,让用户输入信息。
4. 版本四
package main
import (
"bufio"
"fmt"
"math/rand"
"os"
"strconv"
"strings"
"time"
)
func main() {
maxNum := 100
rand.Seed(time.Now().UnixNano())
secretNumber := rand.Intn(maxNum)
fmt.Println("The secret number is ", secretNumber)
fmt.Println("Please input your guess")
reader := bufio.NewReader(os.Stdin)
input, err := reader.ReadString('\n')
if err != nil {
fmt.Println("An error occured while reading input. Please try again", err)
return
}
input = strings.TrimSuffix(input, "\n")
guess, err := strconv.Atoi(input)
if err != nil {
fmt.Println("Invalid input. Please enter an integer value")
return
}
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!")
}
}
在这个版本中猜数字游戏才有点雏形了,不过还是不够,用户只能输入一次。
5. 版本五
package main
import (
"bufio"
"fmt"
"math/rand"
"os"
"strconv"
"strings"
"time"
)
func main() {
maxNum := 100
rand.Seed(time.Now().UnixNano())
secretNumber := rand.Intn(maxNum)
// fmt.Println("The secret number is ", secretNumber)
fmt.Println("Please input your guess")
reader := bufio.NewReader(os.Stdin)
for {
input, err := reader.ReadString('\n')
if err != nil {
fmt.Println("An error occured while reading input. Please try again", err)
continue
}
input = strings.TrimSuffix(input, "\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
}
}
}
至此,基于够浪实现的猜数字游戏才算完整实现
6. 版本六【作业】
package main
import (
"fmt"
"math/rand"
"strconv"
"strings"
"time"
)
func main() {
maxNum := 100
rand.Seed(time.Now().UnixNano())
secretNumber := rand.Intn(maxNum)
// fmt.Println("The secret number is ", secretNumber)
fmt.Println("Please input your guess")
var input string
count := 0
for {
_, err := fmt.Scanf("%s", &input)
if err != nil {
fmt.Println("An error occured while reading input. Please try again", err)
continue
}
count++
input = strings.TrimSuffix(input, "\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.Printf("Correct, you Legend! and you input %d times", count)
break
}
}
}
这个版本是基于版本五,只不过是把之前的用Reader读取用户输入信息换成fmt包实现。
基于够浪实现单词翻译
1. 原理
主要是使用第三方的翻译接口来实现,和爬虫类似。
2. 步骤
- 打开360翻译网站
- 打开抓包工具
- 找到
Network并点击XHR选项卡
- 发送一次翻译请求
- 如图复制地址到[curlconverter.com/#go]
- 找到请求的响应体并复制到[oktools.net/json2go]
- 大功告成
3. 代码实现
因为360翻译接口的原因,传入1表示英->中,传入0表示中->英
package main
import (
"encoding/json"
"fmt"
"io/ioutil"
"log"
"net/http"
"os"
)
type AutoGenerated struct {
Data struct {
Explain struct {
EnglishExplain []interface{} `json:"english_explain"`
Word string `json:"word"`
Caiyun struct {
Info struct {
Lbsynonym []string `json:"lbsynonym"`
Antonym []interface{} `json:"antonym"`
WordExchange []interface{} `json:"word_exchange"`
} `json:"info"`
} `json:"caiyun"`
RelatedWords []string `json:"related_words"`
WordLevel []string `json:"word_level"`
Exsentence []struct {
Title string `json:"Title"`
Body string `json:"Body"`
URL string `json:"Url"`
} `json:"exsentence"`
Phonetic struct {
NAMING_FAILED string `json:"英"`
} `json:"phonetic"`
WebTranslations []struct {
Translation string `json:"translation"`
Example string `json:"example"`
} `json:"web_translations"`
Translation []string `json:"translation"`
Speech struct {
a string `json:"美"`
b string `json:"英"`
} `json:"speech"`
} `json:"explain"`
Fanyi string `json:"fanyi"`
SpeakURL struct {
SpeakURL string `json:"speak_url"`
TSpeakURL string `json:"tSpeak_url"`
WordSpeakURL string `json:"word_speak_url"`
WordType string `json:"word_type"`
} `json:"speak_url"`
Vendor string `json:"vendor"`
} `json:"data"`
Error int `json:"error"`
Msg string `json:"msg"`
}
func query(eng string, word string) {
client := &http.Client{}
req, err := http.NewRequest("POST", fmt.Sprintf("https://fanyi.so.com/index/search?eng=%s&validate=&ignore_trans=0&query=%s", eng, word), nil)
if err != nil {
log.Fatal(err)
}
req.Header.Set("authority", "fanyi.so.com")
req.Header.Set("accept", "application/json, text/plain, */*")
req.Header.Set("accept-language", "en-GB,en;q=0.9,zh-CN;q=0.8,zh;q=0.7")
req.Header.Set("content-length", "0")
req.Header.Set("cookie", "QiHooGUID=D6D239C8B342B5A344CD62849BE69049.1651933029570; Q_UDID=14169c1b-9559-703f-7827-9265391766a9; __guid=144965027.1558171227539933000.1651933030305.476; count=1; __huid=114LIw9Nvn1GVXhcAW88WaeRZ9h1jKtNPRhrM1Q3CE4jo%3D; gtHuid=1")
req.Header.Set("origin", "https://fanyi.so.com")
req.Header.Set("pro", "fanyi")
req.Header.Set("referer", "https://fanyi.so.com/")
req.Header.Set("sec-ch-ua", `" Not A;Brand";v="99", "Chromium";v="101", "Google Chrome";v="101"`)
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", "same-origin")
req.Header.Set("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.54 Safari/537.36")
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)
}
autoGenerated := AutoGenerated{}
err = json.Unmarshal(bodyText, &autoGenerated)
if err != nil {
return
}
fmt.Printf("%s\n", autoGenerated.Data.Fanyi)
}
func main() {
if len(os.Args) != 3 {
fmt.Fprintf(os.Stderr, `usage: simpleDict WORD
example: simpleDict hello
`)
os.Exit(1)
}
eng := os.Args[1]
word := os.Args[2]
query(eng, word)
}