首页 > 其他分享 >golang的interface

golang的interface

时间:2022-10-29 19:03:25浏览次数:50  
标签:fmt 数据类型 接口 golang Go 类型 interface


golang的interface

0.介绍

接口是 Go 语言提供的数据类型之一,它把所有具有共性的方法 (注意与函数区别开) 定义在一起,任何其它类型只要一一实现这些方法的话,我们就称这个类型实现了这个接口。Go 语言的接口与 C++ 的虚函数有共通之处,提高了语言的灵活性的同时也弥补了语言自身的一些不足。

Go 语言的接口与其它面向对象语言的接口不同,Go 的接口只是用来对方法进行一个收束,而正是这个收束,使得 Go 这个面向过程的语言拥有了面向对象的特征。

一般来说,Go 接口的主要功能有:

  1. 作为方法的收束器,进行具有 “面向对象程序设计特色” 的程序设计。
  2. 作为各种数据的承载者,可以用来为函数接收各类不同数量的函数参数,这也是 Go 提倡的接口编程。

1.实例

Golang中的interface

先说说接口,接口我理解为一些行为的集合。似乎还是很懵x。来看看代码和允许效果,再说。

golang的interface_golang


golang的interface_数据_02


golang的interface_golang_03


2.空接口

一个空接口 ​​interface{}​​ 什么方法 (method) 也没有实现,是一个能装入任意数量、任意数据类型的数据容器。

为什么这样说呢?是这样的。空接口 ​​interface{}​​ 也是接口,不过是没有实现方法的接口罢了。回顾接口的定义:接口是一组方法的集合,是一种数据类型,任何其他类型如果能实现接口内所有的方法的话,我们称那个数据类型实现了这个接口。咱们再来看空接口:里面连一个方法也没有,不也就是任意数据类型都能实现这个接口了嘛。这就和 “空集能被任意集合包含” 一样嘛,空接口能被任意数据类型实现。

与 C 语言的 ​​void *​​​ 可以转换成任意其它类型的指针 (如 ​​char *​​​、​​int *​​​ 等) 不同的是,Go 语言的 ​​interface{}​​​ 不是一个任意数据类型,​​interface{}​​​ 的类型就是 ​​interface{}​​​ 类型,不能转换成其他接口类型,更不能转换成其他什么类型 (比如​​[]int​​​、​​string​​​等等) ,只不过是 ​​interface{}​​ 能装入任意数据罢了。

把其它类型的变量转换成​​interface{}​​​类型后,在程序运行时 (runtime) 内,该变量的数据类型将会发生变化,但是如果这时候要求获取该变量的数据类型,我们会得到​​interface{}​​类型。这是为啥子呢?

在 Golang 的源代码中,用​​runtime.iface​​​表示非空接口类型,用​​runtime.eface​​​表示空接口类型​​interface{}​​​。虽然它们俩都用一个​​interface​​​声明,但是后者在 Golang 的源代码更加常见,所以在实现​​interface{}​​时,使用了特殊的类型。具体的你得看 Golang 源代码和 Go 手册了。


3.断言

3.1 定义

golang的interface_数据_04

3.2 v,ok=x.(Y)应用

func main() {
var x interface{}
x = "pprof.cn"
v, ok := x.(string)
if ok {
fmt.Println(v)
} else {
fmt.Println("类型断言失败")
}
//输出:pprof.cn
}
func main() {
var x interface{}
x = "pprof.cn"
v, ok := x.(bool)
if ok {
fmt.Println(v)
} else {
fmt.Println("类型断言失败")
}
//输出:类型断言失败
}

3.3 type switch 语句介绍

golang的interface_golang_05

golang的interface_数据_06

func justifyType(x interface{}) {
switch v := x.(type) {
case string:
fmt.Printf("x is a string,value is %v\n", v)
case int:
fmt.Printf("x is a int is %v\n", v)
case bool:
fmt.Printf("x is a bool is %v\n", v)
default:
fmt.Println("unsupport type!")
}
}
func main() {
var x interface{}
x = "pprof.cn"
justifyType(x) //输出:x is a string,value is pprof.cn
}


标签:fmt,数据类型,接口,golang,Go,类型,interface
From: https://blog.51cto.com/u_15326986/5806324

相关文章

  • golang学习之路1-环境安装及Helloword
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档@目录Golang学习之路前言一、安装环境1.Golang安装2.GoLand安装二、第一个go程序HelloWord三、go命令......
  • golang学习之路2-基础认识(上)
    @目录前言一、变量定义1.变量2.数据类型二、自增自减三、指针1.使用指针&及*2.空指针3.指针完整代码四、不支持语法1.自增自减--i及++i2.不支持内存地址(指针)加减3.......
  • golang实现RSA2的签名与验签函数
    使用非对称加密算法,实现签名与验签packagetoolsimport("crypto""crypto/rand""crypto/rsa""crypto/sha256""crypto/x509""encoding/b......
  • golang 学习入门项目(超适合新手入门,新手进阶)
    过年的疫情,让我有了时间整理自己的博客。这篇是关于如何学习golang这门语言的。实例代码一分享到github点击获取源码 ​​github学习golang​​本项目是个gogin框架写的......
  • golang---恢复符号
    golang---恢复符号这样编译go程序,可以去除符号,加大逆向人员分析难度gobuild-ohello-ldflags'-s'hello.go不过符号并不是真的删掉了,可以通过一些脚本恢复回来for......
  • Golang基础-流程控制
    流程控制语句是用来控制程序中各语句执行顺序的语句,可以把语句组合成能完成一定功能的小逻辑模块控制语句分为三大类:顺序、选择、循环一、分支结构if分支结构单分支......
  • Golang Vue 后台框架 go-admin 从零开始企业级实战视频教程(33 个视频)
    GolangVue后台框架go-admin从零开始企业级实战视频教程(33个视频)Golang作为后端应该会成为未来几年的主要趋势之一,Vue又是用得最多的框架,go-admin是一个很成熟的后......
  • 快速初始化golang和nodejs
    文档说明:只记录关键地方;试验环境:webIDEvscode网页版code-server目标:webIDE终端里能快速使用golang,nodejs,python3,pip3test!-f/etc/apt/source.list.sa......
  • golang中的锁竞争问题
    索引:https://www.waterflow.link/articles/1666884810643当我们打印错误的时候使用锁可能会带来意想不到的结果。我们看下面的例子:packagemainimport( "fmt" "syn......
  • golang dlv调试
    refer:https://blog.csdn.net/luo2pei4321/article/details/125839250一.本地调试   1.dlvdebugsourcefile      dlvdebugmeng.go      2.dlve......