關(guān)于go語言變量類型的一些疑惑

筆者對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é)果如下圖:


result.png

結(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é)果吧,


result.png

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é)果:


result.png

事實是有結(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é)果:


result.png

報錯了,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é)果:


result.png

這個運行結(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ù)的。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容