亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 專題 > 區塊鏈 > 正文

區塊鏈開發中Go語言之IO操作

2020-02-25 19:26:52
字體:
來源:轉載
供稿:網友

這篇文章是對區塊鏈開發中Go語言之IO操作做一個梳理,每一個的地方,每一種的知識,每一種事物,都是從陌生到熟悉。在這個過程里面,或許能開闊眼界,增長見識,體驗樂趣,下面我們就一起來看看吧。

io,最基本的io

Reader

type Reader interface {    Read(p []byte) (n int, err error)}

實現了Reader接口的都可以用read方法,將數據讀入到p字節數組,n表示讀取了幾個字節,err返回錯誤。 如果讀到了文件尾EOF,則err返回EOF。
注意,當文件最后一小段已經無法填滿p這個字節數組時,不會產生EOF的錯誤,只會在下一次讀取時產生n=0,err=io.EOF的錯誤

舉例

func main() {    file, _ := os.Open("main.go")    var a [128]byte    count:=0    for {        n, err := file.Read(a[:])        count+=1        if err != nil {            if err == io.EOF {                break            } else {                os.Exit(1)            }        }        fmt.Printf("%s/n", a[:n])    }    fmt.Printf("%d/n", count)}

Writer

type Writer interface {    Write(p []byte) (n int, err error)}

Write 將 len(p) 個字節從 p 中寫入到基本數據流中。它返回從 p 中被寫入的字節數 n(0 常見錯誤原因有磁盤滿了

ReaderAt 和 WriterAt 接口

和Reader,Writer類似,但是需要自己調控偏移量。
注意:接近文件尾巴時,當n小于數組大小時也觸發了err.EOF,需要自行把最后n小于數組大小的這點數據處理一下。

舉例:

func main() {    file, _ := os.Open("main.go")    var a [128]byte    count := 0    var pos int64 = 0    for {        n, err := file.ReadAt(a[:], pos)        count += 1        pos += int64(n)        if err != nil {            if err == io.EOF {                fmt.Printf("%s", a[:n]) //區別在這里                break            } else {                os.Exit(1)            }        }        fmt.Printf("%s", a[:n])    }    fmt.Println()    fmt.Printf("%d", count)}

ReaderFrom 和 WriterTo 接口

一次性讀完直到EOF,或者寫入全部數據

Seeker 接口

type Seeker interface {    Seek(offset int64, whence int) (ret int64, err error)}

用來設置偏移量,也就是從哪開始讀,offset由whence解釋。

  • 0 表示相對于文件的起始處
  • 1 表示相對于當前的偏移,
  • 2 表示相對于其結尾處。

ByteReader 和 ByteWriter

讀或寫一個字節

ioutil — 方便的IO操作函數集

ReadAll

一次性讀取數據

ReadDir

讀取目錄并返回排好序的文件和子目錄名

ReadFile 和 WriteFile

func WriteFile(filename string, data []byte, perm os.FileMode) error

這里特別注意的是寫文件的權限問題,perm的數值,和linux規則一致 四位(777):

模式

數字

rwx

7

rw-

6

r-x

5

r--

4

-wx

3

-w-

2

--x

1

---

0

組合如0666,表示rw-rw-rw-

?

bufio,帶緩存的io

是io庫的包裝,提供帶緩存的方法

ReadSlice、ReadBytes、ReadString 和 ReadLine 方法

后三個方法最終都是調用ReadSlice來實現的

ReadSlice
func (b *Reader) ReadSlice(delim byte) (line []byte, err error)

示例:

reader := bufio.NewReader(strings.NewReader("http://studygolang.com. /nIt is the home of gophers"))line, _ := reader.ReadSlice('/n')fmt.Printf("the line:%s/n", line)// 這里可以換上任意的 bufio 的 Read/Write 操作n, _ := reader.ReadSlice('/n')fmt.Printf("the line:%s/n", line)fmt.Println(string(n))

輸出:

the line:http://studygolang.com. the line:It is the home of gophersIt is the home of gophers

注意ReadSlice每次返回的line是指向同一個緩存數組,因此ReadSlice的實現是反復覆蓋重寫緩存數組。

如果ReadSlice在找到分界符前

  1. 緩存數組就滿了,則返回bufio.ErrBufferFull
  2. 遇到EOF了,則返回ErrEOF
ReadBytes
func (b *Reader) ReadBytes(delim byte) (line []byte, err error)

返回的byte是copy的一份數組

從以下實驗可看出來

reader := bufio.NewReader(strings.NewReader("http://studygolang.com. /nIt is the home of gophers"))line, _ := reader.ReadBytes('/n')fmt.Printf("the line:%s/n", line)// 這里可以換上任意的 bufio 的 Read/Write 操作n, _ := reader.ReadBytes('/n')fmt.Printf("the line:%s/n", line)fmt.Println(string(n))

輸出

the line:http://studygolang.com. the line:http://studygolang.com. It is the home of gophers
ReadString

是對ReadBytes的封裝,將返回的line轉換成string

ReadLine
func (b *Reader) ReadLine() (line []byte, isPrefix bool, err error)

這里要說的是isPrefix,用于讀取的一行超過了緩存大小,則isPrefix為true,下次還讀這行余下的部分,直到讀完這行才isPrefix返回false

ReadLine返回的文本不會包含行結尾("/r/n"或者"/n")

Peek

該方法只是“窺探”一下Reader中沒有讀取的n個字節。好比棧數據結構中的取棧頂元素,但不出棧。

func (b *Reader) Peek(n int) ([]byte, error)

同上面介紹的ReadSlice一樣,返回的[]byte只是buffer中的引用。所以在并發的時候有可能就被別人給改了

Scanner 類型和方法

用于方便的按token讀取數據,token的分詞規則用SplitFunc定義。默認按行分詞,會去掉末尾換行符。 了解Scanner前要先了解SplitFunc

SplitFunc
type SplitFunc func(data []byte, atEOF bool) (advance int, token []byte, err error)

SplitFunc 定義了 用于對輸入進行分詞的 split 函數的簽名。

參數

  1. data 是還未處理的數據,
  2. atEOF 標識 Reader是否還有更多數據(是否到了EOF)。

返回值

  1. advance data里下一個token開始位置
  2. token 表示當前token的結果數據
  3. err 則代表可能的錯誤。

舉例

func main() {    // Comma-separated list; last entry is empty.    const input = "1,2,3,4,"    scanner := bufio.NewScanner(strings.NewReader(input))    // Define a split function that separates on commas.    onComma := func(data []byte, atEOF bool) (advance int, token []byte, err error) {        for i := 0; i 

輸出

"1" "2" "3" "4" "5"

你也可以用系統定義好的幾個分割token的方法。


  1. ScanBytes 返回單個字節作為一個 token。
    ?

  2. ScanRunes 返回單個 UTF-8 編碼的 rune 作為一個 token。返回的 rune 序列(token)和 range string類型 返回的序列是等價的,也就是說,對于無效的 UTF-8 編碼會解釋為 U+FFFD = "/xef/xbf/xbd"。
    ?

  3. ScanWords 返回通過“空格”分詞的單詞。如:study golang,調用會返回study。注意,這里的“空格”是 unicode.IsSpace(),即包括:'/t', '/n', '/v', '/f', '/r', ' ', U+0085 (NEL), U+00A0 (NBSP)。
    ?

  4. ScanLines 返回一行文本,不包括行尾的換行符。這里的換行包括了Windows下的"/r/n"和Unix下的"/n"。
    ?
Scanner 的使用方法
  1. NewScanner
  2. Split設置分割token的方法
  3. 循環scanner.Scan()
  4. 在循環里用scanner.Text()取token 示例
const input = "This is The Golang Standard Library./nWelcome you!"scanner := bufio.NewScanner(strings.NewReader(input))scanner.Split(bufio.ScanWords)count := 0for scanner.Scan() {    count++}if err := scanner.Err(); err != nil {    fmt.Fprintln(os.Stderr, "reading input:", err)}fmt.Println(count)

Writer

帶緩存的writer,記得在最終的寫入操作執行完后flush一下,確保全部緩存都真正寫入,如果大家想了解更多精彩內容,盡在https://js.Vevb.com。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲精品动漫久久久久| 日韩高清免费在线| 亚洲欧美日本精品| 国产精品欧美在线| xvideos成人免费中文版| 永久免费毛片在线播放不卡| 亚洲性线免费观看视频成熟| 亚洲精品一二区| 日本免费一区二区三区视频观看| 欧日韩不卡在线视频| 欧美日韩一区二区免费视频| 精品久久久久久久久中文字幕| 欧美插天视频在线播放| 国产精品爽爽爽| 日韩高清人体午夜| 国产精品午夜视频| 欧美俄罗斯乱妇| 国产精品久久二区| 欧美人在线视频| 在线观看欧美日韩国产| 欧美激情视频免费观看| 国产精品久久久久久久久| 亚洲国产精品国自产拍av秋霞| 国产91精品久久久久久| 亚洲图片制服诱惑| 亚洲精品成人免费| 国产精品一区二区三区久久| 91午夜在线播放| 欧美另类99xxxxx| www日韩欧美| 日韩av成人在线观看| 国产91成人video| 一本久久综合亚洲鲁鲁| 成人网中文字幕| 久久久精品2019中文字幕神马| 欧美激情乱人伦| 欧美性少妇18aaaa视频| xvideos成人免费中文版| 国产精品亚洲综合天堂夜夜| 日韩精品免费在线视频观看| 日韩av网站在线| 国产日产欧美精品| 88国产精品欧美一区二区三区| 国产偷亚洲偷欧美偷精品| 成人黄色在线观看| 91极品视频在线| 亚洲天天在线日亚洲洲精| 亚洲欧美中文日韩v在线观看| 午夜精品久久久久久久白皮肤| 亚洲女人天堂成人av在线| 欧美亚洲伦理www| 国产精品精品视频一区二区三区| 精品美女永久免费视频| 中文字幕欧美视频在线| 国产精品久久久久久av福利| 国产欧美精品在线| 欧美日韩国内自拍| 在线观看日韩www视频免费| 国产一区av在线| 日韩美女在线看| 最近更新的2019中文字幕| 国产成人在线播放| 国产精品福利小视频| 亚洲三级免费看| 91精品国产色综合| 91在线播放国产| 欧美福利视频网站| 欧美亚洲午夜视频在线观看| 欧美日韩在线另类| 日韩中文第一页| 亚洲免费电影在线观看| 日韩激情av在线播放| 欧美老女人xx| 国产成人av在线播放| 国产精品久久久久久久久久小说| 色综合五月天导航| 精品福利在线视频| 欧美日韩不卡合集视频| 日日骚久久av| 国产日韩欧美影视| 国产69久久精品成人看| 久久夜精品va视频免费观看| 97在线观看视频国产| 亚洲欧美激情另类校园| 欧美一级免费视频| 国产精品88a∨| 国产精品96久久久久久又黄又硬| 久久精品亚洲一区| 久久精品2019中文字幕| 97色在线观看免费视频| 最近2019中文字幕一页二页| 久久av红桃一区二区小说| 欧美一级在线播放| 欧美日韩国产麻豆| 亚洲日本中文字幕免费在线不卡| 欧美激情视频网| 亚洲欧美国产高清va在线播| 国产精品美乳在线观看| 欧美精品精品精品精品免费| 国产视频亚洲视频| 欧美激情精品在线| 国产精品普通话| 欧美黑人视频一区| 成人免费高清完整版在线观看| 亚洲在线一区二区| 97视频在线免费观看| 亚洲福利视频二区| 亚洲嫩模很污视频| 亚洲综合大片69999| 日韩欧美在线播放| 国产在线精品一区免费香蕉| 日本精品在线视频| 欧美黑人狂野猛交老妇| 亚洲欧美国产制服动漫| 欧美性xxxxx| 国产91精品黑色丝袜高跟鞋| 97在线观看视频国产| 成人精品一区二区三区电影免费| 欧美性感美女h网站在线观看免费| 成人444kkkk在线观看| 国产999精品久久久影片官网| 91精品91久久久久久| 久久九九有精品国产23| 91亚洲人电影| 亚洲精品久久在线| 日韩国产高清污视频在线观看| 久久免费精品日本久久中文字幕| 亚洲无av在线中文字幕| 91网站在线看| 久久夜色精品国产欧美乱| 97视频在线播放| 97精品欧美一区二区三区| 国产精品69精品一区二区三区| 久久久久久久久网站| 国产精品久久99久久| 亚洲视频欧洲视频| 97视频在线免费观看| 久久久av亚洲男天堂| 国产精品免费视频久久久| 久久久久九九九九| 国产精品影片在线观看| 亚洲免费视频一区二区| 日韩电影视频免费| 色悠悠国产精品| xxx成人少妇69| 精品中文字幕在线观看| 国产精品极品美女粉嫩高清在线| 久操成人在线视频| 久久久中精品2020中文| 国产成人精品亚洲精品| 中文字幕精品一区久久久久| 欧美精品成人91久久久久久久| 亚洲最大av在线| 欧美国产日韩中文字幕在线| 亚洲精品综合久久中文字幕| 久久精品国产69国产精品亚洲| 色老头一区二区三区在线观看| 亚洲精品视频中文字幕| 一区二区三区国产在线观看| 狠狠躁夜夜躁人人爽天天天天97| 日韩欧美中文字幕在线播放| 91美女福利视频高清| 国产精品久久久久aaaa九色| 亚洲欧美在线一区|