## 使用bytes和strings包
bytes 和 string 包有許多有用的函數以幫助使用者在字符串和字節類型之間進行處理和轉換。這些函數可用于創建多種通用 I/O 接口的緩沖區。
### 準備
請參閱上一節,關于使用常見I/O接口的準備步驟。
### 實踐
1. 創建buffer.go:
```
package bytestrings
import (
"bytes"
"io"
"io/ioutil"
)
// Buffer 演示了初始化字節緩沖區的一些技巧
// 實現了 io.Reader 接口
func Buffer(rawString string) *bytes.Buffer {
// 將傳入的字符串轉換為字節數組
rawBytes := []byte(rawString)
// 有很多方式使用字節數組或原始字符串建立緩沖區
var b = new(bytes.Buffer)
b.Write(rawBytes)
// 或者
b = bytes.NewBuffer(rawBytes)
// 使用字符串建立字節數組
b = bytes.NewBufferString(rawString)
return b
}
// ToString接收 io.Reader 并將其轉換為字符串返回
func toString(r io.Reader) (string, error) {
b, err := ioutil.ReadAll(r)
if err != nil {
return "", err
}
return string(b), nil
}
```
2. 建立bytes.go,[Golang學習 - bufio 包](https://www.cnblogs.com/golove/p/3282667.html)對buffio解讀很完整,值得一讀:
```
package bytestrings
import (
"bufio"
"bytes"
"fmt"
)
// WorkWithBuffer 會使用創建自 Buffer 函數的字節緩沖區
func WorkWithBuffer() error {
rawString := "it's easy to encode unicode into a byte array ??"
b := Buffer(rawString)
// 使用b.Bytes()可以快速從字節緩沖區獲取字節切片
// 使用b.String()可以快速從字節緩沖區獲取字符串
fmt.Println(b.String())
// 由于*bytes.Buffer類型的b實現了io Reader 我們可以使用常見的reader函數
s, err := toString(b)
if err != nil {
return err
}
fmt.Println(s)
// 可以創建一個 bytes reader 它實現了
// io.Reader, io.ReaderAt,
// io.WriterTo, io.Seeker, io.ByteScanner, and io.RuneScanner
// 接口
reader := bytes.NewReader([]byte(rawString))
// 我們可以使用其創建 scanner 以允許使用緩存讀取和建立 token
scanner := bufio.NewScanner(reader)
scanner.Split(bufio.ScanWords)
// 遍歷所有的掃描token
for scanner.Scan() {
fmt.Print(scanner.Text())
}
return nil
}
```
3. 建立 string.go:
```
package bytestrings
import (
"fmt"
"io"
"os"
"strings"
)
// SearchString 展示了一系列在字符串中進行查詢的方法
func SearchString() {
s := "this is a test"
// 返回 true 表明包含子串
fmt.Println(strings.Contains(s, "this"))
// 返回 true 表明包含子串中的任何一字符a或b或c
fmt.Println(strings.ContainsAny(s, "abc"))
// 返回 true 表明以該子串開頭
fmt.Println(strings.HasPrefix(s, "this"))
// 返回 true 表明以該子串結尾
fmt.Println(strings.HasSuffix(s, "test"))
}
// ModifyString 展示了一系列修改字符串的方法
func ModifyString() {
s := "simple string"
// 輸出 [simple string]
fmt.Println(strings.Split(s, " "))
// 輸出 "Simple String"
fmt.Println(strings.Title(s))
// 輸出 "simple string" 會移除頭部和尾部的空白
s = " simple string "
fmt.Println(strings.TrimSpace(s))
}
// StringReader 演示了如何快速創建一個字符串的io.Reader接口
func StringReader() {
s := "simple string\n"
r := strings.NewReader(s)
// 在標準輸出上打印 s
io.Copy(os.Stdout, r)
}
```
4. 建立main.go:
```
package main
import "github.com/agtorre/go-cookbook/chapter1/bytestrings"
func main() {
err := bytestrings.WorkWithBuffer()
if err != nil {
panic(err)
}
// each of these print to stdout
bytestrings.SearchString()
bytestrings.ModifyString()
bytestrings.StringReader()
}
```
5. 執行 go run main.go
6. 這會輸出(*<small>原文此處將心形顯示為亂碼,不過在譯者的win7 Go1.10.1環境下可以完整顯示出來</small>*):
```
it's easy to encode unicode into a byte array ??
it's easy to encode unicode into a byte array ??
it'seasytoencodeunicodeintoabytearray??true
true
true
true
[simple string]
Simple String
simple string
simple string
```
### 說明
bytes 包在處理數據時提供了許多便利功能。 例如,使用流處理庫或方法時,緩沖區比字節數組更靈活。一旦你創建了一個緩沖區,它可以用來滿足io.Reader接口,所以你可以利用ioutil包中的各種函數來操作數據。 對于流應用,你可能需要使用buffer 和 scanner,bufio包可以在這些情況下派上用場。 有時,使用數組或切片更適合較小的數據集,或者當你的計算機上有大量內存,無需考慮過多考慮時。
Go為這些基本類型的接口之間的轉換提供了很大的靈活性——在字符串和字節之間轉換相對簡單。使用字符串時,string包提供了許多方便的函數來搜索和處理字符串。在某些情況下,一個好的正則表達式可能是合適的,但大多數情況下,string和strconv包就足夠了。string包允許你將字符串標題化,將其拆分為數組或修剪空白,它還提供了一個可以用來代替bytes包讀取器類型的Reader接口。
* * * *
學識淺薄,錯誤在所難免。歡迎在群中就本書提出修改意見,以饗后來者,長風拜謝。
Golang中國(211938256)
beego實戰(258969317)
Go實踐(386056972)
- 前言
- 第一章 I/O和文件系統
- 常見 I/O 接口
- 使用bytes和strings包
- 操作文件夾和文件
- 使用CSV格式化數據
- 操作臨時文件
- 使用 text/template和HTML/templates包
- 第二章 命令行工具
- 解析命令行flag標識
- 解析命令行參數
- 讀取和設置環境變量
- 操作TOML,YAML和JSON配置文件
- 操做Unix系統下的pipe管道
- 處理信號量
- ANSI命令行著色
- 第三章 數據類型轉換和解析
- 數據類型和接口轉換
- 使用math包和math/big包處理數字類型
- 貨幣轉換和float64注意事項
- 使用指針和SQL Null類型進行編碼和解碼
- 對Go數據編碼和解碼
- Go中的結構體標簽和反射
- 通過閉包實現集合操作
- 第四章 錯誤處理
- 錯誤接口
- 使用第三方errors包
- 使用log包記錄錯誤
- 結構化日志記錄
- 使用context包進行日志記錄
- 使用包級全局變量
- 處理恐慌
- 第五章 數據存儲
- 使用database/sql包操作MySQL
- 執行數據庫事務接口
- SQL的連接池速率限制和超時
- 操作Redis
- 操作MongoDB
- 創建存儲接口以實現數據可移植性
- 第六章 Web客戶端和APIs
- 使用http.Client
- 調用REST API
- 并發操作客戶端請求
- 使用OAuth2
- 實現OAuth2令牌存儲接口
- 封裝http請求客戶端
- 理解GRPC的使用
- 第七章 網絡服務
- 處理Web請求
- 使用閉包進行狀態處理
- 請求參數驗證
- 內容渲染
- 使用中間件
- 構建反向代理
- 將GRPC導出為JSON API
- 第八章 測試
- 使用標準庫進行模擬
- 使用Mockgen包
- 使用表驅動測試
- 使用第三方測試工具
- 模糊測試
- 行為驅動測試
- 第九章 并發和并行
- 第十章 分布式系統
- 第十一章 響應式編程和數據流
- 第十二章 無服務器編程
- 第十三章 性能改進