golang没有类似于C/C++、java中的隐式类型转换。据说是因为作者认为这种功能带来的隐患比便利要多(博主表示赞同)。
golang中的类型转换分为强制类型转换、类型断言、以及“向上造型”
向上造型这个词是取的Java中的定义,没有复杂的含义,表示将子类转为父类。在golang中达到同样的目的只需要.父结构体
即可
package main
import "fmt"
// 一、隐式类型转换和强转
func test1() {
var a float32 = 5.6
var b int = 10
//fmt.Println (a * b) // -- 隐式类型转换,go不支持,编译报错。
fmt.Println(a * float32(b)) // -- 强转,支持。
}
type IBase interface {
hello()
}
type IParent interface {
hi()
}
type Son1 struct {
}
func (son1 *Son1) hi() {
fmt.Println("son1: hi")
}
func (son1 *Son1) hello() {
fmt.Println("son1: hello")
}
type Son2 struct {
}
func (son2 Son2) hi() {
fmt.Println("son2: hi")
}
type grandson struct {
Son1
}
func (grandson *grandson) hi() {
fmt.Println("grandson: hi")
}
// 二、类型断言。注意由指针和非指针实现的方法,断言时的写法不同
// TODO .(T) 用来类型断言,返回参数1为断言之后的类型值,如果失败则是nil,参数2为是否断言成功
// 如果类型本身就是断言的类型,则断言成功,会转换成这个类型并返回
// 可以断言的情况:
// 1.由接口断言到结构体
// 2.由父接口断言到子接口
func test2() {
// 1.由接口断言到结构体
var p1 IParent = &Son1{} // 指针实现的方法hi
p1.(*Son1).hi()
var p2 IParent = Son2{} // 非指针实现的方法hi
p2.(Son2).hi()
// 2.由父接口断言到子接口
var iBase IBase = &Son1{}
iBase.(IParent).hi()
}
// 三、“向上造型”(java中这么叫,即转为父类)
func test3() {
grandson := grandson{}
grandson.hi()
// 因为golang中继承的语义是将父结构嵌入(即匿名字段)到子结构,所以只需要调用嵌入的父结构体即可
grandson.Son1.hi()
}
func main() {
//t1()
test2()
test3()
}