go语言学习笔记 — 进阶 — 接口:使用类型分支,批量判断空接口中变量的类型

Posted Locutus

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了go语言学习笔记 — 进阶 — 接口:使用类型分支,批量判断空接口中变量的类型相关的知识,希望对你有一定的参考价值。

go的switch语句不仅可以实现数值、字符串的判断,还可以判断一个接口内保存或实现的类型。


1. 类型分支的格式

switch 接口变量.(type) {
    case 类型1:
        // 变量是类型1时的处理
    case 类型2:    
        // 变量是类型2时的处理
    ...
default:
    // 变量不是所有case中列举类型时的处理
}

接口变量:表示需要判断的接口类型变量。

类型1、类型2…:表示接口变量可能具有的类型列表,满足时,会指定case对应的分支进行处理。


2. 使用类型分支判断基本类型

把一个空接口类型interface{}的参数传递给printType函数,通过switch语句判断空接口v中包含的具体类型。

package main

import (
	"fmt"
	"testing"
)

func printType(v interface{}) {
	switch v.(type) { // v.(type)是类型分支的典型写法,代码经过switch时,会判断空接口v中包含的具体类型,从而进行类型分支跳转
	case int:
		fmt.Println(v, "is int")
	case string:
		fmt.Println(v, "is string")
	case bool:
		fmt.Println(v, "is bool")
	}
}

func mian() {
	printType(1024)
	printType("pig")
	printType(true)
}

3. 使用类型分支判断接口类型

多个接口进行类型断言时,可以使用类型分支简化判断过程。

package main

import (
	"fmt"
	"testing"
)

// 接口实现
type Alipay struct{} // 电子支付方式

func (a *Alipay) CanUseFaceID() {} // 为Alipay添加CanUseFaceID方法,表示电子支付支持刷脸

type Cash struct{} // 现金支付方式

func (a *Cash) Stolen() {} // 为Cash类型添加Stolen方法,表示现金支付方式会出现偷窃现象

// 接口定义
type ContainCanUseFaceID interface { // 具备刷脸特性的接口
	CanUseFaceID()
}

type ContainStolen interface { // 具备被偷特性的接口
	Stolen()
}

// 接口调用方
func print(payMethod interface{}) { // 传入支付方式的接口
	switch payMethod.(type) { // 判断一种支付方法具备哪些特性
	case ContainCanUseFaceID:
		fmt.Printf("%T can use faceid\\n", payMethod)
	case ContainStolen:
		fmt.Printf("%T may be stolen\\n", payMethod)
	}
}

func main() {
	print(new(Alipay))
	print(new(Cash))
}

/*
*interface_test.Alipay can use faceid
*interface_test.Cash may be stolen
 */

以上是关于go语言学习笔记 — 进阶 — 接口:使用类型分支,批量判断空接口中变量的类型的主要内容,如果未能解决你的问题,请参考以下文章

go语言学习笔记 — 进阶 — 接口:接口声明

go语言学习笔记 — 进阶 — 接口(3.2):接口与类型的关系 —— 多个类型可以实现一个(相同)接口

go语言学习笔记 — 进阶 — 接口:空接口类型interface{} —— 能保存所有值

go语言学习笔记 — 进阶 — 接口(2.1):实现接口的条件 —— 接口的方法与实现接口的类型方法一致

go语言学习笔记 — 进阶 — 接口(3.1):接口与类型的关系 —— 一个类型可以实现多个接口

go语言学习笔记 — 进阶 — 接口(2.3):接口无法实现的例子