go語言中的強制類型轉換有三種語法形式:1、類型斷言,語法“value, ok := x.(需要轉換的類型)”;2、使用“type (a)”形式進行的類型轉換,語法“類型B的值 = 類型B(類型A的值)”;3、指針類型轉換,語法“(*指針類型)(unsafe.Pointer(值))”。
本教程操作環境:windows7系統、GO 1.18版本、Dell G3電腦。
golang是強類型語言,有強制類型轉換,但是不同于Java語言所使用的強制類型轉換。
golang強制類型轉換
golang語言中分為類型轉換(type conversion)、類型斷言(type assertion)和指針類型轉換。
1、類型斷言
類型斷言(Type Assertion)是一個使用在接口值上的操作,用于檢查接口類型變量所持有的值是否實現了期望的接口或者具體的類型。
語法格式如下:
value, ok := x.(T)
登錄后復制
其中,x 表示一個接口的類型,T 表示一個具體的類型(也可為接口類型)。
示例:
package main import "fmt" func main() { var a interface{} =10 t,ok:= a.(int) if ok{ fmt.Println("int",t) } t2,ok:= a.(float32) if ok{ fmt.Println("float32",t2) } }
登錄后復制
打印結果是:int 10 因為 golang 自動推斷 a 是 int 類型。 (這個更像是Java的強制類型轉換,認為變量 a 是 int 類型,就強轉為 int 類型來使用)
登錄后復制
package main import "fmt" func main() { var a float32 = 5.6 var b int = 10 fmt.Println (a * float32(b)) }
登錄后復制
代碼段中的 float32(b) 就是第二種強制類型轉換, 普通變量類型int,float,string 都可以使用 type (a)這種形式來進行強制類型轉換,比如
var a int32 = 10 var b int64 = int64(a) var c float32 = 12.3 var d float64 =float64(c)
登錄后復制
這種類型轉換形式更像是Java的通過構造類的構造方法創建一個新類型對象。在Java語法中不屬于強制類型轉換。
package main func main() { var a int = 10 var p *int =&a var c *int64 c= (*int64)(p) }
登錄后復制
這樣的代碼是錯誤的,編譯器會提示cannot convert p (type *int) to type *int64
指針的強制類型轉換需要用到unsafe包中的函數實現
package main import "unsafe" import "fmt" func main() { var a int =10 var b *int =&a var c *int64 = (*int64)(unsafe.Pointer(b)) fmt.Println(*c) }
登錄后復制
總結
golang中的強制類型轉換有三種語法形式,分別是 類型斷言,類型轉換,指針類型轉換,語法上類型斷言和指針類型轉換和Java比較像。
golang和Java的強制類型轉換可以對比著理解,但是不同語言設計思想不同,不能硬類比。
【