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,可以优化掉bufio和os包及相关代码。
实现过程
我们主要修改输入部分及对输入的处理
首先定义一个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语言进阶与依赖管理的学习进行的实践内容,记录了本次实践的基本思路和实现过程,在亲身完成本次实践项目的过程中,对于自己思路上的梳理和实现上颇有收获。