Go语言的实战案例一 | 青训营笔记

69 阅读1分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 2 天

demo1. 猜拳游戏

func main() {  
   maxNum := 100  
   rand.Seed(time.Now().UnixNano())  
   secretNumber := rand.Intn(maxNum)  
   // fmt.Println("The secret number is ", secretNumber)  
  
   fmt.Println("Please input your guess")  
   reader := bufio.NewReader(os.Stdin)  
   // var reader string  
   // fmt.Scanf("%s", &reader)   for {  
      input, err := reader.ReadString('\n')  
      if err != nil {  
         fmt.Println("An error occured while reading input. Please try again", err)  
         continue  
      }  
      input = strings.Trim(input, "\r\n")  
  
      guess, err := strconv.Atoi(input)  
      if err != nil {  
         fmt.Println("Invalid input. Please enter an integer value")  
         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  
      }  
   }  
}

1. 随机数

rand.Seed(time.Now().UnixNano())
secretNumber := rand.Intn(maxNum)
  1. 初始化随机数

    time.Now().UnixNano()  // 获取当前的时间戳
    rand.Seed(time.Now().UnixNano())  // 初始化随机数或
    

    由于 Go 的 rand 产生的是伪随机数,所以如果不初始化随机数,将会导致每次重新启动程序时产生相同的随机数。

  2. 产生随机数

    rand.Intn(maxNum)  // 产生随机数,并作为返回值返回
    

2. bufio流

  1. 产生bufio流
    bufio.NewReader(rd io.Reader)  // 以 rd 产生一个新的 Reader,并且 buffer 拥有默认的大小
    
    os.Stdin  // Stdin  = NewFile(uintptr(syscall.Stdin), "/dev/stdin"), 以系统的输入流产生一个新文件
    
  2. 从流中读入数据
    input, err := reader.ReadString('\n')  // 读入数据,直到遇到 '\n'
    
    func (b *Reader) ReadString(delim byte) (string, error) { }  // ReadString读取直到输入中第一次出现delim
    

3. strings.Trim

  1. 去除字符串末尾的 \r\n
    strings.Trim(input, "\r\n")  // Trim返回字符串的一个片段,其中删除了剪切集中包含的所有前导和尾随Unicode代码点。
    
    值得注意的是:
    1. Windows回车键输入的是 \r\n
    2. Linux回车键输入的是 \n
    3. macOS回车键输入的是 \r

4. strconv.Atoi

  1. 将 string 转为 int
    for _, ch := range []byte(s) {  // 主要实现代码
       ch -= '0'  
       if ch > 9 {  
          return 0, &NumError{fnAtoi, s0, ErrSyntax}  
    	}  
       n = n*10 + int(ch)  
    }