Go语言工程实践课后作业|青训营

88 阅读1分钟

Go语言工程实践

Go语言的高性能体现在第二节课有了初步的认知,goroutine以及其通过通信来共享内存的特点在高性能上帮助很大。其次,gomod对于Go项目的依赖管理也是在开发过程中意义重大,也认知一些基本的测试单元来对项目代码进行评估。最后学习了一个社区评论页面的项目实施,初步接触到了gogin框架来搭建goweb项目。

随机数——猜数字案例

修改猜谜游戏的代码并用fmt.scanf来实现并简化

//原代码
package main

import (
    "bufio"
    "fmt"
    "math/rand"
    "os"
    "strconv"
    "strings"
)

func main() {
    maxNUm := 100
    secretNum := rand.Intn(maxNUm)

    fmt.Println("Please input your guess")
    reader := bufio.NewReader(os.Stdin)
    for {
        input, err := reader.ReadString('\n')
        if err != nil {
            fmt.Println("err!!!")
            continue
        }

        input = strings.TrimSuffix(input, "\r\n")

        guess, err1 := strconv.Atoi(input)

        if err1 != nil {
            fmt.Println("input err!", err1)
            continue
        }
        fmt.Println("your guess is ", guess)
        if guess > secretNum {
            fmt.Println("big!")
        } else if guess < secretNum {
            fmt.Println("little!")
        } else {
            fmt.Println("yes")
            break
        }

    }
}

首先是对原代码的粘贴。

思路分析

使用fmt.Scanf 直接读取用户输入,并且解析为整数。这样避免了使用bufio.NewReader 和字符串处理的过程,代码更加简洁,同时,也可以处理输入错误并向用户提供相应提示。原代码调用了7个包来实现猜数功能,bufio os创建了一个新的bufio.Reader对象,该对象用于读取数据,若要简化并使用fmt.scanf,可以优化掉bufioos包及相关代码。

实现过程

我们主要修改输入部分及对输入的处理

首先定义一个input变量为string类型,再使用 fmt.Scanf函数从键盘读取一个字符串,将其储存在input变量中。也就是说,使用string包中的Trimspace函数,便移除了input字符串两段的所有空白字符串,然后复制回input,这个值便更新为去掉两端空白后的字符串。strings。TrimSpace可以确保程序班会因为这些额外的空格而出错,strconv.Atoi则将input中的字符转化为int形式以便后续的大小比较。而之后的部分代码和原代码几乎没有需要更改的部分。

最终实现

package main

import (  
    "fmt"  
    "math/rand"  
    "strconv"  
    "strings"  
    "time"  
 )  
  
func main() {
    rand.Seed(time.Now().UnixNano())
    maxNUm := 100
    secretNum := rand.Intn(maxNUm)

    fmt.Println("Please input your guess")
    var guess int
    for {
        _, err := fmt.Scanf("%d", &guess)
        if err != nil {
            fmt.Println("err!!!")
            continue
        }
        
        if err != nil {
            fmt.Println("input err!")
        }
        if guess > secretNum {
            fmt.Println("big!")
        } else if guess < secretNum {
            fmt.Println("little!")
        } else {
            fmt.Println("yes")
            break
        }
    }
}

若要进一步简化,可以尝试fmt.scanf直接读取int类型,将main 函数中部分功能独立成func也有助于后期的代码维护。

总结

在以上代码中,我们使用了string包中的Trimspace 函数。这个函数在处理用户输入时非常有用,因为用户可能会在输入的开始或结束处不小心添加额外的空格。 以上是我通过对Day2在Go语言进阶与依赖管理的学习进行的实践内容,记录了本次实践的基本思路和实现过程,在亲身完成本次实践项目的过程中,对于自己思路上的梳理和实现上颇有收获。