Skip to main content

[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
}

將其他型別轉成字串#

使用 strconv.Itoa 來轉型會比使用 fmt.Sprintf() 在效能上來得好(參考)。

i := 123
t := strconv.Itoa(i)
fmt.Println(t)

字串插補(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:}
}

參考#

Last updated on