筆者對golang的認(rèn)識是它是一中強類型語言,也就是變量的類型一旦定義就不能再修改了,還有就是兩個不同類型的數(shù)值之間做運算需要先轉(zhuǎn)成相同的數(shù)據(jù)類型才行,事實也確實如此,但是這套理論在遇到某些場景時會讓人產(chǎn)生一些疑惑。下面筆者來舉幾個例子:
先看下正常情況下的:
package main
import "fmt"
func main() {
var a int64
var b int
a = 12
b = 6
c := a/b
fmt.Println("c:",c)
}
按照理論這肯定會報類型不匹配的錯誤,下面先來運行下代碼,結(jié)果如下圖:

結(jié)果不出所料,報錯。
下面筆者再來改下上面的代碼
package main
import "fmt"
func main() {
var a int64
a = 12
c := a/6
fmt.Println("c:",c)
fmt.Println("%T:",c)
}
大家猜測下,哈哈,應(yīng)該是可以的,甚至除以一個浮點數(shù)都是可以的,先來運行看下結(jié)果吧,

c 的最終類型和a 是一致的,而且不管a的類型變成什么,c的類型都和a保持一致。
下面再來看個稍微復(fù)雜一點的例子:
package main
import (
"fmt"
)
func main() {
ch := 'b'
d := ch/2.0
fmt.Printf("%T:", ch)
fmt.Println("d:",d)
fmt.Println("%T:",d)
}
猜測下結(jié)果是啥,或者說是沒有結(jié)果,先來看下運行結(jié)果:

事實是有結(jié)果的,那個b 在底層是int32類型,所以這個例子和上面那個例子本質(zhì)是一樣的。下面如果我將第二個例子的a 定義為interface{}類型呢?
package main
import "fmt"
func main() {
var a interface{}
a = 12
c := a / 6
fmt.Println("c:", c)
fmt.Printf("%T:\n", c)
}
小伙伴們可以先猜測下結(jié)果,下面看下運行結(jié)果:

報錯了,interface{}和int 不匹配,但是實際上a反射得到的值類型是也是int,所以直接使用interface{}類型去除一個數(shù)是不行的,必須先轉(zhuǎn)一下,也就是使用a.(int) / 6 才行。下面再來看個例子:
package main
func main() {
var (
a int = 0
b int64 = 0
c interface{} = int(0)
d interface{} = int64(0)
)
println(c == 0)
println(c == a)
println(c == b)
println(d == b)
println(d == 0)
println(b == 0)
}
小伙伴們可以先猜測下運行結(jié)果,下面展示下筆者這邊的運行結(jié)果:

這個運行結(jié)果和你想的是一致的么? 如果是一致的,那后面筆者的一些解釋就可以不用看了,哈哈。筆者剛開始對這個運行結(jié)果里面的某些結(jié)果表示不太理解,不理解的點是,b==0 結(jié)果是true,而d == b 是true , 那么為啥d==0 為false 呢? b 是int64類型的,b==0 的時候這個0被當(dāng)作了int64類型,那為啥d==0 的時候這個0沒有被當(dāng)作int64類型呢?筆者這里有個猜想就是因為d是interface{}類型,在d==0 的比較中0只是被當(dāng)作了int型而不是int64 所以導(dǎo)致結(jié)果為false, b就不一樣了b是具體的類型,這里筆者暫時也沒有比較正確的一些解釋。
好了,今天的文章就寫到這里,有啥不明白的或者關(guān)于上面的例子有比較好的解析的小伙伴歡迎在下面的評論區(qū)給我留言,看到會及時回復(fù)的。