Go 结构体(struct)实现接口(interface)以及赋值、强转

时间:2025-02-24 18:29:55

 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
	}
}