golang--從類型轉換角度看interface


剛開始接觸golang,可能對interface的使用有些迷惑,尤其在有些資料里,介紹得更是雲里霧里,讓人搞不清楚。本文嘗試從類型轉換的角度來解析interface,希望對大家能有所幫助。不多說,先上代碼。

package main

import (
    "fmt"
)

func main() {
    var general interface{}
    general = 6.6
    type_cast(general)
    general = 2
    type_cast(general)
}

func type_cast(general interface{}) {
    switch general.(type) {
    case int :
        fmt.Println("the general type is int")
        newInt, ok := general.(int)
        check_convert(ok)
        fmt.Println("newInt 的值本來是", newInt)
        newInt += 2
        fmt.Println("加2后,結果是", newInt)
        newInt -= 6
        fmt.Println("接着減6后,結果是", newInt)
        newInt *= 4
        fmt.Println("然后乘4,結果是", newInt)
        newInt /= 3
        fmt.Println("最后除3,結果是", newInt)
        fmt.Println()
        fmt.Println()


    case float32:
        fmt.Println("the general type is float32")
        newFloat32, ok := general.(float32)
        check_convert(ok)
        fmt.Println("newFloat32 的值本來是", newFloat32)
        newFloat32 += 2.0
        fmt.Println("加2.0后,結果是", newFloat32)
        newFloat32 -= 6.0
        fmt.Println("接着減6.0后,結果是", newFloat32)
        newFloat32 *= 4.0
        fmt.Println("然后乘4.0,結果是", newFloat32)
        newFloat32 /= 3.0
        fmt.Println("最后除3.0,結果是", newFloat32)
        fmt.Println()
        fmt.Println()

    case float64:
        fmt.Println("the general type is float64")
        newFloat64, ok := general.(float64)
        check_convert(ok)
        fmt.Println("newFloat64 的值本來是", newFloat64)
        newFloat64 += 2.0
        fmt.Println("加2.0后,結果是", newFloat64)
        newFloat64 -= 6.0
        fmt.Println("接着減6.0后,結果是", newFloat64)
        newFloat64 *= 4.0
        fmt.Println("然后乘4.0,結果是", newFloat64)
        newFloat64 /= 3.0
        fmt.Println("最后除3.0,結果是", newFloat64)
        fmt.Println()
        fmt.Println()

    default:
        fmt.Println("unknown type")
    }
}

func check_convert(ok bool) {
    if false == ok {
        panic("type cast failed!")
    }
}

程序運行結果為:

從上面結果可以知道,浮點數類型默認為float64。還有一點要注意的是,newInt, ok := general.(int),其中ok是bool值;而在golang中,類似這種返回多個值的其他語句,ok的值經常會與nil相比較。

interface{}是一個通用類型,可以儲存任意類型的值。在代碼前面,聲明了一個名為general的interface{}值,然后依次存儲一個浮點數和一個整數,通過switch general.(type)判斷general存儲的值的類型,然后按照類型使用類似general.(int)的方法對general進行類型轉換(實際上是接口查詢或者接口轉換,作用是判斷general是否實現了int的方法;之所以叫類型轉換,是因為interface{}里面沒有定義任何方法,而且它的作用也的確跟類型轉換一樣)。在這里用數字做例子,是因為數字簡單,容易理解。我們知道,數字可以進行四則運算,在這里,我對general轉換得到的數字進行加法運算,加2,然后打印加法的結果。從運行結果來看,經過轉換后的數字可以進行正確的數字運算。各位可以自己算算。


從上面程序可以看出使用interface的過程,把其他類型的值賦值給interface,然后進行接口查詢,ok就進行符合這個類型的操作。也就是說只要這個類型的操作函數跟interface里面定義的函數聲明相同,就可以使用這個interface。duck type定義就是:If it walks like a duck and quacks like a duck, it's a duck。中文意思大概是,如果它走得像一個鴨子,而且也像鴨子嘎嘎叫,那么它就是鴨子。大家可以參考其他使用interface的例子來參考,在這里就不多做解釋,水平有限。

轉貼請注明來自:格通


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM