Go语言学习笔记|青训营笔记

73 阅读3分钟

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代理是比较难的,目前还没有实现出来,等实现出来后将会另外写一篇笔记进行详细描述。