1、如果一个结构体实现了interface中的所有方法,那么他们之间可以相互赋值,也可以相互强转
type Hobby interface {
Sing()
}
type Chinese struct {
Name string
}
func (c *Chinese) Sing() {
("%s am singing <<北京欢迎你!>> \n", )
}
type American struct {
Name string
Age int
}
func (a American) Sing() {
("%s am singing <<are you ok !!!>> \n", )
}
func TestQz(t *) {
var aa interface{}
var c1 *Chinese
c1 = &Chinese{Name: "小明"}
//aa = b
// c1实现了Hobby中的所有方法,所有可以作为形参传给给Hobby
Avv(c1) // 小明 am singing <<北京欢迎你!>>
// aa不能强转为Chinese类型,因为没有赋值
v, ok := aa.(Chinese)
if ok {
("成功转换001:", v)
} else {
("失败001") // 失败001
}
a := &American{Name: "Jeke"}
aa = a
// a实现了Hobby中的所有方法,所有可以作为形参传给给Hobby
Avv(a) //Jeke am singing <<are you ok !!!>>
// aa可以成功强转American结构体类型
v1, ok := aa.(*American)
if ok {
("成功转换0022:", v1) // 成功转换0022: &{Jeke 0}
} else {
("失败0022")
}
// aa不可以强转为struct{}类型
v2, ok := aa.(*struct {
Name string
Age int
})
if ok {
("成功转换00333:", v2)
} else {
("失败00333") // 失败00333
}
// a可以赋值Hobby, Hobby可以强转a类型,
// 注意:a为指针类型,Hobby只能强转a的指针类型,值类型不行
var hobby Hobby
hobby = a
v3, ok := hobby.(*American)
if ok {
("成功转换004444:", v3) //成功转换004444: &{Jeke 0}
} else {
("失败004444")
}
}
func Avv(a Hobby) {
()
}
2、a赋值给interface类型的b,b只能强转成a的type类型,不能转化为其他类型以及Kind类型
(type类型:系统原生数据类型:如 int、string、bool、float32 等类型,以及使用 type 关键字定义的类型)
(Kind类型:种类(Kind)指的是对象归属的品种,在 reflect 包中有如下定义:/mp_blog/creation/editor/119148976)
package main
import (
"fmt"
"reflect"
"testing"
)
type Age int
// 强制类型转换
func TestQb(t *) {
var a interface{}
var b Age
b = 32
a = b
tt := (b)
("类型 Type:", ()) // 类型 Type: Age
("种类 Kind:", ()) // 种类 Kind: int
// a可以转换成b的type类型(系统原生数据类型)
v, ok := a.(Age)
if ok {
("转换成功001:", v) // 转换成功001: 32
} else {
("失败001")
}
// 但a不能转换成b的种类Kind类型
v1, ok := a.(int)
if ok {
("转换成功0022", v1)
} else {
("失败0022") // 失败0022
}
// 但a更不能转换成其他类型
v2, ok := a.(int64)
if ok {
("转换成功00333:", v2)
} else {
("失败00333") // 失败00333
}
v3, ok := a.(string)
if ok {
("转换成功004444:", v3)
} else {
("失败004444") // 失败004444
}
}