Skip to main content

Go strings 套件介紹

官方文件:strings - pkg.go.dev

strings 是 Go 標準庫的一員,用來操作 UTF-8 編碼字串
關於 Go 中 UTF-8 字串的說明可參考:Strings, bytes, runes and characters in Go


概述

  • 套件路徑strings
  • 用途:字串搜尋、比較、切割、替換、大小寫、trim、高效組字串等
  • 編碼:以 UTF-8 為準,函式多數以 位元組 index 回傳(不是 rune index)

函式分類

搜尋與包含

函式說明
Contains(s, substr string) bool是否包含子字串 substr
ContainsAny(s, chars string) bool是否包含 chars 中任一字元
ContainsRune(s string, r rune) bool是否包含某個 Unicode 碼點
ContainsFunc(s string, f func(rune) bool) bool是否有字元滿足 f(Go 1.21+)
HasPrefix(s, prefix string) bool是否以 prefix 開頭
HasSuffix(s, suffix string) bool是否以 suffix 結尾

索引(回傳第一個/最後一個位置,無則 -1)

函式說明
Index(s, substr string) int子字串第一次出現的 index
LastIndex(s, substr string) int子字串最後一次出現的 index
IndexByte(s string, c byte) int某 byte 第一次出現
LastIndexByte(s string, c byte) int某 byte 最後一次出現
IndexRune(s string, r rune) int某 rune 第一次出現
IndexAny(s, chars string) intchars 中任一字元第一次出現
LastIndexAny(s, chars string) intchars 中任一字元最後一次出現
IndexFunc(s string, f func(rune) bool) int第一個滿足 f 的字元 index
LastIndexFunc(s string, f func(rune) bool) int最後一個滿足 f 的字元 index

比較

函式說明
Compare(a, b string) int字典序比較:0 相等、-1 a<b、+1 a>b;一般用 == / &lt; / &gt; 即可
EqualFold(s, t string) bool不區分大小寫的相等(簡單 Unicode case-folding)

切割與組合

函式說明
Split(s, sep string) []stringsep 切開,回傳子字串 slice
SplitN(s, sep string, n int) []string最多切 n
SplitAfter(s, sep string) []string切在 sep 後面,保留分隔符
SplitAfterN(s, sep string, n int) []string同上,最多 n
SplitSeq(s, sep string) iter.Seq[string]迭代器版 Split(Go 1.24+)
SplitAfterSeq, FieldsSeq, FieldsFuncSeq對應的迭代器版本
Cut(s, sep string) (before, after string, found bool)依第一個 sep 切成前後兩段(Go 1.18+)
CutPrefix(s, prefix string) (after string, found bool)去掉前綴(Go 1.20+)
CutSuffix(s, suffix string) (before string, found bool)去掉後綴(Go 1.20+)
Fields(s string) []string依空白切開(unicode.IsSpace
FieldsFunc(s string, f func(rune) bool) []string依自訂 f 切開
Lines(s string) iter.Seq[string]依換行迭代每一行(Go 1.24+)
Join(elems []string, sep string) stringsep 把多個字串接成一個

替換與計數

函式說明
Replace(s, old, new string, n int) string替換前 n 次(n < 0 表示全部)
ReplaceAll(s, old, new string) string替換所有(Go 1.12+)
Count(s, substr string) int不重疊出現次數;substr == "" 時回傳 1+len(runes)

大小寫與字元轉換

函式說明
ToUpper(s string) string全轉大寫
ToLower(s string) string全轉小寫
ToTitle(s string) stringUnicode title case
ToUpperSpecial(c unicode.SpecialCase, s string) string依特殊規則大寫(如土耳其語)
ToLowerSpecial, ToTitleSpecial同上,小寫/title
Title(s string) string已棄用,建議用 golang.org/x/text/cases
Map(mapping func(rune) rune, s string) string每個 rune 經 mapping 轉換;回傳負值則刪除該字元

Trim(去頭尾)

函式說明
TrimSpace(s string) string去掉頭尾空白(unicode.IsSpace
Trim(s, cutset string) string去掉頭尾在 cutset 內的字元
TrimLeft, TrimRight只去左/右
TrimPrefix(s, prefix string) string只去掉前綴(沒有前綴就原樣回傳)
TrimSuffix(s, suffix string) string只去掉後綴
TrimFunc, TrimLeftFunc, TrimRightFuncfunc(rune) bool 決定要 trim 的字元

其他工具

函式說明
Repeat(s string, count int) string重複 scount
Clone(s string) string複製成新配置的字串(Go 1.18+),大字串取子串時可省記憶體
ToValidUTF8(s, replacement string) string將無效 UTF-8 序列替換成 replacement(Go 1.13+)

型別

Builder(Go 1.10+)

用來高效組字串,減少記憶體複製。

  • WriteString(s string) (int, error)
  • Write(p []byte) (int, error)WriteByte(c byte)WriteRune(r rune)
  • String() string:取得組好的字串
  • Len() intCap() intGrow(n int)Reset()

零值即可使用,不要複製已使用過的 Builder

Reader

把字串當成 io.Reader 來讀。

  • NewReader(s string) *Reader
  • 實作:io.Reader, io.ReaderAt, io.ByteReader, io.RuneReader, io.Seeker, io.WriterTo
  • Len()Size()Reset(s string)

Replacer

多組「舊→新」替換,可重複使用、goroutine 安全。

  • NewReplacer(oldnew ...string) *Replacer:參數為 old1, new1, old2, new2, ...(奇數個會 panic)
  • Replace(s string) string
  • WriteString(w io.Writer, s string) (n int, err error)

簡單範例

package main

import (
"fmt"
"strings"
)

func main() {
// 搜尋與包含
fmt.Println(strings.Contains("seafood", "foo")) // true
fmt.Println(strings.Index("chicken", "ken")) // 4
fmt.Println(strings.HasPrefix("Gopher", "Go")) // true

// Cut:依第一個分隔符切成兩段
before, after, ok := strings.Cut("Gopher", "ph")
fmt.Println(before, after, ok) // Go er true

// 切割與組合
fmt.Println(strings.Split("a,b,c", ",")) // [a b c]
fmt.Println(strings.Join([]string{"a", "b"}, "-")) // a-b
fmt.Println(strings.Fields(" foo bar baz ")) // [foo bar baz]

// 替換
fmt.Println(strings.ReplaceAll("oink oink", "oink", "moo")) // moo moo

// Trim
fmt.Println(strings.TrimSpace(" \t\n Hello \n\t ")) // Hello

// Builder
var b strings.Builder
b.WriteString("Hello")
b.WriteString(", ")
b.WriteString("World")
fmt.Println(b.String()) // Hello, World
}

注意事項

  1. 索引是 byte 位置IndexLastIndex 等回傳的是位元組 index,不是 rune 數;若需「第幾個字元」要自己用 utf8 或 range 處理。
  2. 空字串Contains(s, "")trueCount(s, "")1 + 字元數
  3. Title 已棄用:需依單字轉 title case 時建議用 golang.org/x/text/cases
  4. EqualFold:不做完整 Unicode case-folding,例如 ßss 會是 false

完整 API 與範例請以 pkg.go.dev/strings 為準。