一、读写数据
1、读取用户的输入
使用fmt 包提供的 Scan 和 Sscan 开头的函数;
* Scanln 扫描来自标准输入的文本,将空格分隔的值依次存放到后续的参数内,直到碰到换行。* Scanf 与其类似,除了 Scanf 的第一个参数用作格式字符串,用来决定如何读取。* Sscan 和以 Sscan 开头的函数则是从字符串读取,除此之外,与 Scanf 相同。
bufio 包提供的缓冲读取(buffered reader)来读取数据
inputReader := bufio.NewReader(os.Stdin)input, err := inputReader.ReadString('\n')
2、读文件
循环读写每一行:
inputFile, inputError := os.Open("input.dat")defer inputFile.Close()inputReader := bufio.NewReader(inputFile)for {inputString, readerError := inputReader.ReadString('\n')fmt.Printf("The input was: %s", inputString)if readerError == io.EOF {return}}
说明:
* inputFile 是 *os.File 类型的,表示一个打开文件的描述符(文件句柄);
读取整个文件到一个字符串中:
buf, err := ioutil.ReadFile(products.txt)fmt.Printf("%s\n", string(buf))err = ioutil.WriteFile(products_copy.txt, buf, 0644) // oct, not hex
读取指定大小内容到缓冲
buf := make([]byte, 1024)n, err := inputReader.Read(buf)
按列读取文件中的数据
如果数据是按列排列并用空格分隔的,你可以使用 fmt 包提供的以 FScan 开头的一系列函数来读取他们;
file, err := os.Open("products2.txt")var col1, col2, col3 []stringfor {var v1, v2, v3 string_, err := fmt.Fscanln(file, &v1, &v2, &v3)// scans until newlineif err != nil {break}col1 = append(col1, v1)col2 = append(col2, v2)col3 = append(col3, v3)}
compress包:读取压缩文件
3、写文件:
outputFile, outputError := os.OpenFile("output.dat", os.O_WRONLY|os.O_CREATE, 0666)defer outputFile.Close()outputWriter := bufio.NewWriter(outputFile)outputString := "hello world!\n"for i:=0; i<10; i++ {outputWriter.WriteString(outputString)}outputWriter.Flush()
标志:
os.O_RDONLY:只读os.O_WRONLY:只写os.O_CREATE:创建:如果指定文件不存在,就创建该文件。os.O_TRUNC:截断:如果指定文件已存在,就将该文件的长度截为0。
4、文件拷贝:io.Copy
src, err := os.Open(srcName)defer src.Close()dst, err := os.Create(dstName)defer dst.Close()io.Copy(dst, src)
5、 从命令行读取参数
os.Args:用来处理一些基本的命令行参数,os.Args[0] 放的是程序本身的名字,os.Args[1:]用来保存变量;
flag 包:
在 flag 包中有一个 Flag 被定义成一个含有如下字段的结构体:
type Flag struct {Namestring // name as it appears on command lineUsage string // help messageValue Value // value as setDefValue string // default value (as text); for usage message}
下面的程序 echo.go 模拟了 Unix 的 echo 功能:
package mainimport ("flag" // command line option parser"os")var NewLine = flag.Bool("n", false, "print newline") // echo -n flag, of type *boolconst (Space = " "Newline = "\n")func main() {flag.PrintDefaults()flag.Parse() // Scans the arg list and sets up flagsvar s string = ""for i := 0; i < flag.NArg(); i++ {if i > 0 {s += " "if *NewLine {// -n is parsed, flag becomes trues += Newline}}s += flag.Arg(i)}os.Stdout.WriteString(s)}
相关函数:
* flag.PrintDefaults() 打印 flag 的使用帮助信息* flag.Parse() 扫描参数列表* flag.Arg(i) 表示第i个参数,注意:flag.Arg(0) 就是第一个真实的 flag,而不是像 os.Args(0) 放置程序的名字* flag.Narg() 返回参数的数量* flag.Bool flag.Int(),flag.Float64(),flag.String(),设置命令行参数
6、 JSON 数据格式
常用函数:
import "encoding/json"//引入包func Marshal(v interface{}) ([]byte, error)//序列化json.MarshalforHTML()//web 应用中最好使用该函数,将对数据执行HTML转码,可以被安全地嵌在 HTML <script> 标签中func NewEncoder(w io.Writer) *Encoder//将数据对象 v 的json编码写入 io.Writer w 中func Unmarshal(data []byte, v interface{}) error//反序列化
JSON 与 Go 类型对应如下:
bool 对应 JSON 的 booleansfloat64 对应 JSON 的 numbersstring 对应 JSON 的 stringsnil 对应 JSON 的 null
7、Go 中的密码学
hash 包:实现了 adler32、crc32、crc64 和 fnv 校验;
crypto 包:实现了其它的 hash 算法,比如 md4、md5、sha1 等。以及完整地实现了 aes、blowfish、rc4、rsa、xtea 等加密算法。
如果觉得《【Go】Go基础(十):文件读写》对你有帮助,请点赞、收藏,并留下你的观点哦!