一、判断文件是否存在:
package main
import (
"fmt"
"os"
)
/*
判断文件是否存在:存在,返回true,否则返回false
*/
//方法1
func IsFileExist(filename string) bool {
info, err := os.Stat(filename)
if os.IsNotExist(err) {
fmt.Println(info)
return false
}
fmt.Println("exists",info.Name(),info.Size(),info.ModTime())
return true
}
//方法2
func IsFileExist1(filename string) bool {
if _,err:=os.Stat(filename);os.IsNotExist(err){
return false
}
return true
}
func main() {
patt:="D:\\电子书\\Go语言编程.pdf1"
flag:=IsFileExist(patt)
fmt.Println(flag)
fmt.Println(IsFileExist1(patt))
}
二、Strings包常用函数(主要对string的操作)
1、
func Join
func Join(a []string, sep string) string
将一系列字符串连接为一个字符串,之间用sep来分隔。
2、
func Split
func Split(s, sep string) []string
用去掉s中出现的sep的方式进行分割,会分割到结尾,并返回生成的所有片段组成的切片(每一个sep都会进行一次切割,即使两个sep相邻,也会进行两次切割)。如果sep为空字符,Split会将s切分成每一个unicode码值一个字符串。
三、bytes包常用函数(主要对 [ ]byte切片的操作)
import "bytes"
bytes包实现了操作[]byte的常用函数。本包的函数和strings包的函数相当类似。
func Join
func Join(s [][]byte, sep []byte) []byte
将一系列[]byte切片连接为一个[]byte切片,之间用sep来分隔,返回生成的新切片。
func Equal
func Equal(a, b []byte) bool
判断两个切片的内容是否完全相同。
type Reader
type Reader struct { // 内含隐藏或非导出字段 }
Reader类型通过从一个[]byte读取数据,实现了io.Reader、io.Seeker、io.ReaderAt、io.WriterTo、io.ByteScanner、io.RuneScanner接口。
type Buffer
type Buffer struct { // 内含隐藏或非导出字段 }
Buffer是一个实现了读写方法的可变大小的字节缓冲。本类型的零值是一个空的可用于读写的缓冲。
func (*Buffer) Write
func (b *Buffer) Write(p []byte) (n int, err error)
Write将p的内容写入缓冲中,如必要会增加缓冲容量。返回值n为len(p),err总是nil。如果缓冲变得太大,Write会采用错误值ErrTooLarge引发panic。
四、encoding/binary
import "encoding/binary"
binary包实现了简单的数字与字节序列的转换以及变长值的编解码。
数字翻译为定长值来读写,一个定长值,要么是固定长度的数字类型(int8, uint8, int16, float32, complex64, ...)或者只包含定长值的结构体或者数组。
本包相对于效率更注重简单。如果需要高效的序列化,特别是数据结构较复杂的,请参见更高级的解决方法,例如encoding/gob包,或者采用协议缓存。
func Write
func Write(w io.Writer, order ByteOrder, data interface{}) error
将data的binary编码格式写入w,data必须是定长值、定长值的切片、定长值的指针。order指定写入数据的字节序,写入结构体时,名字中有'_'的字段会置为0。
func Read
func Read(r io.Reader, order ByteOrder, data interface{}) error
从r中读取binary编码的数据并赋给data,data必须是一个指向定长值的指针或者定长值的切片。从r读取的字节使用order指定的字节序解码并写入data的字段里当写入结构体是,名字中有'_'的字段会被跳过,这些字段可用于填充(内存空间)。
demo:
//将uint转换成[]byte
func Uint2Byte(num uint64) []byte {
var buffer bytes.Buffer
//这是一个序列化的过程, 将num转换成buffer字节流
err := binary.Write(&buffer, binary.BigEndian, &num)
if err != nil {
log.Panic(err)
}
return buffer.Bytes()
}
四、encoding/gob
import "encoding/gob"
gob包管理gob流——在编码器(发送器)和解码器(接受器)之间交换的binary值。一般用于传递远端程序调用(RPC)的参数和结果,如net/rpc包就有提供。
func NewEncoder(编码器)
func NewEncoder(w io.Writer) *Encoder
NewEncoder返回一个将编码后数据写入w的*Encoder。
func (*Encoder) Encode(编码)
func (enc *Encoder) Encode(e interface{}) error
Encode方法将e编码后发送,并且会保证所有的类型信息都先发送。
func NewDecoder(解码器)
func NewDecoder(r io.Reader) *Decoder
函数返回一个从r读取数据的*Decoder,如果r不满足io.ByteReader接口,则会包装r为bufio.Reader。
func (*Decoder) Decode(解码)
func (dec *Decoder) Decode(e interface{}) error
Decode从输入流读取下一个之并将该值存入e。如果e是nil,将丢弃该值;否则e必须是可接收该值的类型的指针。如果输入结束,方法会返回io.EOF并且不修改e(指向的值)。
var buffer bytes.Buffer
encoder := gob.NewEncoder(&buffer)
err := encoder.Encode(tx) //tx:编码内容
if err != nil {
log.Panic(err)
}
特别注意:
func Register
func Register(value interface{})
Register记录value下层具体值的类型和其名称。该名称将用来识别发送或接受接口类型值时下层的具体类型。本函数只应在初始化时调用,如果类型和名字的映射不是一一对应的,会panic。(如果编码/解码数据类型为接口类型,需要执行此函数,进行注册)。
五、math/big
import "math/big"
big包实现了大数字的多精度计算。 支持如下数字类型:
- Int 有符号整数 - Rat 有理数
func NewInt
func NewInt(x int64) *Int ////初始值为1 targetInt := big.NewInt(1)
创建一个值为x的*Int。 (大数、复杂类型一般为指针)
func (*Int) Bytes
func (x *Int) Bytes() []byte
返回x的绝对值的大端在前的字节切片表示。
func (*Int) String
func (x *Int) String() string
func (*Int) Cmp
func (x *Int) Cmp(y *Int) (r int)
比较x和y的大小。x<y时返回-1;x>y时返回+1;否则返回0。