Golang接口interface之断言,switch type

Posted by     "" on Friday, July 26, 2019

Golang接口interface之断言,switch type

interface{} 可以接受任何类型的对象值, 获取interface{}对象的数据类型, 可以使用断言或者switch type来实现. 示例代码:

package interface_demo

import (
	"testing"
	"fmt"
)

/*
golang 接口 interface{}, 断言, switch type example
interface{}可以接受任何类型的对象值
获取interface{}对象的数据类型,可以使用断言,或者switch type 来实现

*/
// Assertion

type Bag struct {
	Key string
}

type Bag2 struct {
	Key int
}

func TestInterface(t *testing.T) {
	var b1 interface{}
	var b2 interface{}

	b1 = Bag{Key: "1"}
	b2 = Bag2{Key: 0}
	// 获取interface{}中存放的数据类型
	// 方法一:
	{
		//判断是否是Bag类型, 若不是则置0
		b, ok := b1.(Bag)
		fmt.Println("Bag类型:", ok, "数据", b)
	}
	{
		b, ok := b2.(Bag2)
		fmt.Println("Bag2类型:", ok, "数据", b)
	}
	// 方法二:
	switch v := b1.(type) { // v 表示b1接口转换长Bag对象的值
	case Bag:
		fmt.Println("b1.(type):", "Bag", v)
	case Bag2:
		fmt.Println("b1.(type):", "Bag2", v)
	default:
		fmt.Println("b1.(type):", "other", v)
	}
}

$ go test -run TestInterface interface-demo_test.go -v
=== RUN   TestInterface
Bag类型: true 数据 {1}
Bag2类型: true 数据 {0}
b1.(type): Bag {1}
--- PASS: TestInterface (0.00s)
PASS
ok      command-line-arguments  0.006s
  • 断言: 一般使用于已知interface中对象的数据类型, 调用后自动将接口转换成相应的对象 语法结构: 接口对象(obj), 存放的数据类型(string) v, ok := obj.(string), 若是相应的对象ok则为真,v 为相应对象及数据.
  • switch type: 已知或者未知对象的数据类型均可, b1.(type) 必须配合switch 来使用, 不能单独执行此语句.

switch v := b1.(type) { // b1为interface对象, v 为相应的对象及数据 case Bag: //类型为Bag时执行 fmt.Println(“b1.(type):”, “Bag”, v) case Bag2: // 类型为Bag2时执行 fmt.Println(“b1.(type):”, “Bag2”, v) default: // 类型为其他类型是执行 fmt.Println(“b1.(type):”, “other”, v) }

「真诚赞赏,手留余香」

Richie Time

真诚赞赏,手留余香

使用微信扫描二维码完成支付