Go语言的实战案例练习| 青训营

150 阅读2分钟

一.猜谜游戏

1. 生成随机数

首先生成随机数,但是rand.seed()好像已经被弃用,我在写的时候加上和删去seed都能生成随机数。 image.png
但是如果没有rand.seed()每次调用函数都会生成不同的随机数,有的话就不会 下面是生成随机数的函数

func getNumber() int {  
    maxNum := 100  
    rand.Seed(time.Now().UnixNano())  //有send
    secretNumber := rand.Intn(maxNum)  
    return secretNumber  
}

func main() {  
    secretNumber := getNumber()  
    c1 := getNumber()  
    fmt.Println(secretNumber)  //输出34
    fmt.Println(c1)            //输出34
    fmt.Println(getNumber())   //输出34
}

生成的数字每次调用都是不同的随机数

func getNumber() int {  
    maxNum := 100  
    secretNumber := rand.Intn(maxNum)  //无send
    return secretNumber  
}  
func main() {  
    secretNumber := getNumber()  
    c1 := getNumber()  
    fmt.Println(secretNumber)  //输出41
    fmt.Println(c1)            //输出52
    fmt.Println(getNumber())   //输出76
}

2. 获取输入数字

用 fmt.Scanln()可以获取用户输入的数据fmt.Scanln()可以根据数据类型将用户输入的数据进行类型转换

userNumber := 0   
fmt.Scanln(&userNumber)

下面是视频中老师的代码, 因为win系统中的enter代表\r\n,所以需要将两个都去掉

func main() {  
    maxNum := 100  
    secretNumber := rand.Intn(maxNum)  
    fmt.Println(secretNumber)  
    fmt.Println("Please input your guess")  
    reader := bufio.NewReader(os.Stdin)  
    input, err := reader.ReadString('\n')  
    if err != nil {  
        fmt.Println("error1", err)  
        return  
    }  
    input = strings.TrimSuffix(input, "\n")  
    input = strings.TrimSuffix(input, "\r")  
    guess, err := strconv.Atoi(input)  
    if err != nil {  
    fmt.Println("error2", err)  
    return  
    }  
    fmt.Println("you guess", guess)  
    }

3. 猜数字

我把猜数字的代码写在了secretfunc函数中, 用for循环当用户输入数字等于随机数时停止循环,在循环中用if判断数字大小

func getNumber() int {  
    maxNum := 100  
    secretNumber := rand.Intn(maxNum)  
    return secretNumber  
}  

func secretfunc(secretNumber int) {  
    userNumber := 0  
    fmt.Println("请输入0-100的数字")  
    fmt.Scanln(&userNumber)  
    for secretNumber != userNumber {  
        if userNumber > secretNumber {  
            fmt.Println("你输入的数偏大")  
        } else {  
            fmt.Println("你输入的数偏小")  
        }  
        fmt.Println("请重新输入")  
        fmt.Scanln(&userNumber)  
    }  
    fmt.Println("你猜对了")
}  

func main() {  
    secretNumber := getNumber()  
    fmt.Println(secretNumber)  
    secretfunc(secretNumber)  
}

二.在线词典

1. 抓包

在输入框中输入然后获取post

image.png

image.png

2. 代码生成

根据视频中老师的方法获取代码(需要翻墙) curlconverter.com/

image.png

3. 生成 request body

为了能够灵活输入编写结构体代码

type DictRequest struct {  
TransType string `json:"trans_type"`  
Source string `json:"source"`  
UserID string `json:"user_id"`  
}

用结构体数据代替刚开始的data数据

request := DictRequest{TransType: "en2zh", Source: "food"}  
buf, err := json.Marshal(request)  
if err != nil {  
log.Fatal(err)  
}  
var data = bytes.NewReader(buf)

4. 解析 response body

因为golang需要写一个结构体获取数据用网站oktools.net/json2go 生成结构体

image.png

然后用下面代码代替bodytext的输出,可以看到所有的数据

var DictResponse DictResponse  
err = json.Unmarshal(bodyText, &DictResponse)  
if err != nil {  
log.Fatal(err)  
}  
fmt.Printf("%#v", DictResponse)

5. 打印结果

只输出单词和单词的音标和含义

fmt.Println(word, "UK:", DictResponse.Dictionary.Prons.En, "US:", DictResponse.Dictionary.Prons.EnUs)  
for _, item := range DictResponse.Dictionary.Explanations {  
fmt.Println(item)  
}

6. 完善代码

让用户能够翻译自己输入的单词,外面添for循环只有当用户输入“111”时终止循环代码结束

word := "hello"  
fmt.Println("如果输入111终止程序")  
fmt.Println("请输入单词")  
fmt.Scanln(&word)  
for word != "111" {


fmt.Println(word, "UK:", DictResponse.Dictionary.Prons.En, "US:", DictResponse.Dictionary.Prons.EnUs)  
for _, item := range DictResponse.Dictionary.Explanations {  
fmt.Println(item)  
}  
fmt.Println("请输入单词")  
fmt.Scanln(&word)  
}

image.png