目录
GO控制台输入
不同基础类型之间的转化 对于不同的基础类型之间的转化,Go提供了strconv包。
它实现了字符串与其他基本数据类型之间的转化。其中最常用的数值转化函数是Atoi和ltoa,简单了解下它的使用。
Atoi方法可以将字符串类型的数值直接转化为int类型的数值,而ltoa可以将int类型的数值转化为string类型的值。 示例:控制台输入一个数值,进行数据大小的比较。
package main
import (
"fmt"
"strconv"
)
func main() {
var a string
fmt.Print("请输入一个值")
fmt.Scan(&a)
value, _ := strconv.Atoi(a)
fmt.Printf("转化之后的类型是%T \n", value)
if value >= 100 {
fmt.Println("数值较大")
}
if value < 100 {
fmt.Println("数值较小")
}
}
请输入一个值88
转化之后的类型是int
数值较小
小练习 猜价格
package main
import (
"fmt"
"math/rand"
"time"
)
//案例:
//猜商品价格,商品高低,商品价格随机生成[0-300) 如果你输入的价格大于商品价格则提示价格过高
//如果你输入的价格低于商品价格提示价格过低,直到猜中商品价格为止,并统计猜的次数
//全局变量
var (
price int
count int
)
func main() {
b := test()
fmt.Println("总共猜中的次数:", b)
}
func test() int {
//生成商品的价格
//随机数
rand.Seed(time.Now().Unix())
real_price := rand.Intn(300)
for {
//输入价格
fmt.Println("请输入商品价格:")
fmt.Scan(&price)
switch {
case price == real_price:
count++
fmt.Println("恭喜猜中了商品价格:", real_price)
return count
case price > real_price:
count++
fmt.Println("猜得价格过高")
continue
default:
count++
fmt.Println("猜得价格过低")
continue
}
}
}
运行结果
PS D:\golang\src\day7\demo2\rand> go run .\main.go
请输入商品价格:
200
猜得价格过高
请输入商品价格:
188
猜得价格过高
请输入商品价格:
100
猜得价格过低
请输入商品价格:
250
猜得价格过高
请输入商品价格:
150
猜得价格过高
请输入商品价格:
120
猜得价格过高
请输入商品价格:
110
猜得价格过低
请输入商品价格:
115
猜得价格过低
请输入商品价格:
116
恭喜猜中了商品价格: 116
总共猜中的次数: 9
bufio包
是通过缓冲来提高效率。
io操作本身的效率并不低,低的是频繁的访问本地磁盘的文件。所以bufio就提供了缓冲区(分配一块内存),读和写都先在缓冲区中,最后再读写文件,来降低访问本地磁盘的次数,从而提高效率。
简单的说就是,把文件读取进缓冲(内存)之后再读取的时候就可以避免文件系统的io 从而提高速度。同理,在进行写操作时,先把文件写入缓冲(内存),然后由缓冲写入文件系统。看完以上解释有人可能会表示困惑了,直接把 内容->文件 和 内容->缓冲->文件相比, 缓冲区好像没有起到作用嘛。其实缓冲区的设计是为了存储多次的写入,最后一口气把缓冲区内容写入文件。
Text 将最后一次扫描出的“指定部分”作为字符串返回(值传递)
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
fmt.Println("请输入一个值")
b := getsplnput()
fmt.Println(b)
}
func getsplnput() string {
var a string
//创建bufio缓存区,新建newscanner读取缓存区内容
//其实就是一个扫描
in := bufio.NewScanner(os.Stdin)
//输出的值以文本的形式展示出来
if in.Scan(){
a = in.Text()
//不对的话输出一句话(可以自己定义)
}else{
a = "not faunnt"
}
return a
}
//结果
PS D:\golang\src\day7\demo3\bufio> go run .\main.go
请输入一个值
"张三"
"张三"
ReadLine 是一个低级的原始的行读取操作
// 大多数情况下,应该使用 ReadBytes('\n') 或 ReadString('\n')
// 或者使用一个 Scanner
//
// ReadLine 通过调用 ReadSlice 方法实现,返回的也是缓存的切片
// ReadLine 尝试返回一个单行数据,不包括行尾标记(\n 或 \r\n)
// 如果在缓存中找不到行尾标记,则设置 isPrefix 为 true,表示查找未完成
// 同时读出缓存中的数据并作为切片返回
// 只有在当前缓存中找到行尾标记,才将 isPrefix 设置为 false,表示查找完成
// 可以多次调用 ReadLine 来读出一行
// 返回的数据在下一次读取操作之前是有效的
// 如果 ReadLine 无法获取任何数据,则返回一个错误信息(通常是 io.EOF)
func (b *Reader) ReadLine() (line []byte, isPrefix bool, err error)
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
fmt.Println("请输入内容:")
str1 := getInput()
fmt.Println(str1)
}
//缓冲区控制台写入
func getInput() string {
//bufio 缓冲区从控制台读取输入信息
in := bufio.NewReader(os.Stdin)
//从缓冲区中读取字符串信息
str, _, err := in.ReadLine()
if err != nil {
return err.Error()
}
return string(str)
}
结果
PS D:\golang\src\day7\demo3\Scanner> go run .\main.go
请输入内容:
hell
hell