最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Go實(shí)現(xiàn)將io.Writer轉(zhuǎn)換成字符串

 更新時(shí)間:2024年05月05日 10:23:44   作者:zhonguncle  
golang中提供了各種類型之間的轉(zhuǎn)換方法,其中,將其他類型轉(zhuǎn)換為字符串類型是常見的操作,本文主要介紹了Go實(shí)現(xiàn)將io.Writer轉(zhuǎn)換成字符串,具有一定的參考價(jià)值,感興趣的可以了解一下

假設(shè)我們需要在Go中運(yùn)行下面的命令:

PS -A | grep wget

這里需要寫成兩個(gè)exec.Command,如下,第一個(gè)命令為cmd,第二個(gè)為cmd2

cmd := exec.Command("PS", "-A")
cmd2 := exec.Command("grep", "wget")

然后使用管道連接二者的標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)輸入,需要注意第一個(gè)命令cmd的標(biāo)準(zhǔn)輸出應(yīng)該使用cmd.StdoutPipe(),而不是Stdout,如下(忽略了錯(cuò)誤err和其處理):

cmd2.Stdin, _ = cmd.StdoutPipe()

因?yàn)?code>cmd.Stdout是一個(gè)io.Writer,是一個(gè)寫入器,因?yàn)檫@個(gè)輸出是要寫入某些地方的。而同理,cmd2.Stdin是一個(gè)io.Reader,是一個(gè)讀取器,用來讀取一些地方的內(nèi)容。二者直接賦值的話會出現(xiàn)類型不匹配的錯(cuò)誤。所以需要使用StdoutPipe()函數(shù),這個(gè)函數(shù)會返回一個(gè)io.Reader。(這里比較繞,所以可能需要想一下)

在獲取了輸出之后,需要將其轉(zhuǎn)換成字符串的話,可以使用bytes.Buffer來獲取cmd2.Stdout的標(biāo)準(zhǔn)輸出(記住這是個(gè)io.Writer),然后再轉(zhuǎn)換成字符串。

我們是是無法直接將io.Writer直接寫入到bytes.Buffer之中的,你可能會說bytes.Buffer不是有兩個(gè)方法ReadFromWriteTo嗎?

前者只能讀取io.Reader的,后者只能寫入io.Writer,所以我們需要一個(gè)管道來將io.Writer轉(zhuǎn)換成io.Reader,然后才能讀取或復(fù)制其內(nèi)容。而這個(gè)轉(zhuǎn)換就是再使用一次管道,如下:

var buf bytes.Buffer
r, w, _ := os.Pipe()
cmd2.Stdout = w
go buf.ReadFrom(r)

這里buf.ReadFrom(r)必須使用 goroutine,也就是讓這個(gè)代碼并行運(yùn)行,所以在前面加上go。

這里的go buf.ReadFrom(r)也可以使用go io.Copy(&buf, r)替代,效果一樣。

因?yàn)槊顖?zhí)行的順序是先啟動(dòng)cmd2,然后運(yùn)行cmd,cmd運(yùn)行完之后,數(shù)據(jù)流通過管道傳遞給cmd2,cmd2再運(yùn)行。不然cmd運(yùn)行的時(shí)候的標(biāo)準(zhǔn)輸出是空的,就會一直等。

buf.ReadFrom(r)cmd2也是同理,不過由于這是行代碼,無法使用start啟動(dòng)它,所以并行就行了。

接下來的命令如下:

cmd2.Start()
cmd.Run()
cmd2.Wait()

這里就是前面說的流程:cmd2啟動(dòng),運(yùn)行cmd,讓cmd2等待cmd的輸出。

需要注意一點(diǎn):go buf.ReadFrom(r)其實(shí)可以放在上面代碼中,除了最后一行之外的任何地方。之所以不能放在最后是因?yàn)檫@時(shí)候都運(yùn)行完了,再讀取就是空的了。

然后將其轉(zhuǎn)換成字符串:

str := buf.String()

打印看看:

fmt.Println("123" + str + "123")

之所以要前后都加上"123"是為了避免調(diào)試的時(shí)候把輸出到標(biāo)準(zhǔn)輸出文件的內(nèi)容當(dāng)成這里打印的。

結(jié)果如下:

% go run main.go
12360651 ttys010    0:00.00 grep wget
123

這里分成兩行是因?yàn)楂@取的時(shí)候grep wget后面有個(gè)\n,這里看不出來,如果%#v格式化打印就能看到了。

完整代碼如下:

func main() {
	cmd := exec.Command("PS", "-A")
	cmd2 := exec.Command("grep", "wget")
	cmd2.Stdin, _ = cmd.StdoutPipe()
	var buf bytes.Buffer
	r, w, _ := os.Pipe()
	cmd2.Stdout = w
	// 下面這行代碼可以替換為:go io.Copy(&buf, r)
	go buf.ReadFrom(r)
	cmd2.Start()
	cmd.Run()
	cmd2.Wait()
	str := buf.String()
	fmt.Println("123" + str + "123")
}

到此這篇關(guān)于Go實(shí)現(xiàn)將io.Writer轉(zhuǎn)換成字符串的文章就介紹到這了,更多相關(guān)Go io.Writer轉(zhuǎn)換成字符串內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Go中的nil切片和空切片區(qū)別詳解

    Go中的nil切片和空切片區(qū)別詳解

    這篇文章主要介紹了Go中的nil切片和空切片區(qū)別詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • go語言題解LeetCode1128等價(jià)多米諾骨牌對的數(shù)量

    go語言題解LeetCode1128等價(jià)多米諾骨牌對的數(shù)量

    這篇文章主要為大家介紹了go語言題解LeetCode1128等價(jià)多米諾骨牌對的數(shù)量示例詳解,
    2022-12-12
  • 最新評論

    桃园市| 寿光市| 南康市| 彭泽县| 晋城| 洛隆县| 毕节市| 鄂尔多斯市| 山丹县| 黔西| 集安市| 雷州市| 昭觉县| 精河县| 高阳县| 固原市| 霍城县| 建水县| 昂仁县| 宁陕县| 兴文县| 彰化市| 吴旗县| 桂东县| 富民县| 阳新县| 乌拉特前旗| 淅川县| 永康市| 元氏县| 长沙市| 龙井市| 山西省| 上思县| 宿松县| 陵川县| 丹巴县| 南昌县| 城步| 新田县| 大兴区|