Go的I/O核心是接口io.Reader和io.Writer
例:(从文件读取)无缓冲
package main
import "os"
func main(){
buf := make([]byte, 1024)
f, _ := os.Open("/etc/passwd") //打开文件,os.Open返回一个实现了io.Reader和io.Writer的*os.File;
defer f.Close() //确保关闭了f;
for {
n, _ := f.Read(buf) //一次读取1024字节
if n == 0 { //到达文件末尾
break;
}
os.Stdout.Write(buf[:n]) //将内容写入os.Stdout
}
}
输出结果:
/etc/passwd文件中的内容
如果想要使用缓冲IO,则有bufio包
例:(从文件读取)有缓冲
package main
import (
"os"
"bufio"
)
func main(){
buf := make([]byte, 1024)
f, _ := os.Open("/etc/passwd")
defer f.Close()
r := bufio.NewReader(f) //转换f为有缓冲的Reader。NewReader需要一个io.Reader
w := bufio.NewWriter(os.Stdout)
defer w.Flush()
for {
n, _ := r.Read(buf) //从Reader读取,而向Writer写入,然后向屏幕输出文件
if n == 0 {
break;
}
w.Write(buf[0:n])
}
}
输出结果:
/etc/passwd文件的内容
命令行参数
来自命令行的参数在程序中通过字符串sliceos.Args获取,导入包os即可.flag包有着精巧的接口,同样提供了解析标识的方法。
执行命令
os/exec包有函数可以执行外部命令,这也是在Go中主要的执行命令的方法
例:
package main
import "fmt"
import "os/exec"
func main(){
cmd := exec.Command("/bin/ls", "-l")
buf,_ := cmd.Output()
for _, val := range buf {
fmt.Printf("%c", val)
}
}
输出结果:
total 4
-rw-r--r-- 1 root root 173 Jan 10 15:22 demo.go
网络
所有网络相关的类型和函数可以在net包中找到。这其中最重要的函数是Dial。当Dial到远程系统,这个函数返回Conn接口类型,可以用于发送或接收信息。函数Dial简洁的抽象了网络层和传输层。因此IPv4或者IPv6,TCP或者UDP可以共用一个接口。
有疑问加站长微信联系(非本文作者)