Go是一种强类型的静态编译语言
Go语言内置了七类基本数据类型
• 布尔类型:bool
var ok bool = true
var ok bool = 1 //error 1是整型字面量
• 整型:byte int int8 int16 int32 int64 uint uint8 uint16 uint32 uint64 uintptr
var a int = 1
var b int32 = 2
b = a //error 不同类型的整型必须进行强制类型转换
• 浮点型:float32 float64
var b := 10.00 //浮点数字面量被自动推断为float64类型
• 复数:complex64 complex128
complex64是由两个float32构成的,complex128是由两个float64构成的
var value1 complex64 = 3.1 + 5i
value2 := 3.1 + 6.i
var v = complex(2.1, 3) //构造一个复数
a := real(v) //返回实数部分
b := image(v) //返回复数虚部
• 字符串:string
• 字符串是常量,可以通过索引访问字节单元,但是不能修改
var a = "hello world"
b := a[0]
a[1] = 'b' //error
• 字符串转换成[]bytes要慎用,当字符串太大的时候,要复制一份内存
a := "hello, world"
b := []byte(a)
• 字符串尾部不包含NULL字符,跟C和C++不一样
• 字符串类型底层实现是一个二元的数据结构,一个指针指向字节数组的起点,另一个是长度
// runtime/string.go
type stringStruct struct {
str unsafe.Pointer
len int
}
• 基于字符串创建的切片和原字符串指向的相同的底层字符数组(视图),一样不能修改,对于字符串切片操作返回的子串仍然是string,而非slice
a := "hello world"
b := a[0:4]
c := a[1:]
• 字符串可以转换成字节数组,也可以转换成Unicode的字节数组
a := "hello world"
b := []byte(a)
c := []rune(a) //转成Unicode的字节数组
• 字符串的运算
a := "hello"
b := "world"
c := a + b
len(a)
• rune类型
Go内置两种字符类型,一种byte的字节类型(byte是uint的别名),另一种是标识Unicode编码的字符rune,rune在Go内部是int32类型的别名,占用4个字节,Go语言默认是Utf-8类型
参考<<Go语言核心编程>>