欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

假設我們需要在Go中運行下面的命令:

PS -A | grep wget

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

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

然后使用管道連接二者的標準輸出和標準輸入,需要注意第一個命令cmd的標準輸出應該使用cmd.StdoutPipe(),而不是Stdout,如下(忽略了錯誤err和其處理):

cmd2.Stdin, _ = cmd.StdoutPipe()

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

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

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

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

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

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

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

因為命令執(zhí)行的順序是先啟動cmd2,然后運行cmd,cmd運行完之后,數據流通過管道傳遞給cmd2,cmd2再運行。不然cmd運行的時候的標準輸出是空的,就會一直等。

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

接下來的命令如下:

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

這里就是前面說的流程:cmd2啟動,運行cmd,讓cmd2等待cmd的輸出。

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

然后將其轉換成字符串:

str := buf.String()

打印看看:

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

之所以要前后都加上"123"是為了避免調試的時候把輸出到標準輸出文件的內容當成這里打印的。

結果如下:

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

這里分成兩行是因為獲取的時候grep wget后面有個\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")
}

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

相關文章

  • golang 如何獲取map所有key的方式

    golang 如何獲取map所有key的方式

    這篇文章主要介紹了golang 獲取map所有key的方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • Go語言學習之時間函數使用詳解

    Go語言學習之時間函數使用詳解

    這篇文章主要為大家詳細介紹了Go語言中時間函數的使用方法,文中的示例代碼講解詳細,對我們學習Go語言有一定的幫助,需要的可以參考一下
    2022-04-04
  • Golang IPv4 字符串與整數互轉方式

    Golang IPv4 字符串與整數互轉方式

    這篇文章主要介紹了Golang IPv4 字符串與整數互轉方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • Golang實現(xiàn)帶優(yōu)先級的select

    Golang實現(xiàn)帶優(yōu)先級的select

    這篇文章主要為大家詳細介紹了如何在Golang中實現(xiàn)帶優(yōu)先級的select,文中的示例代碼講解詳細,對我們學習Golang有一定的幫助,需要的可以參考一下
    2023-04-04
  • 一文詳解如何使用 Golang 處理文件

    一文詳解如何使用 Golang 處理文件

    Golang 是一種強類型、靜態(tài)編譯、并發(fā)性高的編程語言,我們將重點介紹 Golang 中的文件基本操作,包括創(chuàng)建文件與查看狀態(tài),重命名與移動,刪除與截斷,讀寫文件,以及權限控制,跟著小編一起來學習吧
    2023-04-04
  • Go1.21新增內置函數(built-in?functions)詳解

    Go1.21新增內置函數(built-in?functions)詳解

    Go?1.21新增的內置函數分別是?min、max?和?clear,這篇文章主要帶大家一起了解一下這幾個函數的用途和使用示例,感興趣的小伙伴可以學習一下
    2023-08-08
  • golang實現(xiàn)大文件讀取的代碼示例

    golang實現(xiàn)大文件讀取的代碼示例

    在實際工作,我們需要讀取大數據文件,文件可能上G百G,所以我們不可能一次性的讀取到內存,接下來本文給大家介紹了golang實現(xiàn)大文件讀取的示例,需要的朋友可以參考下
    2024-04-04
  • 深入理解GO語言的面向對象

    深入理解GO語言的面向對象

    相信很多人當初開發(fā)go語言的時候就是因為C++的特性太過于繁雜,從而使得很多C++的開發(fā)者因為C++的特性而頭疼,go語言成功的精簡了C++的特性,使其很簡潔,很少的特性,卻可以完成很多的事情。下面我們就來詳細理解下GO語言的面向對象。
    2016-10-10
  • Golang配置解析神器go?viper使用詳解

    Golang配置解析神器go?viper使用詳解

    viper是一個很完善的Go項目配置解決方案,很多著名的開源項目都在使用,比如Hugo,Docker都使用了該庫,使用viper可以讓我們專注于自己的項目代碼,而不用自己寫那些配置解析代碼,本文給大家介紹Golang配置解析神器go?viper使用,感興趣的朋友一起看看吧
    2022-05-05
  • go語言的初始化順序,包,變量,init詳解

    go語言的初始化順序,包,變量,init詳解

    這篇文章主要介紹了go語言的初始化順序,包,變量,init詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12

最新評論