有符号和无符号整数:8位,16位,32位,64位:int8、int16、int32、int64、uint8、uint16、uint32、uint64
浮点数:float32和float64
字符串:内置的len函数返回字符串的字节数,试图访问许可范围以外的字节会触发宕机异常。
s := "left foot"
t := s
s +=", right foor"
s[0] = 'L' //编译错误,s[0]无法赋值
字符串s不可变意味着两个字符串能安全地共用同一段底层内存,使得复制任何长度字符串的开销都低廉。类似地,字符串s及其字串可以安全地共用数据,因此字串生成操作都开销都低廉。这两种情况下都没有分配内存。图3-4展示了一个字符串及其两个子字符串的内存布局,他们共用底层字节数组。
Go 语言的字符串是不可变的。
修改字符串时,可以将字符串转换为 []byte 进行修改。
[]byte 和 string 可以通过强制类型转换互转。
package main
import "fmt"
func main() {
angel := "Heros never die"
angleBytes := []byte(angel)
angleBytes[0] = 'L'
fmt.Println(string(angleBytes))
}
字符串常量:"hello,世界"
字符串操作的4个重要标准包:
strings包提供了许多函数,用于搜索,替换、比较、修正、切分与连接字符串。
bytes包也有类似的函数,用于操作字节slice。由于字符串不可变,因此按增量的方式构建字符串会导致多次内存分配和复制。这种情况下,使用bytes.Buffer类型会更高效。
strconv包具备的函数,主要用于转换布尔值、整数、浮点数等。
unicode包辨别文字符号特性的函数。如IsDigit等。
s := "abc"
b := []byte(s)
s2 := string(b)
概念上,[]byte(s)转换操作会分配新的字节数组,拷贝填入s含有的字节,并生成一个slice引用,指向整个数组。具备优化功能的编译器在某些情况下可能会避免内存和复制内容,但一般而言,复制有必要确保s的字节维持不变。
可用bytes包和strings包。
package main
import (
"bytes"
"fmt"
)
func intsToString(values []int) string{
var buf bytes.Buffer
buf.WriteByte('[')
for i,v := range values{
if i>0{
buf.WriteString(", ")
}
fmt.Fprintf(&buf,"%d",v)
}
buf.WriteByte(']')
return buf.String()
}
func main(){
fmt.Println(intsToString([]int{1,2,3}))
}
strconv包的函数可以相互转换数值及其字符串表示形式。
常量生成器:iota
常量声明可以使用iota,声明中,iota从0开始取值,逐渐加1
type Weekday int
const(
Sunday Weekday = iota
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
)
Sun的值为0,Monday的值为1,以此类推。