这是我参与「第五届青训营 」伴学笔记创作活动的第 1 天
一、本堂课重点内容:
- 基础语法
- 标准库
二、详细知识点介绍:
- 指定变量类型,如果没有初始化,则变量默认为零值。
- 根据值自行判定变量类型。
- 如果变量已经使用 var 声明过了,再使用 := 声明变量,就产生编译错误。
- Go 语言的 For 循环有 3 种形式,只有其中的一种使用分号。
和 C 语言的 for 一样: for init; condition; post { }
和 C 的 while 一样: for condition { }
和 C 的 for(;;) 一样: for { }
三、实践练习例子:
- 项目一:猜谜游戏
- 项目二:命令行词典
- 项目三:SOCKS5 代理
四、课后练习总结:
1、修改第一个例子猜谜游戏里面的最终代码,使用fmt.Scanf来简化代码实现
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
//reader := bufio.NewReader(os.Stdin)
for {
//input, err := reader.ReadString('\n') //原代码部分用bufio进行读取键盘输入
_, err := fmt.Scanf("%s\n", &input)//获取键盘输入
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
}
}
}
2、修改第二个例子命令行词典里面的最终代码,增加另一种翻译引擎的支持
3、在第二步的基础上,修改代码实现并行请求两个翻译引擎来提高响应速度
package main
import (
"bytes"
"encoding/json"
"fmt"
"io/ioutil"
"log"
"net/http"
"os"
)
//火山翻译请求体
type DictRequest2 struct {
Source string `json:"source"`//翻译来源
Words []string `json:"words"`//翻译的文字
SourceLanguage string `json:"source_language"`//原语言
TargetLanguage string `json:"target_language"`//目标语言
}
//火山翻译响应体
type DictResponse2 struct {
Details []struct {
Detail string `json:"detail"`
Extra string `json:"extra"`
} `json:"details"`
BaseResp struct {
StatusCode int `json:"status_code"`
StatusMessage string `json:"status_message"`
} `json:"base_resp"`
}
//火山翻译查询函数
func query2(word string) {
client := &http.Client{}
//var data = strings.NewReader(`{"source":"youdao","words":["good"],"source_language":"en","target_language":"zh"}`)
request := DictRequest2{Source: "youdao", Words: []string{word}, SourceLanguage: "en", TargetLanguage: "zh"}//构造请求体对象
buf, err := json.Marshal(request)//序列化为字节数组
if err != nil {
log.Fatal(err)
}
var data = bytes.NewReader(buf)//字节数组转换为io流
req, err := http.NewRequest("POST", "https://translate.volcengine.com/web/dict/detail/v1/?msToken=&X-Bogus=DFSzswVOQDaZVUEbSZ4/h34ELVcH&_signature=_02B4Z6wo00001HP3BOgAAIDDwwboIMts05Bz9wBAAH9AfgkPz2D5seB76Jp-URtvkiiOjzq7Ka75D1QEKvz.E1gsqOJ-IVKDaneoAeNThalCt1k3ZFx9wVWB65bXuu-tnbaZk-j5rMgpEhXl1a", data)//构造请求
if err != nil {
log.Fatal(err)
}
//设置相关请求头参数
req.Header.Set("authority", "translate.volcengine.com")
req.Header.Set("pragma", "no-cache")
req.Header.Set("cache-control", "no-cache")
req.Header.Set("accept", "application/json, text/plain, */*")
req.Header.Set("user-agent", "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36")
req.Header.Set("content-type", "application/json")
req.Header.Set("origin", "https://translate.volcengine.com")
req.Header.Set("sec-fetch-site", "same-origin")
req.Header.Set("sec-fetch-mode", "cors")
req.Header.Set("sec-fetch-dest", "empty")
req.Header.Set("referer", "https://translate.volcengine.com/mobile?category=&home_language=zh&source_language=detect&target_language=zh&text=good")
req.Header.Set("accept-language", "zh-CN,zh;q=0.9")
req.Header.Set("cookie", "x-jupiter-uuid=16738739264083148; i18next=zh-CN; s_v_web_id=verify_lcytbfv1_rUqOT0lu_jsul_4950_AlHl_TcwtMThccviN; ttcid=d9808dbca4c44fa58e865a5a001e796420; tt_scid=c-zlvY6TcLEwbxg5vRL-tdrAJ1TuH3M19n9OzXPzGSQyPuRlysRzkcOU7CqUWdpk2c20")
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)
}
var dictResponse DictResponse2
err = json.Unmarshal(bodyText, &dictResponse)//由json反序列化为响应结构体
if err != nil {
log.Fatal(err)
}
for _, item := range dictResponse.Details {
fmt.Printf("%v\n", item.Extra)
}
}
func main() {
if len(os.Args) != 2 {
fmt.Fprintf(os.Stderr, `usage: simpleDict WORD
example: simpleDict hello
`)
os.Exit(1)
}
word := os.Args[1]
go query1(word) //并行查询彩云小译
query2(word) //查询火山翻译
}