跳到主要内容

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 语言中,整数类型具有固定的大小,例如 int8int16int32int64。如果计算结果超出了类型的最大或最小值,就会发生溢出。因此,在编写代码时,我需要注意选择合适的数据类型,以避免溢出。

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