Go 类型转换和运算符
在 Go 语言中,没有隐式的类型转换。这意味着如果两个类型之间的运算看起来不合理,那么大概率是不可行的。
var intValue int = 42
var floatValue float64 = float64(intValue)
类型匹配
在进行算术运算时,我需要确保操作数的类型匹配。我不能直接将一个 int 类型的值和一个 float64 类型的值相加,除非显式地进行类型转换。
var intValue int = 10
var floatValue float64 = 20.5
var sum float64 = float64(intValue) + floatValue // 正确的做法
整数除法
当我在 Go 中使用整数进行除法运算时,结果也是整数,并且会向下取整。如果我想得到浮点数结果,需要确保至少有一个操作数是浮点类型。
var numerator, denominator int = 10, 3
var result int = numerator / denominator // 结果是 3
var floatResult float64 = float64(numerator) / float64(denominator) // 结果是 3.3333333333333335
溢出
在 Go 语言中,整数类型具有固定的大小,例如 int8、int16、int32 和 int64。如果计算结果超出了类型的最大或最小值,就会发生溢出。因此,在编写代码时,我需要注意选择合适的数据类型,以避免溢出。
var maxInt8 int8 = 127
maxInt8 += 1 // 溢出,结果为 -128
运算符优先级
乘法和除法的优先级高于加法和减法。在编写复杂的算术表达式时,我需要确保正确理解和应用运算符的优先级,或者使用括号来明确运算顺序。
result := 10 + 2 * 5 // 结果是 20,因为乘法优先于加法
result = (10 + 2) * 5 // 结果是 60
取模运算
在 Go 中,取模运算符 % 只能用于整数。我不能对浮点数使用取模运算符。如果需要对浮点数取模,需要使用 math.Mod 函数。
var a int = 10
var b int = 3
var mod int = a % b // 结果是 1
import "math"
var x float64 = 10.5
var y float64 = 3.2
var modFloat float64 = math.Mod(x, y) // 结果是 0.9
Go 的类型推断
在 Go 中,如果我没有显式指定变量的类型,编译器会根据赋值的值来推断变量的类型。但是,如果我在声明变量时已经指定了类型,例如 var a int = 1
,那么类型已经确定,不会进行类型推断。
// 编译器根据赋值自动推断变量类型
var a = 1
// 使用简短声明方式,类型由编译器推断
b := 2
fmt.Println(a, b)
位逻辑清零赋值
在 Go 语言中,位逻辑清零赋值是通过 &^=
运算符来完成的。该运算符会将左操作数中对应右操作数为 1 的位清零,如果右操作数的位为 0,则左操作数的位保持不变。
var valueA int = 60 // 二进制为 111100
var valueB int = 13 // 二进制为 001101
valueA &^= valueB // 执行位逻辑清零赋值操作
fmt.Printf("结果是 %d\n", valueA) // 输出结果是 48,二进制为 110000