golang 笔记13 interface

golang 笔记13 interface

  1. interface 基础

一个变量如果实现了接口中定义的所有方法 那么这个变量可以理解为这种接口类型的变量

package interface_demo

import (
	"fmt"
	"testing"
)

// 	定义接口
type speaker interface {
	speak() // 只要实现了 speak 方法的变量都是 speaker 类型
}

type dog struct{ name string }
type cat struct{ age int }

func (d dog) speak() {
	fmt.Println(d.name, ":汪汪汪")
}
func (c cat) speak() {
	fmt.Println("喵喵喵", c.age)
}

// 使用接口
func call(sp speaker) {
	sp.speak()
}

// 调用接口方法
func TestInterfaceDemo1(t *testing.T) {
	var c1 cat
	c1.age = 12
	call(c1)

	var d1 dog
	d1.name = "dico"
	call(d1)

	var sp speaker
	sp = c1
	sp.speak()
}
  1. 空接口
// interface{} 空接口类型
type blank interface{} // 所有类型都实现了空接口 即所有类型都相当于这种接口类型的变量

// 空接口 作为入参
func BlankInterfaceDemo1(param interface{}) {
	fmt.Println(param)
}

// 空接口列表
func BlankInterfaceDemo2(params ...interface{}) {
	for i, v := range params {
		fmt.Println(i, v)
	}
}

// 空接口 作为 map 的 value
func BlankInterfaceDemo3() {
	var interMap map[string]interface{} = map[string]interface{}{}
	interMap["hello"] = 514
	interMap["world"] = "world"
	interMap["mc"] = time.Now()
	interMap["xx"] = 's'
	fmt.Println(interMap)
}
  1. 类型断言

/*
x.(T)
x : 类型为 interface{} 的变量
T : 表示断言 x 可能的类型
*/
func interface_demo4(param interface{}) {
	value, ok := param.(string)
	if !ok {
		fmt.Println("param not is string:", param)
		return
	}
	fmt.Printf("param is string: %s\n", value)
}

// 不建议使用
func interface_demo5(param interface{}) {
	switch t := param.(type) {
	case int:
		fmt.Println("is int -> ", t)
	case string:
		fmt.Println("is string -> ", t)
	case bool:
		fmt.Println("is bool -> ", t)
	case float64:
		fmt.Println("is float -> ", t)
		// ...
	}
}

func TestBlankInterfaceDemo4(t *testing.T) {
	interface_demo4("hello")
	interface_demo4(1024)
	interface_demo5("world")
	interface_demo5(1024)
	interface_demo5(true)
	interface_demo5(3.1415926)
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值