赞
踩
目录
不同基础类型之间的转化 对于不同的基础类型之间的转化,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

是通过缓冲来提高效率。
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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。