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

相关文章

全面掌握 SQL 中的 DATEDIFF函数及用法最佳实践

《全面掌握SQL中的DATEDIFF函数及用法最佳实践》本文解析DATEDIFF在不同数据库中的差异,强调其边界计算原理,探讨应用场景及陷阱,推荐根据需求选择TIMESTAMPDIFF或inte... 目录1. 核心概念:DATEDIFF 究竟在计算什么?2. 主流数据库中的 DATEDIFF 实现2.1

深入理解Go语言中二维切片的使用

《深入理解Go语言中二维切片的使用》本文深入讲解了Go语言中二维切片的概念与应用,用于表示矩阵、表格等二维数据结构,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录引言二维切片的基本概念定义创建二维切片二维切片的操作访问元素修改元素遍历二维切片二维切片的动态调整追加行动态

MySQL中的LENGTH()函数用法详解与实例分析

《MySQL中的LENGTH()函数用法详解与实例分析》MySQLLENGTH()函数用于计算字符串的字节长度,区别于CHAR_LENGTH()的字符长度,适用于多字节字符集(如UTF-8)的数据验证... 目录1. LENGTH()函数的基本语法2. LENGTH()函数的返回值2.1 示例1:计算字符串

Java中的数组与集合基本用法详解

《Java中的数组与集合基本用法详解》本文介绍了Java数组和集合框架的基础知识,数组部分涵盖了一维、二维及多维数组的声明、初始化、访问与遍历方法,以及Arrays类的常用操作,对Java数组与集合相... 目录一、Java数组基础1.1 数组结构概述1.2 一维数组1.2.1 声明与初始化1.2.2 访问

go中的时间处理过程

《go中的时间处理过程》:本文主要介绍go中的时间处理过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1 获取当前时间2 获取当前时间戳3 获取当前时间的字符串格式4 相互转化4.1 时间戳转时间字符串 (int64 > string)4.2 时间字符串转时间

Go语言中make和new的区别及说明

《Go语言中make和new的区别及说明》:本文主要介绍Go语言中make和new的区别及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1 概述2 new 函数2.1 功能2.2 语法2.3 初始化案例3 make 函数3.1 功能3.2 语法3.3 初始化

MySQL 中的 CAST 函数详解及常见用法

《MySQL中的CAST函数详解及常见用法》CAST函数是MySQL中用于数据类型转换的重要函数,它允许你将一个值从一种数据类型转换为另一种数据类型,本文给大家介绍MySQL中的CAST... 目录mysql 中的 CAST 函数详解一、基本语法二、支持的数据类型三、常见用法示例1. 字符串转数字2. 数字

Python中你不知道的gzip高级用法分享

《Python中你不知道的gzip高级用法分享》在当今大数据时代,数据存储和传输成本已成为每个开发者必须考虑的问题,Python内置的gzip模块提供了一种简单高效的解决方案,下面小编就来和大家详细讲... 目录前言:为什么数据压缩如此重要1. gzip 模块基础介绍2. 基本压缩与解压缩操作2.1 压缩文

解读GC日志中的各项指标用法

《解读GC日志中的各项指标用法》:本文主要介绍GC日志中的各项指标用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、基础 GC 日志格式(以 G1 为例)1. Minor GC 日志2. Full GC 日志二、关键指标解析1. GC 类型与触发原因2. 堆

MySQL数据库中ENUM的用法是什么详解

《MySQL数据库中ENUM的用法是什么详解》ENUM是一个字符串对象,用于指定一组预定义的值,并可在创建表时使用,下面:本文主要介绍MySQL数据库中ENUM的用法是什么的相关资料,文中通过代码... 目录mysql 中 ENUM 的用法一、ENUM 的定义与语法二、ENUM 的特点三、ENUM 的用法1