Golang的型別轉換-三種轉型(強轉、斷言、“向上造型“)
阿新 • • 發佈:2021-02-06
golang沒有類似於java中的隱式型別轉換
golang中的型別轉換分為強制型別轉換、型別斷言、以及“向上造型”
向上造型這個詞是取的Java中的定義,沒有複雜的含義,表示將子類轉為父類。在golang中達到同樣的目的只需要.父結構體
即可
package main
import "fmt"
// 隱式型別轉換和強轉
func t1(){
var a float32 = 5.6
var b int = 10
//fmt.Println (a * b) // -- 隱式型別轉換,編譯報錯,不支援
fmt.Println(a * float32 (b)) // -- 強轉
}
type Base interface {
hello()
}
type P interface {
hi()
}
type S1 struct {
}
func (s1 *S1) hi() {
fmt.Println("s1-hi")
}
func (s1 *S1) hello() {
fmt.Println("s1-hello")
}
type S2 struct {
}
func (s2 S2) hi() {
fmt.Println("s2-hi")
}
type Son struct {
S1
}
func (son *Son) hi() {
fmt.Println("son-hi")
}
// 型別斷言。注意由指標和非指標實現的方法,斷言時的寫法不同
// TODO .(T) 用來型別斷言,返回引數1為斷言之後的型別值,如果失敗則是nil,引數2為是否斷言成功
// 如果型別本身就是斷言的型別,則斷言成功,會轉換成這個型別並返回
// 可以斷言的情況:
// 1.由介面斷言到結構體
// 2.由父介面斷言到子介面
func t2() {
// 1.由介面斷言到結構體
var p1 P = &S1{} // 指標實現的方法hi
p1.(*S1).hi()
var p2 P = S2{} // 非指標實現的方法hi
p2.(S2).hi()
// 2.由父介面斷言到子介面
var base Base = &S1{}
base.(P).hi()
}
// “向上造型”(java中這麼叫,即轉為父類)
func t3() {
son := Son{}
son.hi()
// 因為golang中繼承的語義是將父結構嵌入(即匿名欄位)到子結構,所以只需要呼叫嵌入的父結構體即可
son.S1.hi()
}
func main() {
//t1()
t2()
t3()
}