字符串類型為 string
,使用雙引號或者反引號包起來
字符串形式
反引號
當使用反引號時不會對字符串進行轉義,並可以包含多行文本
示例:
package main
import "fmt"
func main() {
a := `
hello
world
!
`
b := `hello \n world`
fmt.Println(a)
fmt.Println(b)
}
輸出結果:
hello
world
!
hello \n world
雙引號
當使用雙引號時,只能通過 \n
進行換行
示例:
package main
import "fmt"
func main() {
a := "hello \n world"
fmt.Println(a)
}
輸出結果:
hello
world
切片
一個字節
如果直接使用索引進行取值,會取到一個字節
示例:
package main
import (
"fmt"
)
func main() {
a := "abc"
for i := 0; i < len(a); i++ {
fmt.Printf("%v, %T\n", a[i], a[i])
}
}
輸出結果:
97, uint8
98, uint8
99, uint8
多個字節
如果通過切片取出來的還是字符串,即使只取了一個字節也是一個字節的字符串
示例:
package main
import (
"fmt"
)
func main() {
a := "abc"
for i := 0; i < len(a); i++ {
fmt.Printf("%v, %T\n", a[i: i+1], a[i: i+1])
}
}
輸出結果:
a, string
b, string
c, string
不可修改
Go 中字符串類型是不能修改的,多個字符串低層都可以共用一段內存,這使得復制字符串、生成子串的成本都非常低
修改
有兩種方式可以改變字符串值:
1. 重新賦值
新開辟一段內存存放新的字符串
func main() {
a := "hello world"
fmt.Println(a)
a := "Hello world"
fmt.Println(a)
}
2. 先轉換為切片,修改之后再改回來
注意:如果要修改像中文字符之類超過 3 個字節的字符,需要轉換為 rune
而不是 byte
關於 rune 和 byte <- 點擊查看
示例:
func main() {
a := "hello world"
b := []rune(a)
b[0] = 'H'
a = string(b)
fmt.Printf("%v", a)
}
遍歷
由於 len(string)
獲得的是字符串的字節數,所以直接通過長度遍歷遍歷的是字節數,超過 1 字節的字符無法正常遍歷
示例:
func main() {
a := "你好 world"
for i := 0; i < len(a); i ++ {
fmt.Printf("%c - %T\n",a[i], a[i])
}
}
遍歷的是每個字節
for range
通過 for range
遍歷可以正常地顯示每個字符
示例:
func typeString() {
for _, v := range a {
a := "你好 world"
fmt.Printf("%c - %T\n",v, v)
}
}
遍歷的是每個字符