目录


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