golang接口用法浅谈

这篇具有很好参考价值的文章主要介绍了golang接口用法浅谈。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

类型接口

Go不是面向对象的语言,在go里通过不同的结构体实现同一组公共接口这种组合的形式实现多态,类似C++的类和虚函数

定义类型接口(Interface Definition):
  • 使用 type 关键字定义接口,指定接口的方法签名。

  • 方法签名由方法的名称、参数列表和返回值组成,但不包含方法体。

  • 接口可以包含零个或多个方法。

示例代码:

type MyInterface interface {
   Method1() // 无参数和返回值的方法
   Method2(param1 int) // 接受一个 int 参数,没有返回值的方法
   Method3() string // 没有参数,返回一个 string 的方法
}
实现类型接口(Interface Implementation):
  • 为了使一个类型实现某个接口,只需要实现接口中定义的所有方法即可。

  • 类型实现接口的方法签名必须与接口定义的方法签名完全一致。

  • 如果类型没有实现接口的所有方法,将不能将该类型的实例赋值给接口类型的变量。

示例代码:

type MyType struct{}

func (t MyType) Method1() {
   // 实现 Method1() 方法的具体逻辑
}

func (t MyType) Method2(param1 int) {
   // 实现 Method2() 方法的具体逻辑
}

func (t MyType) Method3() string {
   // 实现 Method3() 方法的具体逻辑
   return "Hello"
}

// MyType 类型实现了 MyInterface 接口的所有方法
var myVar MyInterface = MyType{}

通过以上步骤,我们就可以定义和使用类型接口。在实际开发中,类型接口常用于实现多态、依赖注入和代码解耦等场景。通过使用类型接口,可以编写具有灵活性和扩展性的代码,同时提供了更好的可测试性和模块化。

需要注意的是,在 Go 语言中,类型的接口实现是隐式的,即类型无需显式地声明实现了哪个接口。只要类型实现了接口中定义的所有方法,就可以将该类型的实例赋值给接口类型的变量,以达到多态的效果。并且,一个类型也可以同时实现多个接口。

空接口

空接口为interface{}any用来表示任意类型的值。和类型接口有很大区别。

存储任意类型的值

通过将值赋给空接口类型的变量,可以存储任意类型的值,类似于其他语言中的通用类型或对象类型。

var data interface{}
data = 42       // 可以存储整数
data = "Hello"  // 可以存储字符串
data = true     // 可以存储布尔值
作为函数参数

使用空接口作为函数的参数,可以接收任意类型的参数。

func PrintValue(value interface{}) {
   fmt.Println(value)
}

PrintValue(42)        // 输出 42
PrintValue("Hello")   // 输出 Hello
PrintValue(true)      // 输出 true
类型断言

可以使用类型断言来将空接口转换为具体类型,并在需要使用具体类型的地方进行类型操作。

value := getData() // 假设 getData() 返回一个空接口类型的值

if str, ok := value.(string); ok {
   // 如果 value 是 string 类型,则执行相应的操作
   fmt.Println("Value is a string:", str)
} else if num, ok := value.(int); ok {
   // 如果 value 是 int 类型,则执行相应的操作
   fmt.Println("Value is an int:", num)
} else {
   // 处理其他类型的情况
}

需要注意的是,在使用空接口时,由于没有类型约束,需要在进行类型转换时进行类型安全的检查,以避免出现运行时错误。

总结来说,空接口是 Go 语言中一种特殊的接口类型,用于存储任意类型的值和接收任意类型的参数。通过类型断言,可以将其转换为具体类型并进行相应的操作。空接口在需要处理不同类型的值时提供了灵活性,但也需要注意处理类型转换时的安全性。文章来源地址https://www.toymoban.com/news/detail-695012.html

到了这里,关于golang接口用法浅谈的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Golang内置类型和函数及接口、Init函数和main函数

    1.1. 值类型: 1.2. 引用类型:(指针类型) Go 语言拥有一些不需要进行导入操作就可以使用的内置函数。它们有时可以针对不同的类型进行操作,例如:len、cap 和 append,或必须用于系统级的操作,例如:panic。因此,它们需要直接获得编译器的支持。 go语言中 init 函数用于包

    2024年01月25日
    浏览(35)
  • 关于axios请求java接口中的@RequestParam、@PathVariable及@RequestBody不同接参类型的用法

    一、前端传json对象,后端指定接收json对象中的哪个参数。 (1)前端请求 (2)后端接口(接参方式) 二、axios使用restful规范的get请求,后端使用@PathVariable接参 后端接口路径+属性值;注意!!!路径后面有反斜杠/,注意不要写漏了,不然value就会变成路径的一部分,请求路径就会

    2024年02月15日
    浏览(50)
  • 再申明一次:面向对象编程不是面向人编程

    这个方法就我自己调用,所以就没封装... 这个RPC方法只有我自己写的代码会调用,日 期参数就用String了。因为我知道我会传“yyyy-MM-dd”格式的日期。 为了使用spring事务,我就把这两个插入数据的操作放到一个方法里了。 这个方法名还好吧,其他地方不调用。 这个返回值用

    2024年02月19日
    浏览(42)
  • Golang 的面向对象

    duck typing golang中实现某个接口不需要像其它语言使用 implemet 去继承实现,而是只要你的结构体包含接口所需的方法即可 nil不一定是空接口 初始化的接口是等于 nil的,接口底层其实有一个type来记录原始的struct,当某个struct赋值给接口时,接口会在type中记录该类型(就算是

    2024年02月13日
    浏览(39)
  • 【是C++,不是C艹】 类与对象 | 认识面向对象 | 访问限定符 | 封装 | this指针

    💞💞 欢迎来到 Claffic 的博客 💞💞  👉  专栏: 《是C++,不是C艹》👈 前言: 在C++入门之后,就要进入C++的第一个核心:类与对象,这期带大家认识认识面向对象编程,访问限定符,封装以及 this 指针。 注: 你最好是学完了C语言,并学过一些初阶的数据结构。 (没有目

    2024年02月07日
    浏览(44)
  • 【Golang】案例为基浅谈Go的变量与常量

    📓推荐网站(不断完善中):个人博客 📌个人主页:个人主页 👉相关专栏:CSDN专栏、个人专栏 🏝立志赚钱,干活想躺,瞎分享的摸鱼工程师一枚 在上一篇文章中,博主对于Go语言中的一些基本语法与变量的初步定义做了初步介绍。 在这篇文章主要是对于变量的进一步应用

    2024年01月18日
    浏览(46)
  • 浅谈Golang等多种语言转数组成字符串

    目录 Python 一维列表转字符串 二维列表转字符串 多维列表转字符串 Golang 一维数组的遍历打印 二维数组的遍历打印  Java 一维容器的直接打印 二维容器的直接打印 普通数组的转化 C++ 一维容器的遍历 1. to_string() 2. stringstream 二维容器的遍历 简要小结 python语言中没有普通的数

    2024年02月03日
    浏览(44)
  • [pytorch]torch.cuda用法以及判断显卡是不是存在问题

    常见用法: torch.cuda.is_available() # 查看是否有可用GPU torch.cuda.device_count() # 查看GPU数量 torch.cuda.get_device_capability(device) # 查看指定GPU容量 torch.cuda.get_device_name(device) # 查看指定GPU名称 torch.cuda.empty_cache() # 清空程序占用的GPU资源 torch.cuda.manual_seed(seed) # 设置随机种子 torch.cuda.manu

    2024年02月10日
    浏览(53)
  • 浅谈postman和jmeter的用法与区别

    前阶段做了一个小调查,发现软件测试行业做功能测试和接口测试的人相对比较多。在测试工作中,有高手,自然也会有小白,但有一点我们无法否认,就是每一个高手都是从小白开始的,所以今天我们就来谈谈一大部分人在做的接口测试,小白变高手也许你只差这一次深入

    2024年01月24日
    浏览(44)
  • 【技术】浅谈 Thymeleaf 中 th:field 的用法

    SpringBoot 项目中 Thymeleaf 表单页面填充数据是非常常见的。最常见的当属修改页面。从表格的操作列点击修改进入到修改页面填充要修改的数据。这一类的需求中,普通输入框的数据填充是很简单的,但是单选框、复选框、下拉框等组件的数据填充可能要稍稍动动脑子。你会怎

    2024年02月14日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包