1. 程式人生 > >Go語言判斷檔案是否存在與常用包解析

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。