Golang學習 - bytes 包

對于傳入 []byte 的函數(shù)汁尺,都不會修改傳入的參數(shù),返回值要么是參數(shù)的副本沛厨,要么是參數(shù)的切片。


// 轉(zhuǎn)換

// 將 s 中的所有字符修改為大寫(小寫摔认、標題)格式返回逆皮。
func ToUpper(s []byte) []byte
func ToLower(s []byte) []byte
func ToTitle(s []byte) []byte

// 使用指定的映射表將 s 中的所有字符修改為大寫(小寫、標題)格式返回参袱。
func ToUpperSpecial(_case unicode.SpecialCase, s []byte) []byte
func ToLowerSpecial(_case unicode.SpecialCase, s []byte) []byte
func ToTitleSpecial(_case unicode.SpecialCase, s []byte) []byte

// 將 s 中的所有單詞的首字符修改為 Title 格式返回电谣。
// BUG: 不能很好的處理以 Unicode 標點符號分隔的單詞。
func Title(s []byte) []byte


// 比較

// 比較兩個 []byte抹蚀,nil 參數(shù)相當于空 []byte辰企。
// a < b 返回 -1
// a == b 返回 0
// a > b 返回 1
func Compare(a, b []byte) int

// 判斷 a、b 是否相等况鸣,nil 參數(shù)相當于空 []byte牢贸。
func Equal(a, b []byte) bool

// 判斷 s、t 是否相似镐捧,忽略大寫潜索、小寫、標題三種格式的區(qū)別懂酱。
// 參考 unicode.SimpleFold 函數(shù)竹习。
func EqualFold(s, t []byte) bool


// 示例:EqualFold
func main() {
    s1 := "Φφ? kK?"
    s2 := "?Φφ ?kK"

    // 看看 s1 里面是什么
    for _, c := range s1 {
        fmt.Printf("%-5x", c)
    }
    fmt.Println()
    // 看看 s2 里面是什么
    for _, c := range s2 {
        fmt.Printf("%-5x", c)
    }
    fmt.Println()
    // 看看 s1 和 s2 是否相似
    fmt.Println(bytes.EqualFold([]byte(s1), []byte(s2)))
}

// 輸出結(jié)果:
// 3a6  3c6  3d5  20   6b   4b   212a 
// 3d5  3a6  3c6  20   212a 6b   4b   
// true

// 清理

// 去掉 s 兩邊(左邊、右邊)包含在 cutset 中的字符(返回 s 的切片)
func Trim(s []byte, cutset string) []byte
func TrimLeft(s []byte, cutset string) []byte
func TrimRight(s []byte, cutset string) []byte

// 去掉 s 兩邊(左邊列牺、右邊)符合 f 要求的字符(返回 s 的切片)
func TrimFunc(s []byte, f func(r rune) bool) []byte
func TrimLeftFunc(s []byte, f func(r rune) bool) []byte
func TrimRightFunc(s []byte, f func(r rune) bool) []byte

// 去掉 s 兩邊的空白(unicode.IsSpace)(返回 s 的切片)
func TrimSpace(s []byte) []byte

// 去掉 s 的前綴 prefix(后綴 suffix)(返回 s 的切片)
func TrimPrefix(s, prefix []byte) []byte
func TrimSuffix(s, suffix []byte) []byte


// 示例
func main() {
    bs := [][]byte{
        []byte("Hello World !"),
        []byte("Hello 世界整陌!"),
        []byte("hello golang ."),
    }
    f := func(r rune) bool {
        return bytes.ContainsRune([]byte("!!. "), r)
    }
    for _, b := range bs {
        fmt.Printf("%q\n", bytes.TrimFunc(b, f))
    }
    // "Hello World"
    // "Hello 世界"
    // "Hello Golang"
    for _, b := range bs {
        fmt.Printf("%q\n", bytes.TrimPrefix(b, []byte("Hello ")))
    }
    // "World !"
    // "世界瞎领!"
    // "hello Golang ."
}

// 拆合

// Split 以 sep 為分隔符將 s 切分成多個子串泌辫,結(jié)果不包含分隔符。
// 如果 sep 為空九默,則將 s 切分成 Unicode 字符列表震放。
// SplitN 可以指定切分次數(shù) n,超出 n 的部分將不進行切分驼修。
func Split(s, sep []byte) [][]byte
func SplitN(s, sep []byte, n int) [][]byte

// 功能同 Split殿遂,只不過結(jié)果包含分隔符(在各個子串尾部)。
func SplitAfter(s, sep []byte) [][]byte
func SplitAfterN(s, sep []byte, n int) [][]byte

// 以連續(xù)空白為分隔符將 s 切分成多個子串乙各,結(jié)果不包含分隔符墨礁。
func Fields(s []byte) [][]byte

// 以符合 f 的字符為分隔符將 s 切分成多個子串,結(jié)果不包含分隔符耳峦。
func FieldsFunc(s []byte, f func(rune) bool) [][]byte

// 以 sep 為連接符恩静,將子串列表 s 連接成一個字節(jié)串。
func Join(s [][]byte, sep []byte) []byte

// 將子串 b 重復(fù) count 次后返回妇萄。
func Repeat(b []byte, count int) []byte


// 示例
func main() {
    b := []byte("  Hello   World !  ")
    fmt.Printf("%q\n", bytes.Split(b, []byte{' '}))
    // ["" "" "Hello" "" "" "World" "!" "" ""]
    fmt.Printf("%q\n", bytes.Fields(b))
    // ["Hello" "World" "!"]
    f := func(r rune) bool {
        return bytes.ContainsRune([]byte(" !"), r)
    }
    fmt.Printf("%q\n", bytes.FieldsFunc(b, f))
    // ["Hello" "World"]
}

// 子串

// 判斷 s 是否有前綴 prefix(后綴 suffix)
func HasPrefix(s, prefix []byte) bool
func HasSuffix(s, suffix []byte) bool

// 判斷 b 中是否包含子串 subslice(字符 r)
func Contains(b, subslice []byte) bool
func ContainsRune(b []byte, r rune) bool

// 判斷 b 中是否包含 chars 中的任何一個字符
func ContainsAny(b []byte, chars string) bool

// 查找子串 sep(字節(jié) c蜕企、字符 r)在 s 中第一次出現(xiàn)的位置,找不到則返回 -1冠句。
func Index(s, sep []byte) int
func IndexByte(s []byte, c byte) int
func IndexRune(s []byte, r rune) int

// 查找 chars 中的任何一個字符在 s 中第一次出現(xiàn)的位置轻掩,找不到則返回 -1。
func IndexAny(s []byte, chars string) int

// 查找符合 f 的字符在 s 中第一次出現(xiàn)的位置懦底,找不到則返回 -1唇牧。
func IndexFunc(s []byte, f func(r rune) bool) int

// 功能同上,只不過查找最后一次出現(xiàn)的位置聚唐。
func LastIndex(s, sep []byte) int
func LastIndexByte(s []byte, c byte) int
func LastIndexAny(s []byte, chars string) int
func LastIndexFunc(s []byte, f func(r rune) bool) int

// 獲取 sep 在 s 中出現(xiàn)的次數(shù)(sep 不能重疊)丐重。
func Count(s, sep []byte) int


// 替換

// 將 s 中前 n 個 old 替換為 new,n < 0 則替換全部杆查。
func Replace(s, old, new []byte, n int) []byte

// 將 s 中的字符替換為 mapping(r) 的返回值扮惦,
// 如果 mapping 返回負值,則丟棄該字符亲桦。
func Map(mapping func(r rune) rune, s []byte) []byte

// 將 s 轉(zhuǎn)換為 []rune 類型返回
func Runes(s []byte) []rune


type Reader struct { ... }

// 將 b 包裝成 bytes.Reader 對象崖蜜。
func NewReader(b []byte) *Reader

// bytes.Reader 實現(xiàn)了如下接口:
// io.ReadSeeker
// io.ReaderAt
// io.WriterTo
// io.ByteScanner
// io.RuneScanner

// 返回未讀取部分的數(shù)據(jù)長度
func (r *Reader) Len() int

// 返回底層數(shù)據(jù)的總長度,方便 ReadAt 使用客峭,返回值永遠不變豫领。
func (r *Reader) Size() int64

// 將底層數(shù)據(jù)切換為 b,同時復(fù)位所有標記(讀取位置等信息)舔琅。
func (r *Reader) Reset(b []byte)


// 示例
func main() {
    b1 := []byte("Hello World!")
    b2 := []byte("Hello 世界等恐!")
    buf := make([]byte, 6)
    rd := bytes.NewReader(b1)
    rd.Read(buf)
    fmt.Printf("%q\n", buf) // "Hello "
    rd.Read(buf)
    fmt.Printf("%q\n", buf) // "World!"

    rd.Reset(b2)
    rd.Read(buf)
    fmt.Printf("%q\n", buf) // "Hello "
    fmt.Printf("Size:%d, Len:%d\n", rd.Size(), rd.Len())
    // Size:15, Len:9
}

type Buffer struct { ... }

// 將 buf 包裝成 bytes.Buffer 對象。
func NewBuffer(buf []byte) *Buffer

// 將 s 轉(zhuǎn)換為 []byte 后备蚓,包裝成 bytes.Buffer 對象课蔬。
func NewBufferString(s string) *Buffer

// Buffer 本身就是一個緩存(內(nèi)存塊),沒有底層數(shù)據(jù)郊尝,緩存的容量會根據(jù)需要
// 自動調(diào)整购笆。大多數(shù)情況下,使用 new(Buffer) 就足以初始化一個 Buffer 了虚循。

// bytes.Buffer 實現(xiàn)了如下接口:
// io.ReadWriter
// io.ReaderFrom
// io.WriterTo
// io.ByteWeriter
// io.ByteScanner
// io.RuneScanner

// 未讀取部分的數(shù)據(jù)長度
func (b *Buffer) Len() int

// 緩存的容量
func (b *Buffer) Cap() int

// 讀取前 n 字節(jié)的數(shù)據(jù)并以切片形式返回同欠,如果數(shù)據(jù)長度小于 n,則全部讀取横缔。
// 切片只在下一次讀寫操作前合法铺遂。
func (b *Buffer) Next(n int) []byte

// 讀取第一個 delim 及其之前的內(nèi)容,返回遇到的錯誤(一般是 io.EOF)茎刚。
func (b *Buffer) ReadBytes(delim byte) (line []byte, err error)
func (b *Buffer) ReadString(delim byte) (line string, err error)

// 寫入 r 的 UTF-8 編碼襟锐,返回寫入的字節(jié)數(shù)和 nil。
// 保留 err 是為了匹配 bufio.Writer 的 WriteRune 方法膛锭。
func (b *Buffer) WriteRune(r rune) (n int, err error)

// 寫入 s粮坞,返回寫入的字節(jié)數(shù)和 nil蚊荣。
func (b *Buffer) WriteString(s string) (n int, err error)

// 引用未讀取部分的數(shù)據(jù)切片(不移動讀取位置)
func (b *Buffer) Bytes() []byte

// 返回未讀取部分的數(shù)據(jù)字符串(不移動讀取位置)
func (b *Buffer) String() string

// 自動增加緩存容量,以保證有 n 字節(jié)的剩余空間莫杈。
// 如果 n 小于 0 或無法增加容量則會 panic互例。
func (b *Buffer) Grow(n int)

// 將數(shù)據(jù)長度截短到 n 字節(jié),如果 n 小于 0 或大于 Cap 則 panic筝闹。
func (b *Buffer) Truncate(n int)

// 重設(shè)緩沖區(qū)媳叨,清空所有數(shù)據(jù)(包括初始內(nèi)容)。
func (b *Buffer) Reset()


// 示例
func main() {
    rd := bytes.NewBufferString("Hello World!")
    buf := make([]byte, 6)
    // 獲取數(shù)據(jù)切片
    b := rd.Bytes()
    // 讀出一部分數(shù)據(jù)关顷,看看切片有沒有變化
    rd.Read(buf)
    fmt.Printf("%s\n", rd.String()) // World!
    fmt.Printf("%s\n\n", b)         // Hello World!

    // 寫入一部分數(shù)據(jù)糊秆,看看切片有沒有變化
    rd.Write([]byte("abcdefg"))
    fmt.Printf("%s\n", rd.String()) // World!abcdefg
    fmt.Printf("%s\n\n", b)         // Hello World!

    // 再讀出一部分數(shù)據(jù),看看切片有沒有變化
    rd.Read(buf)
    fmt.Printf("%s\n", rd.String()) // abcdefg
    fmt.Printf("%s\n", b)           // Hello World!
}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末议双,一起剝皮案震驚了整個濱河市痘番,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌平痰,老刑警劉巖夫偶,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異觉增,居然都是意外死亡兵拢,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門逾礁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來说铃,“玉大人,你說我怎么就攤上這事嘹履∧迳龋” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵砾嫉,是天一觀的道長幼苛。 經(jīng)常有香客問我,道長焕刮,這世上最難降的妖魔是什么舶沿? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮配并,結(jié)果婚禮上括荡,老公的妹妹穿的比我還像新娘。我一直安慰自己溉旋,他們只是感情好畸冲,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般邑闲。 火紅的嫁衣襯著肌膚如雪算行。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天苫耸,我揣著相機與錄音州邢,去河邊找鬼。 笑死鲸阔,一個胖子當著我的面吹牛偷霉,可吹牛的內(nèi)容都是我干的迄委。 我是一名探鬼主播褐筛,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼叙身!你這毒婦竟也來了渔扎?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤信轿,失蹤者是張志新(化名)和其女友劉穎晃痴,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體财忽,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡倘核,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了即彪。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片紧唱。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖隶校,靈堂內(nèi)的尸體忽然破棺而出漏益,到底是詐尸還是另有隱情,我是刑警寧澤深胳,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布绰疤,位于F島的核電站,受9級特大地震影響舞终,放射性物質(zhì)發(fā)生泄漏轻庆。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一敛劝、第九天 我趴在偏房一處隱蔽的房頂上張望榨了。 院中可真熱鬧,春花似錦攘蔽、人聲如沸龙屉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽转捕。三九已至作岖,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間五芝,已是汗流浹背痘儡。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留枢步,地道東北人沉删。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像醉途,于是被迫代替她去往敵國和親矾瑰。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容