首页 > 其他分享 >第七章(接口)

第七章(接口)

时间:2023-01-23 23:35:53浏览次数:33  
标签:func string data 接口 第七章 var type

接口定义

  • 接口代表一种调用契约,是多个方法声明的集合

  • Go接口实现机制很简洁,只要目标类型方法集合包含接口声明的全部方法,就被视为实现了该接口,无须做显式声明。

  • 目标类型可实现多个接口

  • 接口的限制

    • 不能有字段
    • 不能定义自己的方法
    • 只能声明方法,不能实现
    • 可嵌入其他接口类型
  • 接口通常以er作为名称后缀,方法名是声明组成部分,但参数名可不同或省略

package main

type tester interface {
	test()
	string() string
}

type data struct {
}

func (*data) test()         {}
func (data) string() string { return "" }
func main() {
	var d data

	//var t tester = d //cannot use d (type data) as type tester in assignment: data does not implement tester (test method has pointer receiver)
	var t tester = &d
	t.test()
	t.string()
}

编译器根据方法集来判断是否实现了接口

  • 如果接口没有任何方法声明,那么就是一个空接口interface{},它的用途类似面向对象里的根对象{Object}。
  • 接口变量默认是nil。如果实现接口的类型支持,可做相等运算
func main() {
	var t1, t2 interface{}

	println(t1 == nil, t2 == t1) //true true

	t1, t2 = 100, 100
	println(t1 == t2)
	t1, t2 = map[string]int{}, map[string]int{} //map类型不支持相等运算
	println(t1 == t2) //panic: runtime error: comparing uncomparable type map[string]int
  }
  • 可以像匿名字段那样,嵌入其它接口。目标类型方法集中必须包含嵌入的接口方法在内的全部方法才算实现了该接口

嵌入其他接口类型,相当于将其声明的方法集导入。这就要求不能有同名方法,因为不支持重载。不能嵌入自身或循环嵌入,那会导致递归错误。

  • 超集接口变量可隐式转换为子集,反过来不行

  • 支持匿名接口类型,可直接用于变量定义,或作为结构字段类型

type data struct {
}

func (data) string() string { return "" }

type node struct {
	data interface { //匿名接口变量
		string() string
	}
}

func main() {
	var t interface { //定义匿名接口变量
		string() string
	} = data{}
	n := node{
		data: t,
	}
	println(n.data.string())

}

接口赋值

  • 接口赋值分两种情况:

    • 将对象实例赋值给接口
    • 将一个接口赋值给另一个接口(两个接口拥有相同的方法列表(次序不同不要紧),那么就是相同的,可以相互赋值)
  • 将对象实例赋值给接口

type Integer int

func (a Integer) Less(b Integer) bool {
	return a < b
}

func (a *Integer) Add(b Integer) {
	*a += b
}

type LessAdder interface {
	Less(b Integer) bool
	Add(b Integer)
}

func main() {
	var a Integer = 1
	var b LessAdder = a  //<1>编译失败
	var b LessAdder = &a  //<2>赋值正确
}

<1> 编译失败。因为Add方法的receiver是指针类型。
如果将上面例子中的Add方法的receiver改为值类型,<1><2>都赋值成功

接口查询

  var file1 Writer = ...
  if file5, ok := file1.(two.IStream);ok {
  ...
}

if语句检查file1接口指向的对象的对象实列是否实现了two.IStream接口

接口查询是否成功,要在运行期才能确定

  • 可以判断接口指向的对象是否是某个类型
var file1 Writer = ...
if file6, ok := file1.(*File); ok {
  ...
}

if语句判断file1接口指向的对象实例是否是*File类型

  • 类型推断可将接口变量还原为原始类型,或用来判断是否实现了某个更具体的接口类型

类型查询

  • 可以直接判断接口指向对象实例的类型
func main() {
	var v1 interface{} = 5
	switch v1.(type) {
	case int:
		fmt.Println("type is int") //接口类型是int
	case string:
		fmt.Println("type is string")
	}
}
  • 类型判断eg
type data int

func (d data) String() string {
	return fmt.Sprintf("data:%d", d)
}
func main() {
	var d data = 15
	var x interface{} = d
	if n, ok := x.(fmt.Stringer); ok { //判断x是否实现了fmt.Stringer接口(类型的方法集包含String方法就实现了fmt.Stringer接口
		fmt.Println(n)
	}
	if d2, ok := x.(data); ok { //判断x的类型是否为data类型
		fmt.Println(d2)
	}
	//e := x.(error) //panic: interface conversion: main.data is not error: missing method Error
	//fmt.Println(e)

	//正确方式
	if e3, ok := x.(error); ok {
		fmt.Println(e3)
	}
}

使用ok-idiom模式,即便转换失败也不会引起panic

type switch 不支持fallthrought

标签:func,string,data,接口,第七章,var,type
From: https://www.cnblogs.com/badake/p/17060555.html

相关文章

  • 通用8位SPI接口模块——verilog实现
    本次设计一个八位的SPI的接口模块,可以修改输出的频率,也可以通过修改参数来设置通信模式。本模块是设定生成一个目标输出频率的二倍计数器,然后通关计数的值来输出响应的信......
  • Java使用Semaphore对单接口进行限流
    java使用Semaphore对单接口进行限流目录一、实战说明1.1效果说明1.2核心知识点二、?环境搭建三、限流演示3.1并发请求工具3.2效果示例图一、实战说明1.1效果说明......
  • 第七章 动态函数
    当条件变化时,输出可以随之变化本章主要介绍FILTER函数(EXCEL2021才有)与SUBTOTAL函数1、FILTER函数依据条件筛选数据FILTER(数据区,筛选条件,[无合适结果时返回的值])e......
  • 自动化接口测试-第01天-接口、接口测试、URL、HTTP协议、接口文档解析
    接口概念接口就是:系统与系统之间,组件与组件之间,数据传递交互的通道。接口的类型按协议划分:http、tcp、IP按语言划分:C++、java、php。。。按范围划分:系统之间:多个内部系统之......
  • springmvc接口访问流程排查
    首先找到webapp下面的web.xml文件:检查前端控制器:并注意contextConfigLocation配置的springmvc的配置文件路径:  接着找到springmvc配置文件路径,如果是注解开发注意配......
  • 解决vue部署到服务器请求接口404问题
    解决vue部署到服务器请求接口404问题:https://blog.csdn.net/weixin_44692055/article/details/103693859?utm_medium=distribute.pc_relevant.none-task-blog-2~default~ba......
  • shell 获取本地主机指定网络接口的ip
    源码:get_local_ips.sh#!/bin/bashget_ip_from_device_index(){index=$1sed_cmd="sed-ne'/^$((index)):/,/^$((index+1)):/p'"ipa|eval$sed_cmd......
  • 每刻和金蝶云星空接口打通对接实战
    每刻和金蝶云星空接口打通对接实战接通系统:每刻3000+中大型企业在用,新一代业财税一体化解决方案提供商。旗下拥有每刻报销、每刻档案、每刻云票、每刻财务共享云平台等......
  • 从旺店通·企业奇门到用友U8通过接口集成数据
    从旺店通·企业奇门到用友U8通过接口集成数据接入系统:旺店通·企业奇门慧策(原旺店通)是一家技术驱动型智能零售服务商,基于云计算PaaS、SaaS模式,以一体化智能零售解决方......
  • 马帮对接打通金蝶云星空获取订单列表接口与销售出库新增接口
    接入系统:马帮马帮ERP旗下有马帮ERP3.0、马帮ERP亚马逊专用版、马帮WMS仓储管理系统、马帮云仓、马帮TMS、跨境分销、马帮供应链SCM管理系统等产品,为跨境电商卖家提供高......