方向三:课后作业-Go 语言的实战案例 | 豆包MarsCode AI 刷题

85 阅读2分钟

课后作业

  1. 修改第一个例子猜谜游戏里面的最终代码,使用fmt.Scanf来简化代码实现
  2. 修改第二个例子的命令行词典里面的最终代码,增加另一种翻译引擎的支持
  3. 在上一步骤的基础上,修改代码实现并行请求两个翻译引擎来提高响应速度

问题一

bufio.NewReader(os.Stdin)与fmt.Scanf()的区别

1. bufio.NewReader(os.Stdin)

bufio.NewReader 提供了一种通过缓冲读取输入的方法,适合处理整行文本输入或需要灵活控制输入的情况。

2. fmt.Scanf()

fmt.Scanf() 是 Go 提供的一种格式化输入方式,适合读取固定格式的数据(如整数、浮点数、字符串等)。

修改方法

    //使用
    var input string
    var err error
    _,err = fmt.Scanf("%s", &input)
    guess, err := strconv.Atoi(input)
    
    //代替
    reader := bufio.NewReader(os.Stdin)
    input = strings.Trim(input, "\r\n")
    guess, err := strconv.Atoi(input)

问题二

步骤:仿照抓彩云小译的包,抓必应翻译

www.bing.com/translator?…

image.png 复制为curl(bash), 再使用在线curl转go代码,得到可以发get请求的代码

得到响应,用json转go结构体,将响应结果写入结构体

[{"translations":[{"text":"快乐","transliteration":{"text":"kuàilè","script":"Latn"},"to":"zh-Hans","sentLen":{"srcSentLen":[5],"transSentLen":[2]}}],"detectedLanguage":{"language":"en"}}]
//核心字段:Translations.Test,Translations.Transliteration

type JSONData []struct {
	Translations []struct {
		Text string `json:"text"`
		Transliteration struct {
			Text string `json:"text"`
			Script string `json:"script"`
		} `json:"transliteration"`
		To string `json:"to"`
		SentLen struct {
			SrcSentLen []int `json:"srcSentLen"`
			TransSentLen []int `json:"transSentLen"`
		} `json:"sentLen"`
	} `json:"translations"`
	DetectedLanguage struct {
		Language string `json:"language"`
	} `json:"detectedLanguage"`
}

问题三

在上一步骤的基础上,修改代码实现并行请求两个翻译引擎来提高响应速度

这里我使用了go.mod来维护文件夹关系,给彩云小译和bing拆分为两个文件夹,方便维护

image.png

package main

import (
	"fmt"
	"sync"
	"v5-myVersion/caiyunxiaoyi"
	"v5-myVersion/bingTranslate"
)

func main() {
	fmt.Printf("请输入要查询的单词:")
	var word string
	_, err := fmt.Scanf("%s", &word)
	if err != nil {
		fmt.Println("单词输入错误")
		return
	}
	// 使用 WaitGroup 来同步并行任务
	var wg sync.WaitGroup
	wg.Add(2) // 等待两个 goroutine 完成
	// 并行调用翻译引擎
	go func() {
		defer wg.Done() // 任务完成,减1
		caiyunxiaoyi.SearchFromCaiYunXaioYi(word)
	}()
	go func() {
		defer wg.Done() // 任务完成,减1
		bingTranslate.SearchFromBingTranslate(word)
	}()
	// 等待所有并行任务完成
	wg.Wait()
}
  • 同步机制

    • 使用 sync.WaitGroup 确保主线程会等待两个翻译请求完成后再退出,而不会提前终止。
  • 通道关闭

    • WaitGroup 完成后关闭通道,确保数据消费正常且无资源泄漏。

运行结果:

image.png


番外:豆包MarsCode AI练中学的使用

AI练中学提供了基于linux/amd64、go 1.22.3版本的运行环境,我们不用配置环境及其环境变量即可运行go代码

    houduanrumen---Go-yuyanyuanliyushijian go version 
    go version go1.22.3 linux/amd64

集成了豆包MarsCode AI的在线ide,更方便我们入门Go语言,有语法、算法问题都可问它

image.png

我们可以在工作区新建自己的文件夹,开放度十足!