一 猜字游戏
该游戏是在知道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来限制大小
运行的结果如下
在这个结果中我没有输入,直接回车了也输入了小了,然后我打印了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输出的是一个换行符一样,就什么没有。