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。

猜你喜欢

转载自blog.csdn.net/weixin_42117918/article/details/84307885