【Go学习笔记10】go语言中的工具包-输入输出

230 阅读2分钟

输入和输出

go语言中,输入和输出主要在io包中。io包中,最主要的接口是io.Reader和io.Writer两个接口。

输入

package main

import (
	"io"
	"strings"
	"log"
	"fmt"

)

func main(){
	r := strings.NewReader("这是一个字符串。。")
	
	buf := make([]byte, 6)
	if _, err := io.ReadFull(r, buf); err != nil {
		log.Fatal(err)
	}
	fmt.Printf("%s\n", buf)
}
//这是

上面的代码表示从r中读取6个字节的数据到buf中。注意,一个中文占3个字节,所以如果读取的字节数不是3的倍数的话,会出现乱码。strings.NewReader函数通过给定字符串来创建一个Reader对象。更多详情请点这里

读取文件数据:

package main

import (
	"fmt"
	"log"
	"os"

)

func main(){
	file ,err := os.OpenFile("data.json",os.O_RDONLY,0666)
	if err != nil{
		log.Println("打开文件失败。。")
		return
	}
  //创建一个byte类型的切片,长度和容量都是1024
	b := make([]byte,1024)
  //读取数据到b中
	file.Read(b)

	fmt.Println(string(b))
}

上面的代码表示从data.json中读取1024个字节的数据到b中。

那如果文件中的数据长度大于1024字节该怎么办呢?看下面的代码:

package main

import (
	"bytes"
	"io"
	"fmt"
	"log"
	"os"

)

func main(){
	file ,err := os.OpenFile("data.json",os.O_RDONLY,0666)
	if err != nil{
		log.Println("打开文件失败。。")
		return
	}
	//定义一个byte的缓存,用来存储每一次循环读取出来的数据
	var buffer bytes.Buffer
	//定义一个byte类型的切片,表示每次读取的数据大小
	b := make([]byte,8)
	var n int
	//循环读取,知道文件末尾
	for  n, err = file.Read(b); err!=io.EOF ; n, err = file.Read(b)  {
    //从切片b中创建新的切片,新的切片包括这次读取的所有数据
		temp := b[0:n:n]
		buffer.Write(temp)
	}
	//输出结果
	fmt.Println(string(buffer.Bytes()))
}
 //{ "success":true,
 // "total":1214,
 // "rows":[{
 //   "id":1,
 //   "name":"zhongzhong",
 //   "age":25
 // },{
 //   "id":2,
 //   "name":"wangerxiao",
 //   "age":15
 // }]}

上面的代码表示将data.json中的数据读取出来,然后输出到控制台。

输出

package main

import (
	"os"
	"bytes"
)

func main(){
	var buffer bytes.Buffer
	buffer.Write([]byte("这是一段文字"))

	buffer.WriteTo(os.Stdout)
}
//这是一段文字

上面的代码表示,输出一段文字到标准输出中。

输出数据到文件中:

package main

import (
	"io"
	"log"
	"os"
	"bytes"
)

func main(){
	var buffer bytes.Buffer
	buffer.Write([]byte("这是一段文字"))

	file , err := os.OpenFile("data.txt",os.O_CREATE | os.O_WRONLY,0666)
	if err != nil{
		log.Println("打开文件失败。。",err)
		return 
	}

	buffer.WriteTo(io.Writer(file))
}