Go语言的实践(一)| 青训营

75 阅读2分钟

一 猜字游戏

该游戏是在知道go的简单语法下进行的一个小实践,代码如下 ` package main

import ( "fmt" "math/rand" "time" )

func main() { rand.Seed(time.Now().UnixNano()) a := rand.Intn(50) var b int

for {
	fmt.Println("请你猜的数")
	fmt.Scanln(&b)
	
	if b > a {
		fmt.Println("大了")
	}
	
	if b < a {
		fmt.Println("小了")
	}
	
	if b == a {
		fmt.Println("对了")
		break
	}
	

}

}

` 1、math/rand 随机数从资源生成。包水平的函数都使用的默认的公共资源。

该资源会在程序每次运行时都产生确定的序列。如果需要每次运行产生不同的序列,应使用Seed函数进行初始化。默认资源可以安全的用于多go程并发。

在代码中rand.Seed(time.Now().UnixNano())用这个来生成随机数,它是从math/rand这个包下来的里面要有时间戳,不然就是一个重复的数字,再用Intn来限制大小

运行的结果如下

image.png

在这个结果中我没有输入,直接回车了也输入了小了,然后我打印了b的值输出了0. 然后我看了看fmt.scanln的输入,一共有三种

1.scan

语法: func Scan(a ...interface{}) (n int, err error)
例:
func main() {
          var str string
          fmt.Printf("请输入内容:")
          fmt.Scan(&str)
          fmt.Printf("str: %s",str)
}
 scan将碰到第一个空格或换行符之前的内容赋值给变量。如果
scan中有多个变量,变量值用空格或换行符分割。所以换行和空
格是不能存储到变量内的。
2.scanf

语法:func Scanf(format string, a ...interface{}) (n int, err error)
例:
func main() {
    var (
        name string
        age int
    )   
    fmt.Printf("请输入内容:")
    fmt.Scanf("name:%s age:%d",&name,&age)
    fmt.Printf("n: %s, a:%d",name,age)
} 
相当于有一个格式一样
3.scanln
语法:func Scanln(a ...interface{}) (n int, err error)
例:
func main() {
    var str string
    fmt.Printf("请输入内容:")
    fmt.Scanln(&str)
    fmt.Printf("str: %s",str)
}       
//Scanln类似Scan,但在遇到换行符时会立刻停止扫描。

总结:Scan和Scanln基本相同,唯一区别是当读取多个变量的时候,遇到换行符Scanln会直接结束,未读到输入值的变量为零值;Scan会等待,直到输入的值满足参数的个数后再遇到换行符才会结束。 所以在代码中因为定义的数据类型导致了是0,我改成string输出的是一个换行符一样,就什么没有。