golang中的编译器不会做隐式的类型转换,int和int32是俩种不同的类型。
var value2 int32
value1 := 64 // value1将会被自动推导为 int类型
value2 = value1 // 编译错误
value2 = int32(value1) // 强制类型转换编译通过
在做强制类型转换时,需要注意数据长度被截短而发生的数据精度损失(比如将浮点数强制转为整数)和值溢出(值超过转换的目标类型的值范围时)问题。
golang支持常规的整数运算: + - * / % 即加减乘除取模运算。
golang支持常规的比较运算符: > < == >= <= !=
需要注意的是两种不同的整数类型变量不能直接比较,比如int8类型变量和int类型变量不能直接比较,但是整型常量编译器会自动推断类型,所以整型常量可以与任何整型变量比较。
var x int8
var y int16
x = 1
y = 1
if x == y { // 编译错误
fmt.Println("x == y")
}
if x == 1 && y == 1 { // 编译通过
fmt.Println("x == y")
}
golang中的布尔类型,关键字为bool,预定义的值为true和false
bool类型不支持自动和强制的类型转换,只能通过预定义的值进行赋值,还有通过比较表达式推导。
var v1 bool
v1 = true
v2 := (1 == 2) // v2也会被推导为 bool类型,值为false
v1 = 1 // 编译错误不支持隐式类型转换
v1 = bool(1) // 编译错误不支持强制类型转换
v1 = (1 == 2) // 编译成功,值为false
golang中的浮点类型采用IEEE-754标准的表达方式。
golang中的浮点类型共有俩个float32和float64,同c语言中的float和double。
var f1 float32
f1 = 1
f2 := 1.0 // 如果想让f2被推导成浮点型,必须加.0, 否则被推导为整型而不是浮点型
f1 = f2 // 编译错误,浮点型会被自动推导成float64
f1 = float32(f2) // 编译成功
浮点数的比较需要注意的是精度问题,像整型直接用==判断俩浮点数是否相等是不可行的,
会产生不稳定的结果,所以实现一个浮点数的比较函数用来判等是可行的。
import "math"
func IsEqual(f1, f2, p float64) bool {
// p为用户自定义的比较精度,小于比较精度就可认为相等
return math.Fdim(f1, f2) < p
}
复数是由俩个实数(浮点数表示)构成的,一个实部(real),一个虚部(image)。可以通过函数real(v)获取复数的实部,函数image(v)获取复数的虚部。
var v1 complex64 // 由2个float32构成的复数类型
v1 = 1.2 + 12i
v2 := 1.2 + 12i // v2 是complex128类型
v3 := complex(1.2, 12) // v3 等于 v2
x := real(v1) // x值为1.2
y := real(v1) // y值为12
golang中支持两种字符类型,一种是byte(实际上是uint8的别名),代表UTF-8字符串的单个字节的值;另一种是rune,代表单个Unicode字符。unicode/utf8 包也提供了UTF8和Unicode之间的转换。
golang中字符串也是一种基本类型,相比c/c++而且golang中的字符串使用起来非常方便。
初始化:
var str1 string // 声明一个字符串变量
str1 = "Hello world" // 字符串赋值
ch := str1[0] // 取字符串的第一个字符
str2 := "Hello world" // 直接初始化,推导为string类型
str2[0] = 'a' // 编译错误,不支持初始化后修改内容
str1 = str1 + str2 // str1的值变为了Hello worldHello world
字符串的内容获取与数组类似,都支持下标方式获取。不同的数组可以修改内容,字符串初始化后不能修改内容。字符串支持连接操作,用+运算符实现。
字符串有俩种遍历方式,一种是按byte字符遍历,一种是按rune字符遍历。
//按byte字符遍历
str := "Hello, 世界"
for i := 0; i < len(str); i++ {
// 利用下标取字符串中的字符,类型为 byte
ch := str[i]
fmt.Println(i, ch)
}
//按rune字符遍历
str := "Hello, 世界"
for i, ch := range str {
// ch的类型为 rune,i为rune的索引下标
fmt.Println(i, ch)
}