版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010168781/article/details/89496583
一、读写数据
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 []string
for {
var v1, v2, v3 string
_, err := fmt.Fscanln(file, &v1, &v2, &v3)
// scans until newline
if 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 {
Name string // name as it appears on command line
Usage string // help message
Value Value // value as set
DefValue string // default value (as text); for usage message
}
下面的程序 echo.go 模拟了 Unix 的 echo 功能:
package main
import (
"flag" // command line option parser
"os"
)
var NewLine = flag.Bool("n", false, "print newline") // echo -n flag, of type *bool
const (
Space = " "
Newline = "\n"
)
func main() {
flag.PrintDefaults()
flag.Parse() // Scans the arg list and sets up flags
var s string = ""
for i := 0; i < flag.NArg(); i++ {
if i > 0 {
s += " "
if *NewLine { // -n is parsed, flag becomes true
s += 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 的 booleans
float64 对应 JSON 的 numbers
string 对应 JSON 的 strings
nil 对应 JSON 的 null
7、Go 中的密码学
hash 包:实现了 adler32、crc32、crc64 和 fnv 校验;
crypto 包:实现了其它的 hash 算法,比如 md4、md5、sha1 等。以及完整地实现了 aes、blowfish、rc4、rsa、xtea 等加密算法。