跳至主要内容

[pkg] strings

strings @ golang

字串建立

多行字串

使用反引號可以建立多行的字串,包含縮排也會一併被保留:

	str := `
Hello
World
of
Go
`

字串連結(string concatenation)

使用 bytes.Bufferstrings.Builder 來拼接字串會比使用 ++= 效能來得好(參考:Efficiently concatenating strings in go

var s strings.Builder
s.WriteString("Hello")
s.WriteString(" ")
s.WriteString("World")
fmt.Println(s.String())

Stringer Interface

type Stringer interface {
String() string
}

Fields

根據「空白」,將字串拆成 slices:

// func Fields(s string) []string

func main() {
fields := strings.Fields("I am learning Go")
fmt.Println(fields) // [I am learning Go]
}

Join

// a 是 slice string
// sep 指的是 separator,陣列連接時要用什麼字串連接
func Join(a []string, sep string) string

Example

// 將 fruits 轉換成 string
package main

import (
"fmt"
"strings"
)

type fruits []string

func main() {
favoriteFruits := fruits{"Apple", "Banana", "Orange", "Guava"}

fmt.Println(favoriteFruits.toString())
}

func (f fruits) toString() string {
return strings.Join(f, ",")
}

Split

// 將字串轉成 slice string
// s 是字串
// sep 是 separator
func Split(s, sep string) []string

HasPrefix, HasSuffix

在 strings package 中內建 HasPrefixHasSuffix 的方法可以用來判斷某一字串是否以特定字串開頭或結尾:

str := "Hello Go"

fmt.Println(strings.HasPrefix(str, "Hello")) // true
fmt.Println(strings.HasSuffix(str, "Golang")) // false

TrimLeft 和 TrimPrefix 的差別

TrimLeft(s, cutset string) 會從 s 的左邊開始,依序判斷每一個字元是否被包含在 cutset 中,cutset 中可能不只包含一個字元,只要有在 cutset 中則會被 Trim 掉;TrimPrefix(s, prefix string) 一樣會從 s 的左邊開始,但是會把 prefix 當成一個完整的字串,而不是當成包含許多獨立字元的 cutset,舉例來說:

func main() {
auth := "123111123/1234"

fmt.Println(strings.TrimLeft(auth, "123")) // /1234
fmt.Println(strings.TrimPrefix(auth, "123")) // 111123/1234

auth = "123123/1234"

fmt.Println(strings.TrimLeft(auth, "123")) // /1234
fmt.Println(strings.TrimPrefix(auth, "123")) // 123/1234
}

字串插補(String Interpolation, injection syntax)

type person struct {
firstName string
lastName string
}

func main() {
var i int
var f float64
var b bool
var s string
var aaron person
fmt.Printf("%v %v %v %q\n", i, f, b, s) // 0 0 false ""
fmt.Printf("%+v\n", aaron) // {firstName: lastName:}
}

其他方法

func main() {
greeting := "Go run main.go"
fmt.Println(strings.Contains(greeting, "go")) // true
fmt.Println(strings.ReplaceAll(greeting, "Go", "Golang")) // Golang run main.go
fmt.Println(strings.ToUpper(greeting)) // GO RUN MAIN.GO
fmt.Println(strings.Index(greeting, "Go")) // 0
fmt.Println(strings.Split(greeting, " ")) // [Go run main.go]
}

參考