Go语言学习笔记
在Go语言的实战案例,王克纯老师用猜谜游戏、在线词典和SOCKS5代理这三个实例让我们真正上手Go语言。
在猜谜游戏中,程序首先需要生成一个介于1到100之间的随机整数,然后提示玩家进行猜测。玩家每输入一个数字,程序应告诉玩家这个猜测的值是高于还是低于生成的随机数,并且让玩家再次猜测。如果猜对了,就告诉玩家胜利并且退出程序。在该实例中,可以让我了解Go语言是如何导入包,如何定义变量、打印数字,如何进行for循环和if判断。
import (
"bufio"
"fmt"
"math/rand"
"os"
"strconv"
"strings"
"time"
)
func main() {
maxNum := 100
rand.Seed(time.Now().UnixNano())
secretNumber := rand.Intn(maxNum)
//fmt.Println("The scret number is ", secretNumber)
fmt.Println("Please input your guess")
reader := bufio.NewReader(os.Stdin)
for {
input, err := reader.ReadString('\n')
if err != nil {
fmt.Println("An error occured while reading input. Please try again", err)
continue
}
input = strings.TrimSuffix(input, "\r\n")
guess, err := strconv.Atoi(input)
if err != nil {
fmt.Println("Invalid input. Please enter an integer value")
//return
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
}
}
}
对于在线词典,应实现一个在线单词查询功能,使用户在命令行里面查询一个单词,调用第三方的API查询到单词的翻译并打印出来。其实现思路为:通过Go语言发送http请求,获取用户输入英文单词的音标以及汉语解释等信息,并通过fmt.Println函数展示部分翻译内容。
主函数
import (
"fmt"
"os"
"sync"
"time"
)
func main() { //此在线词典程序需要在 Git Bash终端命令行运行,如输入 go run *.go hello
start := time.Now()
if len(os.Args) != 2 { // Args 保存命令行参数,以程序名称开头,这里第2个参数为要查询的单词
fmt.Fprintf(os.Stderr, `usage: simpleDict WORD
example: simpleDict hello
`) // Fprintf() 根据格式说明符格式化并写入 os.Stderr 。它返回写入的字节数和遇到的任何写入错误。
os.Exit(1)
}
word := os.Args[1]
wg := sync.WaitGroup{} // WaitGroup() 等待一组 goroutine 完成,主 goroutine 调用 Add() 来设置要等待的 goroutine 的数量,然后每个 goroutine 运行并在完成时调用Done(),同时, Wait()可以用来阻塞,直到所有的 goroutine 都完成
wg.Add(2) //将可能为负的增量添加到 WaitGroup() 计数器,如果计数器变为零,则所有在 Wait() 上阻塞的 goroutine 都会被释放,如果计数器变为负数,请添加错误处理
go QueryCaiYun(word, &wg)
go QueryBaiDu(word, &wg)
wg.Wait()
finish := time.Now()
fmt.Println("runtime:", finish.Sub(start))
}
Socks5代理是一种网络代理协议,可以通过中间人代理客户端和服务器之间的通信。它的主要优点是可以通过不同的身份验证方式和地址类型,包括 IPv4、IPv6 和域名,来进行连接,从而使代理使用更加灵活。
我认为在这三个案例中,Socks5代理是比较难的,目前还没有实现出来,等实现出来后将会另外写一篇笔记进行详细描述。