Go語言判斷檔案是否存在與常用包解析
一、判斷檔案是否存在:
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。