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

首頁 > 專題 > 區(qū)塊鏈 > 正文

區(qū)塊鏈開發(fā)中Go語言之IO操作

2020-02-25 19:26:52
字體:
供稿:網(wǎng)友

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

io,最基本的io

Reader

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

實(shí)現(xiàn)了Reader接口的都可以用read方法,將數(shù)據(jù)讀入到p字節(jié)數(shù)組,n表示讀取了幾個(gè)字節(jié),err返回錯(cuò)誤。 如果讀到了文件尾EOF,則err返回EOF。
注意,當(dāng)文件最后一小段已經(jīng)無法填滿p這個(gè)字節(jié)數(shù)組時(shí),不會(huì)產(chǎn)生EOF的錯(cuò)誤,只會(huì)在下一次讀取時(shí)產(chǎn)生n=0,err=io.EOF的錯(cuò)誤

舉例

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) 個(gè)字節(jié)從 p 中寫入到基本數(shù)據(jù)流中。它返回從 p 中被寫入的字節(jié)數(shù) n(0 常見錯(cuò)誤原因有磁盤滿了

ReaderAt 和 WriterAt 接口

和Reader,Writer類似,但是需要自己調(diào)控偏移量。
注意:接近文件尾巴時(shí),當(dāng)n小于數(shù)組大小時(shí)也觸發(fā)了err.EOF,需要自行把最后n小于數(shù)組大小的這點(diǎn)數(shù)據(jù)處理一下。

舉例:

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]) //區(qū)別在這里                break            } else {                os.Exit(1)            }        }        fmt.Printf("%s", a[:n])    }    fmt.Println()    fmt.Printf("%d", count)}

ReaderFrom 和 WriterTo 接口

一次性讀完直到EOF,或者寫入全部數(shù)據(jù)

Seeker 接口

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

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

  • 0 表示相對(duì)于文件的起始處
  • 1 表示相對(duì)于當(dāng)前的偏移,
  • 2 表示相對(duì)于其結(jié)尾處。

ByteReader 和 ByteWriter

讀或?qū)懸粋€(gè)字節(jié)

ioutil — 方便的IO操作函數(shù)集

ReadAll

一次性讀取數(shù)據(jù)

ReadDir

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

ReadFile 和 WriteFile

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

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

模式

數(shù)字

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 方法

后三個(gè)方法最終都是調(diào)用ReadSlice來實(shí)現(xiàn)的

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是指向同一個(gè)緩存數(shù)組,因此ReadSlice的實(shí)現(xiàn)是反復(fù)覆蓋重寫緩存數(shù)組。

如果ReadSlice在找到分界符前

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

返回的byte是copy的一份數(shù)組

從以下實(shí)驗(yàn)可看出來

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

是對(duì)ReadBytes的封裝,將返回的line轉(zhuǎn)換成string

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

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

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

Peek

該方法只是“窺探”一下Reader中沒有讀取的n個(gè)字節(jié)。好比棧數(shù)據(jù)結(jié)構(gòu)中的取棧頂元素,但不出棧。

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

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

Scanner 類型和方法

用于方便的按token讀取數(shù)據(jù),token的分詞規(guī)則用SplitFunc定義。默認(rèn)按行分詞,會(huì)去掉末尾換行符。 了解Scanner前要先了解SplitFunc

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

SplitFunc 定義了 用于對(duì)輸入進(jìn)行分詞的 split 函數(shù)的簽名。

參數(shù)

  1. data 是還未處理的數(shù)據(jù),
  2. atEOF 標(biāo)識(shí) Reader是否還有更多數(shù)據(jù)(是否到了EOF)。

返回值

  1. advance data里下一個(gè)token開始位置
  2. token 表示當(dāng)前token的結(jié)果數(shù)據(jù)
  3. err 則代表可能的錯(cuò)誤。

舉例

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"

你也可以用系統(tǒng)定義好的幾個(gè)分割token的方法。


  1. ScanBytes 返回單個(gè)字節(jié)作為一個(gè) token。
    ?

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

  3. ScanWords 返回通過“空格”分詞的單詞。如:study golang,調(diào)用會(huì)返回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設(shè)置分割token的方法
  3. 循環(huán)scanner.Scan()
  4. 在循環(huán)里用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,記得在最終的寫入操作執(zhí)行完后flush一下,確保全部緩存都真正寫入,如果大家想了解更多精彩內(nèi)容,盡在https://js.Vevb.com。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
国产精品九九九九| 成人网18免费软件大全| 国产在线成人| 久久手机精品视频| 成人在线看片网站| 国产一区二区欧美| 精品国一区二区三区| 国产精品福利在线| 香港经典三级在线| 男插女免费视频| 久久精品国产精品亚洲红杏| 国产一区二区精品调教| 国产女主播在线一区二区| 欧美福利电影网| 日本大胆欧美| 日韩高清第一页| 日本人妻丰满熟妇久久久久久| 日韩欧美精品中文字幕| 久久99久久精品欧美| 深夜福利av你懂的| 国产女人aaa级久久久级| 麻豆一区二区三| 91在线一区| www红色一片_亚洲成a人片在线观看_| 在线播放你懂的| 亚洲精品一区二区三区99| 欧美日本中文| 午夜成人鲁丝片午夜精品| 91九色国产视频| 亚洲综合资源| 亚洲成人免费看| 爽爽影院免费观看视频| 国产亚洲欧洲997久久综合| 色老板亚洲精品一区| 网曝门事件国产精品二区| 国产内射老熟女aaaa| 色偷偷精品视频在线播放| 亚洲狠狠婷婷综合久久久久图片| 亚洲xx在线| 日韩高清在线一区| 欧美精品亚洲二区| 91青青在线视频| 亚洲1024| 日韩精品视频中文在线观看| 精品国产乱子伦| 欧美三级在线| 卡一卡二卡三在线观看| 能看的毛片网站| 国产福利第一页| 蜜桃国内精品久久久久软件9| 操人视频欧美| 亚洲精品v亚洲精品v日韩精品| 国产又粗又黄又爽的视频| 欧美黑人巨大videos精品| 美女毛片一区二区三区四区最新中文字幕亚洲| 91热这里只有精品| 四虎影视成人永久免费观看视频| 亚洲第一精品夜夜躁人人躁| 捆绑调教一区二区三区| 日韩av在线免费看| 欧美一区二区三区……| 国产一区二区三区av电影| 欧美自拍偷拍一区二区| 夜夜操com| 亚洲色图都市激情| 一个人看的日本www的免费视频| 国产黄色录像视频| 夫妇交换中文字幕| 夜夜精品浪潮av一区二区三区| 免费观看欧美大片| 94色蜜桃网一区二区三区| 一区精品视频| 国产日韩精品一区观看| 日本午夜激情视频| 国产成人av影视| 韩国女同性做爰三级| 免费福利片在线观看| h文在线观看免费| 黄色aaaaaa| 一区视频在线播放| 色噜噜狠狠色综合中国| 91极品视频在线观看| 日本中文字幕电影| 亚洲动漫在线观看| 高清无码一区二区在线观看吞精| 乱小说综合网站| 亚洲精品乱码久久久久久按摩观| 国产精品天天看天天狠| 欧美群妇大交群的观看方式| 九色成人免费视频| 日韩免费一区二区| 亚洲午夜未满十八勿入免费观看全集| 色av男人的天堂免费在线| а√天堂资源地址在线下载| 337p粉嫩色噜噜噜大肥臀| 毛片在线网站| 中文字幕 国产精品| 六月丁香综合| 在线国产视频| 国产精品久久久乱弄| 91精品国产91久久久久久一区二区| 免费成年人视频在线观看| 秋霞欧美一区二区三区视频免费| 91亚洲精品在线| 黑人玩欧美人三根一起进| 99热成人精品热久久66| 国产特黄在线| 老牛国内精品亚洲成av人片| 久热中文字幕精品视频在线| 欧美日韩国产不卡| 欧美激情奇米色| 国产香蕉尹人视频在线| 欧美黑人粗大| 欧美 日韩 国产 精品| jizz视频播放器| 久久亚洲精品伦理| 国产成人精品一区二三区| 在线免费黄色网| 国产美女主播视频一区| 日本少妇高潮喷水xxxxxxx| 国产一级特黄a大片99| 久久国产精品波多野结衣| 午夜精品久久久久久久99黑人| 成人激情黄色小说| 免费v片在线观看| 国产激情视频一区二区在线观看| 欧美日韩激情网| 亚洲国产高清福利视频| 不卡毛片在线看| 日韩毛片高清在线播放| 日韩一区二区免费看| 亚洲欧美在线一区二区| 熟妇人妻一区二区三区四区| 中日韩美女免费视频网站在线观看| 国产v综合v亚洲欧美久久| 精品国产一区二区三区四区在线观看| 国产精品二区在线| 黄色免费电影网站| 少妇高潮一区二区三区99| 欧美在线视频一区二区三区| 刘亦菲国产毛片bd| 亚洲bt天天射| 亚洲精品日韩激情在线电影| 亚洲午夜久久久| 日韩理论电影中文字幕| 亚洲国产成人av网| 国产网红女主播精品视频| 亚洲精品蜜桃乱晃| 久久99久久精品欧美| 色综合视频网站| 亚洲激情在线视频| 久久综合网色—综合色88| 久久国产乱子精品免费女| 欧美a级在线| 国产男女激情视频| www成人免费观看| 精品69视频一区二区三区| 中文字幕在线观看免费高清| japanese日本护士撒尿| 性欧美18+| 日韩av电影国产| 亚洲精品av在线播放| 亚洲观看高清完整版在线观看| 天天免费亚洲黑人免费| 欧美xxxx黑人又粗又长| 国产无遮挡又黄又爽免费网站| 日韩一区二区三区不卡视频| 93久久精品日日躁夜夜躁欧美| 午夜在线视频一区二区区别| 久久青草久久| 98精品国产高清在线xxxx天堂| 亚洲人成电影网站色www| 欧美精品色婷婷五月综合| 成人动漫一区| 亚洲国产日韩欧美一区二区三区| 日韩大片在线播放| 公侵犯人妻一区二区三区| 成人中文字幕+乱码+中文字幕| 新呦u视频一区二区| 亚州精品天堂中文字幕| 一级做a爰片性色毛片视频| 免费日韩一区二区三区| 国产在线日韩欧美| 深夜视频在线观看| av观看久久| 精品噜噜噜噜久久久久久久久试看| 久操视频在线免费观看| 久久久精品视频免费| 樱桃视频在线观看一区| 情趣网站在线观看| 99视频入口| 亚洲欧美日韩在线高清直播| 国产成人一二片| 亚洲一区av在线播放| 高潮毛片7777777毛片| 亚洲性受xxx喷奶水| 夜夜操免费视频| 国产欧美在线一区二区| 亚洲黄色小说网站| 狠狠干天天爱| 国产精品天美传媒| 久久黄色免费网站| 91.成人天堂一区| 免费在线观看a级片| 中文字幕免费不卡| 国产精品不卡在线观看| 91九色蝌蚪91por成人| 亚洲精品二区| 亚洲精品电影网在线观看| 国产成人自拍视频在线| 国产视频欧美| 黄色av免费网站| 国内免费精品视频| 另类av一区二区| 男女猛烈激情xx00免费视频| 开心九九激情九九欧美日韩精美视频电影| 久久久精品2019中文字幕神马| 九九热99久久久国产盗摄| 同产精品九九九| 天美传媒免费在线观看| 亚洲综合精品在线| 国产毛片久久久久久| 尤物网站在线看| 婷婷一区二区三区| 国产视频一区二区三区在线观看| 国产一国产二国产三| 天天操夜夜操视频| 国产精品19p| 国产一区二区三区黄片| 久久影视中文粉嫩av| 欧美一区二区在线| 日日躁天天躁狠狠躁| 亚洲一二三不卡| 91精品国产色综合久久不卡粉嫩| 不卡视频免费在线观看| 娇小11一12╳yⅹ╳毛片| 国产一区二区网站| 一本色道久久88综合日韩精品| 黄色美女视频在线观看| 天天射,天天干| 东方欧美亚洲色图在线| 蜜桃精品噜噜噜成人av| 精品无码久久久久| 91精品在线影院| 日韩中文字幕在线视频播放| 污污在线观看| 人人超在线公开视频| 欧美成人午夜免费视在线看片| 亚洲国产日韩欧美在线| 色猫猫国产区一区二在线视频| 色综合久久综合网欧美综合网| 亚洲毛片一区二区三区| 日韩免费电影网站| 99国产精品久久久久| 亚洲欧美一区二区三区久久| gogo高清在线播放免费| 免费在线观看成年人视频| 欧美福利电影在线观看| 初尝黑人巨炮波多野结衣电影| 国产一区二区在线视频播放| 亚洲午夜三级在线| 国产精品久久久久高潮| 九九综合九九综合| www.97视频| 国产精品女人久久久久久| 成人欧美一区二区三区小说| 国产色综合一区二区三区| 影音先锋电影在线观看| 久精品免费视频| av一区二区三区在线观看| 国产 xxxx| 亚洲宅男一区| 九色porn蝌蚪| 国产在线视视频有精品| 九九热免费在线视频| 国产精品日韩久久久| 国产成人精品网址| 二区三区偷拍浴室洗澡视频| 亚洲AV无码成人精品一区| eeuss鲁片一区二区三区在线观看| 欧美一区免费| 色婷婷激情五月| 欧美日韩精品免费看| 国产精品一国产精品k频道56| 97影院手机在线观看| 无码人妻一区二区三区一| 中文字幕日本人妻久久久免费| 最新国产在线视频| 极品裸体白嫩激情啪啪国产精品| 中文字幕av第一页| 国产不卡一区二区在线观看| 日本视频在线观看一区二区三区| 欧美大片网址| 亚洲精品中文字幕乱码三区不卡| 嫩草www视频在线观看高清| 亚洲一区二区三区免费观看| 免费成年人视频在线观看| 欧美18免费视频| 国产一级片毛片| 欧美精品少妇videofree| 久久香蕉综合色| 欧美国产精品人人做人人爱| 欧美激情视频一区二区三区免费| 国产小视频免费在线观看| 久久久久99精品| 6080国产精品一区二区| 久草视频国产在线| 欧美狂猛xxxxx乱大交3| 亚洲天堂中文字幕| 国产精品美女视频免费观看软件| 顶级嫩模一区二区三区| 永久91嫩草亚洲精品人人| 成人3d动漫一区二区三区| 国产精品毛片在线| 亚洲一区二区视频在线观看| 午夜伦理在线视频| 干日本少妇首页| 日韩欧美高清dvd碟片| 国产美女久久久| 想看黄色一级片| 美女主播视频一区| 日韩欧美精品电影| 午夜精品网站| 免费国产阿v视频在线观看| 香港三级日本三级a视频| 国产绳艺sm调教室论坛| 尤物av一区二区| 日本中文字幕网址|