> \n", c.Name)}type American struct { Name string Age int}func (a American) Sing() { fmt.Printf("%._go语言 结构强转成interface">
赞
踩
- type Hobby interface {
- Sing()
- }
-
- type Chinese struct {
- Name string
- }
-
- func (c *Chinese) Sing() {
- fmt.Printf("%s am singing <<北京欢迎你!>> \n", c.Name)
- }
-
- type American struct {
- Name string
- Age int
- }
-
- func (a American) Sing() {
- fmt.Printf("%s am singing <<are you ok !!!>> \n", a.Name)
- }
-
- func TestQz(t *testing.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 {
- fmt.Println("成功转换001:", v)
- } else {
- fmt.Println("失败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 {
- fmt.Println("成功转换0022:", v1) // 成功转换0022: &{Jeke 0}
- } else {
- fmt.Println("失败0022")
- }
-
- // aa不可以强转为struct{}类型
- v2, ok := aa.(*struct {
- Name string
- Age int
- })
- if ok {
- fmt.Println("成功转换00333:", v2)
- } else {
- fmt.Println("失败00333") // 失败00333
- }
-
- // a可以赋值Hobby, Hobby可以强转a类型,
- // 注意:a为指针类型,Hobby只能强转a的指针类型,值类型不行
- var hobby Hobby
- hobby = a
- v3, ok := hobby.(*American)
- if ok {
- fmt.Println("成功转换004444:", v3) //成功转换004444: &{Jeke 0}
- } else {
- fmt.Println("失败004444")
- }
- }
-
- func Avv(a Hobby) {
- a.Sing()
- }

(type类型:系统原生数据类型:如 int、string、bool、float32 等类型,以及使用 type 关键字定义的类型)
(Kind类型:种类(Kind)指的是对象归属的品种,在 reflect 包中有如下定义:https://mp.csdn.net/mp_blog/creation/editor/119148976)
- package main
-
- import (
- "fmt"
- "reflect"
- "testing"
- )
-
- type Age int
-
- // 强制类型转换
- func TestQb(t *testing.T) {
- var a interface{}
-
- var b Age
- b = 32
- a = b
-
- tt := reflect.TypeOf(b)
- fmt.Println("类型 Type:", tt.Name()) // 类型 Type: Age
- fmt.Println("种类 Kind:", tt.Kind()) // 种类 Kind: int
-
- // a可以转换成b的type类型(系统原生数据类型)
- v, ok := a.(Age)
- if ok {
- fmt.Println("转换成功001:", v) // 转换成功001: 32
- } else {
- fmt.Println("失败001")
- }
-
- // 但a不能转换成b的种类Kind类型
- v1, ok := a.(int)
- if ok {
- fmt.Println("转换成功0022", v1)
- } else {
- fmt.Println("失败0022") // 失败0022
- }
-
- // 但a更不能转换成其他类型
- v2, ok := a.(int64)
- if ok {
- fmt.Println("转换成功00333:", v2)
- } else {
- fmt.Println("失败00333") // 失败00333
- }
-
- v3, ok := a.(string)
- if ok {
- fmt.Println("转换成功004444:", v3)
- } else {
- fmt.Println("失败004444") // 失败004444
- }
- }

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。