go interface 类型用法

2024-06-16 00:48
文章标签 go interface 用法 类型

本文主要是介绍go interface 类型用法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一个例子短平快的了解 interface 的语法

  • 接口定义

  • 接口实现

  • 接口零值 nil

  • 表达式实现接口的方法,可以赋值给接口变量

    • 实例赋值给接口
    • 指针赋值给接口
    • 接口赋值给接口
  • T 型值方法集 (t T)

  • *T 型值方法集 (t T) 和 (t *T)

  • 判等,可赋值,可判等

  • 类型断言 t = x.(T)

    • 断言是具体类型
    • 断言是接口类型
    • 断言失败,崩溃
    • 断言空接口值,肯定失败,崩溃
    • 断言返回二元组,如果成功返回值 和 true
    • 断言返回二元组,如果失败返回 nil 和 false, 而不是崩溃
  • 类型分支

例子


package mainimport "fmt"//接口定义
type Reader interface {Read() T
}//
type Writer interface {Write(arg T)
}//
type ReadWrite interface {Read() TWrite(arg T)
}// 接口实现
type T int64func (t T) Read() T {return t
}
func (t *T) Write(arg T) {*t = arg
}func main() {var t T = 123var r Readervar w Writervar rw ReadWritevar n ReadWrite//接口零值nilfmt.Println(t, r, w, rw, n) //123 <nil> <nil> <nil> <nil>//表达式实现接口的方法,可以赋值给接口变量r = t   //实例赋值给接口rw = &t //指针赋值给接口w = rw  //接口赋值给接口// T 型值方法集 (t T) ,这里 Readr = t//w = t				//(t *T) 型方法不是 T 型值的方法集//T(10).Write(t)	//(t *T) 型方法不是 T 型值的方法集  <==  T(10) 无法取地址,无法调用 Write 方法// *T 型值方法集 (t T) 和 (t *T), 这里 Read Writer = &tw = &t//判等,可赋值,可判等fmt.Println(t == r, &t == w, &t == rw) // false true true//类型断言 t = x.(T)r = tt = r.(T)      //断言是具体类型r = r.(Reader) //断言是接口类型// w = r.(Writer) 	//断言失败,崩溃// rw = n.(ReadWrite) //断言空接口值,肯定失败,崩溃r, ok := r.(Reader) //断言返回二元组,如果成功返回值 和 truefmt.Println(r, ok)  //123 truew, ok = r.(Writer)  //断言返回二元组,如果失败返回 nil 和 false, 而不是崩溃fmt.Println(w, ok)  //<nil> fals//类型分支switch rw := rw.(type) { //左边 rw 是新建的和右边 rw 同名的变量case nil: //rw == nil 时case Writer:// fallthrough			//不能用 fallthroughcase Reader:case ReadWrite:default: //以上都不满足时 defaultfmt.Sprintf("%T:%v", rw, rw)}
}

输出

123 <nil> <nil> <nil> <nil>
false true true
123 true
<nil> false

从源码分析接口类型

//GOPATH\src\runtime\runtime2.go
type iface struct {tab  *itabdata unsafe.Pointer
}type eface struct {_type *_typedata  unsafe.Pointer
}// layout of Itab known to compilers
// allocated in non-garbage-collected memory
// Needs to be in sync with
// ../cmd/compile/internal/gc/reflect.go:/^func.dumptypestructs.
type itab struct {inter *interfacetype_type *_typehash  uint32 // copy of _type.hash. Used for type switches._     [4]bytefun   [1]uintptr // variable sized. fun[0]==0 means _type does not implement inter.
}//GOPATH\src\runtime\type.go
// Needs to be in sync with ../cmd/link/internal/ld/decodesym.go:/^func.commonsize,
// ../cmd/compile/internal/gc/reflect.go:/^func.dcommontype and
// ../reflect/type.go:/^type.rtype.
type _type struct {size       uintptrptrdata    uintptr // size of memory prefix holding all pointershash       uint32tflag      tflagalign      uint8fieldalign uint8kind       uint8alg        *typeAlg// gcdata stores the GC type data for the garbage collector.// If the KindGCProg bit is set in kind, gcdata is a GC program.// Otherwise it is a ptrmask bitmap. See mbitmap.go for details.gcdata    *bytestr       nameOffptrToThis typeOff
}
go 类型分类
  • 具体类型 int,string,struct{},…
  • 抽象类型 interface

interface接口类型,无数据和方法,定义了一个方法集(一个多个方法声明,包含方法名和签名).不可以实例化,可以定义一个变量.

接口类型
  • itab
    • 接口类型描述符(静态类型 inter)
    • 具体类型描述符(动态类型 _type)
    • 方法集(fun)
  • 具体类型值(动态值 data)
空接口类型
  • 具体类型描述符(动态类型 _type)
  • 具体类型值(动态值 data)

这篇关于go interface 类型用法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1065060

相关文章

#error用法

/* *检查编译此源文件的编译器是不是C++编译器 *如果使用的是C语言编译器则执行#error命令 *如果使用的是 C++ 编译器则跳过#error命令 */ #ifndef __cplusplus #error 亲,您当前使用的不是C++编译器噢! #endif #include <stdio.h> int main() {

SQL Server中,查询数据库中有多少个表,以及数据库其余类型数据统计查询

sqlserver查询数据库中有多少个表 sql server 数表:select count(1) from sysobjects where xtype='U'数视图:select count(1) from sysobjects where xtype='V'数存储过程select count(1) from sysobjects where xtype='P' SE

SQL Server中,isnull()函数以及null的用法

SQL Serve中的isnull()函数:          isnull(value1,value2)         1、value1与value2的数据类型必须一致。         2、如果value1的值不为null,结果返回value1。         3、如果value1为null,结果返回vaule2的值。vaule2是你设定的值。        如

C#中,decimal类型使用

在Microsoft SQL Server中numeric类型,在C#中使用的时候,需要用decimal类型与其对应,不能使用int等类型。 SQL:numeric C#:decimal

tensorboard-----summary用法总结

Tensorflow学习笔记——Summary用法         最近在研究tensorflow自带的例程speech_command,顺便学习tensorflow的一些基本用法。 其中tensorboard 作为一款可视化神器,可以说是学习tensorflow时模型训练以及参数可视化的法宝。 而在训练过程中,主要用到了tf.summary()的各类方法,能够保存训练过程以及参数分布图并在

说一说三大运营商的流量类型,看完就知道该怎么选运营商了!

说一说三大运营商的流量类型,看完就知道该怎么选运营商了?目前三大运营商的流量类型大致分为通用流量和定向流量,比如: 中国电信:通用流量+定向流量 电信推出的套餐通常由通用流量+定向流量所组成,通用流量比较多,一般都在100G以上,而且电信套餐长期套餐较多,大多无合约期,自主激活的卡也是最多的,适合没有通话需求的朋友办理。 中国移动:通用流量+定向流量 移动推出的套餐通常由通用流量+定向

vscode-创建vue3项目-修改暗黑主题-常见错误-element插件标签-用法涉及问题

文章目录 1.vscode创建运行编译vue3项目2.添加项目资源3.添加element-plus元素4.修改为暗黑主题4.1.在main.js主文件中引入暗黑样式4.2.添加自定义样式文件4.3.html页面html标签添加样式 5.常见错误5.1.未使用变量5.2.关闭typescript检查5.3.调试器支持5.4.允许未到达代码和未定义代码 6.element常用标签6.1.下拉列表

微服务中RPC的强类型检查与HTTP的弱类型对比

在微服务架构中,服务间的通信是一个至关重要的环节。其中,远程过程调用(RPC)和HTTP是两种最常见的通信方式。虽然它们都能实现服务间的数据交换,但在类型检查方面,RPC的强类型检查和HTTP的弱类型之间有着显著的差异。本文将深入探讨这两种通信方式在类型检查方面的优缺点,以及它们对微服务架构的影响。 一、RPC的强类型检查 RPC的强类型检查是其核心优势之一。在RPC通信中,客户端和服务端都使

YTKKeyValueStore用法

iOS端的尝试 后来我从后台转做iOS端的开发,我就尝试了在iOS端直接使用Key-Value式的存储。经过在粉笔网、猿题库、小猿搜题三个客户端中的尝试后,我发现Key-Value式的存储不但完全能够满足大多数移动端开发的需求,而且非常适合移动端采用。主要原因是:移动端存储的数据量不会很大: 如果是单机的应用(例如效率工具Clear),用户自己一个人创建的数据最多也就上万条。 如果

一二三应用开发平台应用开发示例(4)——视图类型介绍以及新增、修改、查看视图配置

调整上级属性类型 前面为了快速展示平台的低代码配置功能,将实体文件夹的数据模型上级属性的数据类型暂时配置为文本类型,现在我们调整下,将其数据类型调整为实体,如下图所示: 数据类型需要选择实体,并在实体选择框中选择自身“文件夹” 这时候,再点击生成代码,平台会报错,提示“实体【文件夹】未设置主参照视图”。这是因为文件夹选择的功能页面,同样是基于配置产生的,因为视图我们还没有配置,所以会报错。