手记

Golang之IO操作初接触

Golang之IO操作初接触

fmt包的使用

import (
	"fmt"
	"os"
)

//打印且换行
fmt.Println("hello")
//打印不换行
fmt.Print("hello")
fmt.Println()
//格式化打印
fmt.Printf("%v\n", "hello")

// 返回格式化后内容
str := fmt.Sprintf("float %f", 3.14159)
fmt.Println(str)

// 输出到io.writer
fmt.Fprintln(os.Stdout, "A\n")

基本io接口

import (
	"fmt"
	"io"
	"strings"
)

func sampleReadFromString() {
	// 建立一个reader,该reader实现了io.Reader接口
	bytes, _ := ReadFrom(strings.NewReader("from string"), 8)
	fmt.Println(string(bytes))
}

func sampleReadStdin() {
    // 从屏幕读取
	fmt.Println("please input from stdin: ")
	bytes, _ := ReadFrom(os.Stdin, 11)
	fmt.Println(string(bytes))
}

func sampleReadFile() {
	file, _ := os.Open("main.go")
	defer file.Close()
	bytes, _ := ReadFrom(file, 9)
	fmt.Println(string(bytes))
}

func ReadFrom(reader io.Reader, num int) ([]byte, error) {
	// 建立[]byte切片
	p := make([]byte, num)
	// 将数据读取到p
	n, err := reader.Read(p)

	// 读取到的内容长度大于0
	if n > 0 {
		return p[:n], nil
	}

	return p, err
}

缓存IO

func main() {
    reader := strings.NewReader("hello world")
    bufReader := bufio.NewReader(reader)

    // peek返回缓存的一个切片,只读不取
    bytes, _ := bufReader.Peek(8)
    fmt.Println(string(bytes))

    // 返回buffer中的字符数
    fmt.Println(bufReader.Buffered())

    // 读取缓冲,截止到某个byte切割符为止,读取后,buffer的字符数会变少
    //单引号''代表byte
    str, _ := bufReader.ReadString(' ')
    fmt.Println(str, bufReader.Buffered())

    // 建立buffer writer
    w := bufio.NewWriter(os.Stdout)

    // 向buffer writer写入数据
    fmt.Fprint(w, "Hello ")
    fmt.Fprint(w, "world")
    //将缓存写入writer
    w.Flush()
}

计算文件行数

func main () {
    if len(os.Args) < 2 {
		return
	}

	filename := os.Args[1]
	file, err := os.Open(filename)
	if err != nil {
		fmt.Println(err)
		return
	}

	defer file.Close()

	reader := bufio.NewReader(file)

	var line int

	for {
		_, isPrefix, err := reader.ReadLine()

		if err != nil {
			break
		}

		if !isPrefix {
			line++
		}

	}
    fmt.Println(line)
}
0人推荐
随时随地看视频
慕课网APP