深入理解go中interface机制

 更新时间:2025年08月07日 10:54:52   作者:考虑考虑  
本文主要介绍了深入理解go中interface机制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

前言

go的interface是一组method的集合,不关心属性(数据),只关心行为(方法)。具体使用中你可以自定义自己的 struct,并提供特定的 interface 里面的 method 就可以把它当成 interface 来使用

interface使用

package main

import "fmt"

type Speaker interface {
    Say() string
}

type User struct {
    id   int64 `UserService`
    name string
}

func (user *User) Say() string {
    return "aaaa"
}

func (user *User) Say1() string {
    return "aaaa1"
}

func main() {
    var user = &User{
       1, "aa",
    }
    var s Speaker
    s = user
    fmt.Println(s.Say())
}

func speak(s Speaker) {
    fmt.Println(s.Say())
}

也可以定义多个interface

package main

import "fmt"

type Speaker interface {
    Say() string
}

type Speaker1 interface {
    Say1() string
}

type User struct {
    id   int64 `UserService`
    name string
}

func (user *User) Say() string {
    return "aaaa"
}

func (user *User) Say1() string {
    return "aaaa1"
}

func main() {
    var user = &User{
       1, "aa",
    }
    var (
       s  Speaker
       s1 Speaker1
    )
    s = user
    s1 = user
    fmt.Println(s.Say())
    fmt.Println(s1.Say1())
}

func speak(s Speaker) {
    fmt.Println(s.Say())
}

也可以使用接口的组合

package main

import "fmt"

type Speaker interface {
    Speak() string
}

type Mover interface {
    Move() string
}

type Hello interface {
    Speaker
    Mover
}

type User struct {
    Name string
}

func (a User) Speak() string {
    return "aaa"
}

func (a User) Move() string {
    return "bbb"
}

func main() {
   
    user := User{Name: "aa"}

   
    showRobot(&user)
}

func showRobot(r Hello) {
    fmt.Println("Speak:", r.Speak())
    fmt.Println("Move:", r.Move())
}

单值类型断言

package main

import "fmt"

func main() {
    var i interface{} = "Hello, World!"

    // 使用单值类型断言
    s := i.(string)
    fmt.Println(s) // 输出: Hello, World!

    // 如果类型不匹配,会抛出 panic
    n := i.(int)
    fmt.Println(n)
}

结果为

类型判断

package main

import "fmt"

func describe(i interface{}) {
    switch v := i.(type) {
    case int:
       fmt.Println("整型: ", v)
    case string:
       fmt.Println("字符串:", v)
    case bool:
       fmt.Println("布尔值:", v)
    default:
       fmt.Println("未知类型: ", v)
    }
}

func main() {
    describe(66)
    describe("aa")
}

输出结果为

总结

interface是 Go 语言中实现多态性和代码复用的重要机制,能够让你编写更加通用和灵活的代码,可以利用它更好编码

到此这篇关于深入理解go中interface机制的文章就介绍到这了,更多相关go interface机制内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Go语言中使用flag包对命令行进行参数解析的方法

    Go语言中使用flag包对命令行进行参数解析的方法

    这篇文章主要介绍了Go语言中使用flag包对命令行进行参数解析的方法,文中举了一个实现flag.Value接口来自定义flag的例子,需要的朋友可以参考下
    2016-04-04
  • 一文带你深入了解Golang中的参数传递机制

    一文带你深入了解Golang中的参数传递机制

    值传递和引用传递是编程语言中两种主要的参数传递方式,决定了函数调用过程中实参如何影响形参以及函数内部对形参的修改是否会影响到原始实参,下面就跟随小编一起深入了解下golang中参数传递机制吧
    2024-01-01
  • 详解Go 并发

    详解Go 并发

    这篇文章主要介绍了Go 并发的相关资料,帮助大家更好的理解和学习go语言,感兴趣的朋友可以了解下
    2020-09-09
  • golang高并发系统限流策略漏桶和令牌桶算法源码剖析

    golang高并发系统限流策略漏桶和令牌桶算法源码剖析

    这篇文章主要介绍了golang高并发系统限流策略漏桶和令牌桶算法源码剖析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • GO中使用谷歌GEMINI模型任务代码实例

    GO中使用谷歌GEMINI模型任务代码实例

    这篇文章主要为大家介绍了GO中使用谷歌GEMINI模型任务代码实例探究,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-01-01
  • 使用Lumberjack+zap进行日志切割归档操作

    使用Lumberjack+zap进行日志切割归档操作

    这篇文章主要介绍了使用Lumberjack+zap进行日志切割归档操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • Go语言的反射机制详解

    Go语言的反射机制详解

    本文详细讲解了Go语言的反射机制,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • 详解Golang中零拷贝的原理以及实践

    详解Golang中零拷贝的原理以及实践

    零拷贝技术相信大家都有所耳闻,但是本文不仅会讲述零拷贝技术的原理,并将从实际代码出发,看看零拷贝技术在golang中的应用,现在让我们开始吧
    2023-07-07
  • Go语言常见数据结构的实现详解

    Go语言常见数据结构的实现详解

    这篇文章主要为大家学习介绍了Go语言中的常见数据结构(channal、slice和map)的实现,文中的示例代码简洁易懂,需要的可以参考一下
    2023-07-07
  • Go 值传递与引用传递的方法

    Go 值传递与引用传递的方法

    这篇文章主要介绍了Go 值传递与引用传递的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-03-03

最新评论