Go(7 [終端讀寫| 文件操作 | 命令行參數 | Json序列化])

終端讀寫

操作終端相關文件句柄常量

  1. os.Stdin:標準輸入

  2. os.Stdout:標準輸出

  3. os.Stderr:標準錯誤輸出


終端讀寫示例:

//Sscanf 是從變量中讀取值

package main


import "fmt"


var (

    firstName,lastName ,s string


    i int

    f float32

    input = "56.12 / 5212 / Go"

    format  = "%f/%d/%s"

)


func main()  {

    fmt.Println("Please...input:")

    fmt.Scanln(&firstName,&lastName)


    fmt.Printf("Hi,%s,%s! \n",firstName,lastName)

    fmt.Sscanf(input,format,&f,&i,&s)

    fmt.Println("Form the string we read;",f,i,s)

}

牛逼的帶緩衝的終端讀寫

//NewReader 接受的是 只要實現的read接口

//帶緩衝區

//底層是代碼Reader 這個接口

    type Reader interface {

        Read(p []byte) (n int, err error)

    }

帶緩衝區的讀寫代碼:

//NewReader需要接受實現Reader這個接口的實例

//os.Stidin底層實現了這個接口,所以能接受

    read := bufio.NewReader(os.Stdin)


    // 讀取每一行的字符,以\n爲分割

    line,err :=read.ReadString('\n')


    if err!=nil{

        fmt.Println("read eror",err)

        return

    }

    fmt.Println("input!",line)

使用緩衝區,把值輸出到終端上:

接口的強大
**自定義一個struct,然後實現Read接口****

type RandStr struct {


}


func (r *RandStr) Read(p []byte) (n int, err error) {

    fmt.Printf("len(p)=%d\n",len(p))

    source := "abcdefaskljdajhkldaload121332"


    for i:=0;i<32;i++{

        index := rand.Intn(len(source))

        p[i] = source[index]

    }

    p[32] = '\n'

    return len(p),nil

}

栗子:統計終端輸入字符,數字,出現次數

package main

import (
    "fmt"
    "bufio"
    "os"
)

func fusion_input(d string)  {
    //一個utf-8字符佔3個字節
    var countNum, countLetter, countSpace, countOther int
    utf8arr := []rune(d)
    for _, v := range utf8arr {
        if v >= 'a' && v <= 'z' || v >= 'A' && v <= 'Z' {
            countLetter++
        } else if v >= '0' && v <= '9' {
            countNum++
        } else if v == ' ' {
            countSpace++
        } else {
            countOther++
        }
    }
    fmt.Println("英文字母的個數:", countLetter)
    fmt.Println("數字的個數:", countNum)
    fmt.Println("空格的個數:", countSpace)
    // 這裏理解爲多了一個換行符,所以進行了減一
    fmt.Println("其他字符的個數:", countOther)
}

func main()  {
    fmt.Println("Please...input:")
    read :=bufio.NewReader(os.Stdin)
    linebytes,_,_ := read.ReadLine()
    fusion_input(string(linebytes))

}

文件讀寫

可以定義一個const

const (


    name = "E:/pycharm快捷鍵及一些常用設置.txt"

    zipfilename ="C:/Users/Administrator/Documents/Tencent Files/1047738527/filenamepool.gz"

    testwritefilename = "D:/Log.txt"

    dstName = "E:/logger_helper.py"

    srcName ="E:/jquery-1.12.4.js"

)



1:文件打開

func fusion_error(err error) bool {

    var tag = true

    if err == io.EOF{

        fmt.Println("文件讀完了")

        return false

    }

    if err!=nil{

        fmt.Printf("%s",err)

        tag = false

        return tag

    }


    return tag

}

//原生的打開文件

func testFile()  {

    file,err := os.Open("E:/pycharm快捷鍵及一些常用設置.txt")

    fusion_error(err)

    //文件打開,一定要defer 關閉,

    defer file.Close()


    var data [1024]byte

    for {

        //Read底層 接受的是一個bytes的切片

        n,err := file.Read(data[:])

        tag :=fusion_error(err)

        if tag == false{

            break

        }

        //獲取數據0到n直接的數據, 這樣可以防止越界訪問,出現程序崩潰

        filestr := string(data[0:n])

        fmt.Println(filestr)

    }

}

2.帶緩衝區的讀文件

//帶緩衝區的讀文件

func buffio_readfile(name string)  {


    file,err := os.Open(name)

    fusion_error(err)

    defer file.Close()

    //bufio 更高級的功能, 可以按行讀

    //bufio 封裝了一層

    //帶緩衝區,所以效率更高

    //bufio 是接受的具體實現的接口 :實現了Reader 接口

    reader := bufio.NewReader(file)

    for {

        line,err :=reader.ReadString('\n')

        tag := fusion_error(err)

        if tag == false{

            break

        }

        fmt.Println(line)

    }




}

3.一次性讀取文件內容

//一次性讀出來放到內存中!適合讀取配置文件

//內部給你做了所有的操作,無需要關閉文件

func Ioutil(name string)  {


    data,error :=ioutil.ReadFile(name)

    fusion_error(error)


    fmt.Println(string(data))

}

4.讀取壓縮文件:


//讀取解壓文件

func zipfile( name string)  {

    file,error := os.Open(name)

    fusion_error(error)


    defer file.Close()


    reader,error := gzip.NewReader(file)

    fusion_error(error)


    bufread := bufio.NewReader(reader)

    for {

        line,error:=bufread.ReadString('\n')

        tag :=fusion_error(error)

        if tag == false{

            break

        }

        fmt.Printf("%s",line)


    }


}

5.寫文件操作

文件打開模式,第二個參數

  1. os.O_WRONLY:只寫

  2. os.O_CREATE:創建⽂件

  3. os.O_RDONLY只讀

  4. os.O_RDWR讀寫

  5. os.O_TRUNC :清空

第三個參數:權限控制

r ——> 004
w——> 002
x——> 001


//寫文件 :普通讀寫,緩存讀寫

func testWriteFile(name string)  {

    file,err := os.OpenFile(name,os.O_WRONLY|os.O_CREATE,066)

    fusion_error(err)

    defer file.Close()

    //普通的寫文件操作,比較慢

    //for i:=0;i<10;i++{

    //  file.WriteString(fmt.Sprintf("hello %d\n",i))

    //  file.WriteString("ceshi!!")

    //}

    //bufio 寫內容,快

    outputWriter :=bufio.NewWriter(file)

    for i:=0;i<10;i++{

        outputWriter.WriteString(fmt.Sprintf("hello %d\n",i))

    }

    //把內存中的數據刷新進去

    outputWriter.Flush()


}

6,文件內容的Copy

//copy文件內容


func Copyfile(dstName,srcName string) (written int64,err error)  {

    //dstName 目標文件

    //srcName 源文件

    src,err :=os.Open(srcName)

    fusion_error(err)

    defer src.Close()

    dst,err :=os.OpenFile(dstName,os.O_WRONLY|os.O_CREATE,0644)

    fusion_error(err)

    defer dst.Close()

    return io.Copy(dst,src)


}

7.把文件內容輸出到屏幕上

package main


import (

    "os"

    "fmt"

    "io"

)


func cat(filename string)  {

    file,error :=os.Open(filename)

    defer  file.Close()

    if error != nil{

        fmt.Println("---")

        return

    }

    //把文件內容輸出到屏幕上

    io.Copy(os.Stdout,file)

}

func main()  {

    if (len(os.Args) == 1 ){

        fmt.Println("請指定文件名")

    }

    for i :=1;i<len(os.Args);i++{

        cat(os.Args[i])

    }

}

8.帶緩衝區的終端讀寫

package main

import (

    "bufio"

    "fmt"

    "os"

)

func main() {

    fmt.Fprintf(os.Stdout, "%s\n", "hello world! - unbuffered")

    buf := bufio.NewWriter(os.Stdout)

    fmt.Fprintf(buf, "%s\n", "hello world! - buffered")

    buf.Flush()

}


命令行參數

os.Args是一個string的切片,用來存儲所有的命令行參數

package main

//命令行參數


import (

    //"os"

    "fmt"

    "flag"

)

var (

    conf string

    level int


)


func init()  {

    flag.StringVar(&conf,"C","D:/test.conf","請指定配置文件路徑")

    flag.IntVar(&level,"L",8,"請指定日誌級別")

    flag.Parse()

}

func main()  {

    //獲取終端輸入的值:os.Args 是一個數組

    //for index,val := range os.Args{

    //  fmt.Printf("arg:[%d] = %s\n",index,val)

    //

    //}

    fmt.Printf("conf is :%s\n",conf)

    fmt.Printf("level is :%d\n",level)



    //-h 會默認把init中你配置的項都列出來

    //終端操作:cmd_arg.exe -C "e:/DREAM/TEST" -L 5

}


Json序列化/反序列化

Json數據協議

1. 導入包: Import “encoding/json”
2. 序列化: json.Marshal(data interface{})
3. 反序列化: json.UnMarshal(data []byte, v interface{})

package main

import (
   "fmt"
   "math/rand"
   "encoding/json"
   "os"
   "io/ioutil"
)

type Student struct {
   //字段必須大寫, 如果小寫的話,其他包是讀取不到
   Name string `json:"name"`
   Age int `json:"age"`
   Score float32 `json:"score"`
}

func wirtefilejson()  {
   var stus []*Student
   for i:=0;i<300;i++{
      stu :=&Student{
         Name:fmt.Sprintf("stu%d",i),
         Age:rand.Intn(100),
         Score:rand.Float32() * 100,
      }
      stus = append(stus,stu)
   }
   data,error := json.Marshal(stus)
   if error!=nil{
      fmt.Printf("json faile,err:%v\n",error)
      return
   }

   file,error := os.OpenFile("D:/stu.txt",os.O_CREATE|os.O_WRONLY,0664)
   if error!=nil{
      fmt.Printf("OpenFile error :%v\n",error)
      return
   }
   defer file.Close()
   n,error := file.Write(data)
   if error!=nil{
      fmt.Printf("OpenFile error :%v\n",error)
      return
   }
   fmt.Printf("wirte %d, success \n",n)
}

func readfilejson()  {
   file,err :=os.OpenFile("D:/stu.txt",os.O_RDONLY,0664)
   if err!=nil{
      fmt.Printf("file failed err %v",err)
   }
   defer file.Close()
   data,err :=ioutil.ReadAll(file)
   if err!=nil{
      fmt.Printf("read failed err %v",err)
   }
   var stus []*Student
   err = json.Unmarshal(data,&stus)
   if err!=nil{
      fmt.Printf("JSON unmarshal failed err %v",err)
   }
   for i:=0;i<10;i++{
      fmt.Printf("student:%#v\n",stus[i])
   }
}

func main(){
   //wirtefilejson()
    readfilejson()
}

Panic捕獲

package main

import (
   "fmt"
   "time"
)

func set( p *int)  {
   *p = 123
}
func test()  {
   defer func() {
      err :=recover()
      if err != nil{
         fmt.Println("panic:%v\n",err)
      }
   }()
   var p *int
   //因爲設置p爲指針,還需要new來分配內存,,但是這裏沒有set的就會出錯
   //p = new(int)
   set(p)
   fmt.Printf("*p=%d\n",*p)
}

func main()  {
   for {
      test()
      time.Sleep(time.Second)
   }
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章