go中struct实现多个接口.type会显示哪个接口

本文探讨了Go语言中一个结构体实现多个接口时的行为,通过示例代码展示了如何使用接口和反射来判断类型,解释了接口转换和类型检查的工作原理。
部署运行你感兴趣的模型镜像
package main

import (
	"fmt"
	"reflect"
)

type IntF1 interface {
	show1() string
}

type IntF2 interface {
	show2() string
}

type IntF3 interface {
	show3() string
}

type Cls struct {
	v1 string
	v2 string
	v3 string
}

func (c *Cls)show1() string {
	return c.v1
}

func (c *Cls)show2() string {
	return c.v2
}

func (c *Cls)show3() string {
	return c.v3
}

func Demo1(){
	var cls IntF2
	cls = &Cls{
		v1: "1",
		v2: "2",
		v3: "3",
	}
	icls := interface{}(cls)
	switch icls.(type) {
	case IntF2:
		fmt.Println("IntF2")
	case IntF1:
		fmt.Println("IntF1")
	case IntF3:
		fmt.Println("IntF3")
	default:
		fmt.Println(reflect.TypeOf(icls))
		
	}
}

func Demo2()  {
	var cls IntF1
	cls = &Cls{
		v1: "1",
		v2: "2",
		v3: "3",
	}
	icls := reflect.TypeOf(cls)

	switch icls.Kind() {
	case reflect.Interface:
		fmt.Println("Interface")
	case reflect.Struct:
		fmt.Println("Struct")
	default:
		fmt.Println(icls.Kind() )

	}
}

func main() {
	Demo1()
	Demo2()
}

结论,当一个struct实现多个interface的时候, 该struct转为interface再.type匹配类型的时候会以此查看哪一个case符合要求,有限匹配符合要求的case, 也就是说.(type)之后并不会确定该interface的类型,在它满足要求的所有case中,哪个写在前面就执行哪个case 而通过reflect.TypeOf().kind()得到的不是具体的用户实现的类型(用户实现的具体类型是无限的),而是reflect中包含的类型,是有限的,比如所有的结构体都属于reflect.struct, 接口都属于ptr。

您可能感兴趣的与本文相关的镜像

ACE-Step

ACE-Step

音乐合成
ACE-Step

ACE-Step是由中国团队阶跃星辰(StepFun)与ACE Studio联手打造的开源音乐生成模型。 它拥有3.5B参数量,支持快速高质量生成、强可控性和易于拓展的特点。 最厉害的是,它可以生成多种语言的歌曲,包括但不限于中文、英文、日文等19种语言

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值