Golang 的数据类型通常可以区分为:
- 基本类型:Boolean,Numeric,String 类型。
-
派生类型:Array,Struct,Slice,Map,Pointer,Function,Channel,Interface 类型。可以使用 type 语句构造。可以细分为:
- Aggregate:Array,Struct。
- Reference:Slice,Map,Pointer,Function,Channel。
- Interface。
注:其中 Array,Struct 是定长的,而 Slice,Map 是变长的。
基本数据类型布尔型(Boolean)
- True
- False
数字类型(Numeric)
整型
- int8:有符号 8 位整型,[-128, 127]
- uint8:无符号 8 位整型,[0, 255]
- int16:有符号 16 位整型,[-32768, 32767]
- uint16:无符号 16 位整型,[0, 65535]
- int32:有符号 32 位整型,[-2147483648, 2147483647]
- uint32:无符号 32 位整型,[0, 4294967295]
- int64:有符号 64 位整型,[-9223372036854775808, 9223372036854775807]
- uint64:无符号 64 位整型,[0, 18446744073709551615]
浮点型
- float32:32 位浮点型数
- float64:64 位浮点型数
- complex64:32 位实数和虚数
- complex128:64 位实数和虚数
其他
- byte:uint8 的别名
- rune:int32 的别名
- uint:32 或 64 位,取决于操作系统
- int:32 或 64 位,取决于操作系统
- uintptr:无符号整型指针
字符串类型(String)
字符串的本质是一串固定长度的字符连接起来的字符序列。区别于 C 语言中的字符串是由若干个字符组成的,而 Golang 的字符串是由若干个字节连接起来的。
Golang 的字符串的字节使用 UTF-8 编码标识 Unicode 文本。字符串数据类型的定义很简单,使用双引号 “ " ” 或者反引号 “ ` ”来创建。区别在于:双引号之间的转义符会被转义,而反引号之间的字符保持不变。
另外,Golang 与 C 语言一样,单引号 “ ’ ” 用于标识一个字符。可以使用 string(char)
将一个字符转换成一个包含了单个字符的字符串。
var c = 'c'
示例:
package main
import "fmt"
func main() {
var a string = "hello \n world"
var b string = `hello \n world`
fmt.Println(a)
fmt.Println(b)
}
结果:
hello
world
hello \n world
更改字符串数值
注意,因为 Golang 中的字符串本质是由若干个(已编码)的字节组成的。所以,数据类型可以看作是一个常量类型,一旦赋值了就不能再修改。
var s = "hello world"
s[0] = 'c' // 报错
如果实在需要修改字符串,则应该这么做:
func main() {
var s1 string = "hello"
c := []rune(s1) // 将 s1 转换为 rune 数组。
c[0] = 'c' // 修改数组的第一个元数。
var s2 string = string(c) // 创建新的字符串 s2,强制类型转换 c 数值。
fmt.Println("%s \n", s2)
}
rune() 函数是 int32 的别名,用 UTF-8 进行编码。当我们需要遍历字符串的字符时,可以用于混换每个字节。
简而言之,为了获得字符串每个实际的字符,需要使用 rune 类型:
var s = "你好"
fmt.Println(len(s))
c := []rune(s)
fmt.Println(len(c),c)
结果:
6
2 [20320 22909]
多行字符串
当需要书写多行字符串时候需要注意,因为 Golang 会在每行的行末自动添加分号,所以字符串连接符 “+” 一定要放在换行的行末:
// 正确
s := "Starting part" +
"Ending part"
// 错误
s := "Starting part"
+ "Ending part"
也可以考虑使用反引号,但此时 s 中也包含了换行符,因为反引号中间的字符会保持不变。所以通常用在多行打印的情况:
package main
import "fmt"
func main() {
s := `Starting part
Ending part`
fmt.Println(s)
}
输出:
Starting part
Ending part