[pkg] strings
strings @ golang
字串建立
多行字串
使用反引號可以建立多行的字串,包含縮排也會一併被保留:
str := `
Hello
World
of
Go
`
字串連結(string concatenation)
使用 bytes.Buffer
或 strings.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 中內建 HasPrefix
和 HasSuffix
的方法可以用來判斷某一字串是否以特定字串開頭或結尾:
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]
}
參考
- 6 Tips for Using Strings in Go @ calhoun
- Go: The Complete Developer's Guide (Golang) @ Udemy by Stephen Grider