十个示例带你深入了解Go语言中的接口

 更新时间:2023年02月17日 11:33:31   作者:TtrOps  
这篇文章主要是通过十个简单的示例带大家深入了解一下Go语言中接口的使用,文中的示例代码简洁易懂,具有一定的学习价值,需要的可以了解一下

1.空接口既然可以存储任意类型的值,那么从空接口获取到的值是否可以直接使用?看下面栗子

package main

import (
 "fmt"
)

var a interface{}
var b interface{}

func main() {
 a = 1024
 b = 100
 res := a + b
 fmt.Println(res)
}

报错:

invalid operation: operator + not defined on a (variable of type interface{}) (exit status 2)

程序报错的原因:因为空接口的类型是不可以直接使用的,需要警告类型断言转换方可使用。

2.这次我们使用类型断言来将接口类型转成int类型

package main

import (
 "fmt"
)

var a interface{}
var b interface{}

func main() {
 a = 1024
 b = 100
 val1, res1 := a.(int)
 fmt.Println(val1, res1)

 val2, res2 := b.(int)
 fmt.Println(val2, res2)

 //val1和val2接收转换后的值,res1和res2是类型断言的状态(成功或失败),断言成功是true,反之false
}

输出:

1024 true
100 true

3.类型断言新姿势:当使用一个值接受断言结果时,则会直接返回断言后的值

package main

import (
 "fmt"
)

var a interface{}
var b interface{}

func main() {
 a = 1024
 b = 100
    //类型断言转换
 a1 := a.(int)
 b1 := b.(int)
    //转换后进行相加,就不会报错了
 res := a1 + b1
 fmt.Println(res)

}

4.体会一下使用类型断言转换失败的快感

package main

import (
 "fmt"
 "log"
)

var a interface{}

func main() {
 a = 1024
 if a1, r := a.(string); r {
  fmt.Println(a1)
 } else {
  log.Fatalln("类型断言转换失败")
 }
}

输出:

2022/10/25 10:30:48 类型断言转换失败

变量a存储值是整型,视图使用类型断言将其转换为字符串,结果报错了,这么玩是不行的,玩不起。

5.类型断言+switch实现数据类型判断

package main

import (
 "fmt"
)

func TestFunc(value interface{}) {
 switch value.(type) {
 case int:
  fmt.Printf("value=%v Type Int\n", value)
 case float32:
  fmt.Printf("value=%v Type Float32\n", value)
 case float64:
  fmt.Printf("value=%v Type Float64\n", value)
 case string:
  fmt.Printf("value=%v Type string\n", value)
 }
}

func main() {
 TestFunc("hello")
 TestFunc(100)
 TestFunc(89.12)
}

输出:

value=hello Type string
value=100 Type Int
value=89.12 Type Float64

6.还可以将接口类型转换成另一个接口类型,下面的栗子是将A接口转换成B接口

package main

import (
 "fmt"
)

type A interface{}

type B interface{}

func main() {
 var a A = 100
 b := a.(B)
 fmt.Println(b)
}

在之前的栗子,都是将接口类型转换成基本的数据类型,而这个栗子是将一个自定义的接口类型转换成另一个自定义的接口类型。

7.还可以将接口类型转成指针类型,看下面的栗子

package main

import "fmt"

func main() {
    //定义接口类型的变量ainter
 var ainter interface{}
 num := 100
 ainter = &num //将地址赋给接口变量

 v, r := ainter.(*int)
 fmt.Println(v, r)
}

上面的栗子中,使用类型断言将接口类型转成了int指针类型

8.接口可以嵌套吗?实战告诉你

package main

import "fmt"

type action1 interface {
 insert()
}

type action2 interface {
 delete()
}

type actionInterface interface {
 action1
 action2
 query()
}

type Db struct {
 Data string
}

func (d Db) insert() {
 fmt.Print("插入数据...", d.Data)
}

func (d Db) delete() {
 fmt.Print("删除数据...", d.Data)
}

func (d Db) query() {
 fmt.Print("查询数据...", d.Data)
}

func main() {
 d := Db{Data: "hello"}
 d.query()
 d.delete()
 d.insert()
}

通过上面的实战,接口是可以嵌套的,注意了,只有实现接口中所有的方法(含所有嵌套接口里的所有方法),那么才算是真正实现了接口。

9.实现error接口中的Error方法,来玩一个自定义错误类型的栗子

package main

import (
 "fmt"
)

type AddError struct {
 ErrorMsg string
}

func (m AddError) Error() string {
 return fmt.Sprintf("Add error %v", m.ErrorMsg)
}

func add(a int, b int) (int, error) {
 if a == 0 || b == 0 {
  errinfo := fmt.Sprintf("a=%v, b=%v", a, b)
  return 0, AddError{ErrorMsg: errinfo}
 } else {
  return a + b, nil
 }
}

func main() {
 res, err := add(8, 0)
 fmt.Println(res, err)
}

上面的栗子中,已经隐式的实现了error接口中的Error方法

10.如果不玩自定义的错误类型,也可以直接使用errors.New方法返回一个错误信息

package main

import (
 "errors"
 "fmt"
)

func add(a int, b int) (int, error) {
 if a == 0 || b == 0 {
  return 0, errors.New("不能为0")
 } else {
  return a + b, nil
 }
}

func main() {
 res, err := add(9, 1)
 fmt.Println(res, err)
}

到此这篇关于十个示例带你深入了解Go语言中的接口的文章就介绍到这了,更多相关Go语言 接口内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Golang中使用Mqtt的方法示例

    Golang中使用Mqtt的方法示例

    本文介绍了Golang中使用paho.mqtt.golang库实现MQTT客户端与服务器的连接、订阅和消息收发,具有一定的参考价值,感兴趣的可以了解一下
    2025-02-02
  • Golang实现断点续传功能

    Golang实现断点续传功能

    这篇文章主要为大家详细介绍了Golang实现断点续传、复制文件功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-07-07
  • Go语言中更优雅的错误处理

    Go语言中更优雅的错误处理

    Go语言中的错误处理是一个被大家经常拿出来讨论的话题(另外一个是泛型)。篇文章我们将讨论一下如何在现行的 Golang 框架下提供更友好和优雅的错误处理。需要的朋友们可以参考借鉴,下面来一起看看吧。
    2017-02-02
  • golang搭建静态web服务器的实现方法

    golang搭建静态web服务器的实现方法

    这篇文章主要介绍了golang搭建静态web服务器的实现方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-08-08
  • Golang使用bcrypt实现密码加密和校验的操作代码

    Golang使用bcrypt实现密码加密和校验的操作代码

    bcrypt可以用于数据库中的用户密码保存,相比md5而言更加的安全可靠,这篇文章主要介绍了Golang使用bcrypt实现密码加密和校验的操作代码,需要的朋友可以参考下
    2024-05-05
  • 利用Golang实现TCP连接的双向拷贝详解

    利用Golang实现TCP连接的双向拷贝详解

    公司中遇到了一个使用golang编写的agent程序,所以这篇文章主要给大家介绍了关于利用Go如何实现TCP连接的双向拷贝的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考,下面随着小编来一起看看吧。
    2017-09-09
  • golang连接kafka消费进ES操作

    golang连接kafka消费进ES操作

    这篇文章主要介绍了golang连接kafka消费进ES操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • Go项目中添加生成时间与版本信息的方法

    Go项目中添加生成时间与版本信息的方法

    本文主要介绍了Go项目中添加生成时间与版本信息的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • go语言用八百行代码实现一个JSON解析器

    go语言用八百行代码实现一个JSON解析器

    这篇文章主要为大家介绍了go语言用八百行代码实现一个JSON解析器实例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • go语言通过结构体生成json示例解析

    go语言通过结构体生成json示例解析

    这篇文章主要为大家介绍了go语言通过结构体生成json示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪
    2022-04-04

最新评论