golang中接口对象的转型两种方式

 更新时间:2021年10月11日 15:25:46   作者:专职  
这篇文章主要介绍了golang中接口对象的转型方式,大家都知道接口对象的转型有两种方式,文中通过示例代码给大家介绍的非常详细,需要的朋友可以参考下

接口对象的转型有两种方式:

1. 方式一:instance,ok:=接口对象.(实际类型)

  如果该接口对象是对应的实际类型,那么instance就是转型之后对象,ok的值为true
  配合if...else if...使用

2. 方式二:

  接口对象.(type)
  配合switch...case语句使用

示例:

package main
 
import (
    "fmt"
    "math"
)
 
type shape interface {
    perimeter() int
    area() int
}
 
type rectangle struct {
    a int  // 长
    b int  // 宽
}
func (r rectangle) perimeter() int {
    return (r.a + r.b) * 2
}
func (r rectangle) area() int {
    return r.a * r.b
}
 
type circle struct {
    radios int
}
func (c circle) perimeter() int {
    return 2 * c.radios * int(math.Round(math.Pi))
}
func (c circle) area() int {
    return int(math.Round(math.Pow(float64(c.radios), 2) * math.Pi))
}
 
func getType(s shape) {
    if i, ok := s.(rectangle); ok {
        fmt.Printf("长方形的长:%d,长方形的宽是:%d\n", i.a, i.b)
    } else if i, ok := s.(circle); ok {
        fmt.Printf("圆形的半径是:%d\n", i.radios)
    }
}
 
func getType2(s shape) {
    switch i := s.(type) {
    case rectangle:
        fmt.Printf("长方形的长:%d,长方形的宽是:%d\n", i.a, i.b)
    case circle:
        fmt.Printf("圆形的半径是:%d\n", i.radios)
    }
}
 
func getResult(s shape) {
    fmt.Printf("图形的周长是:%d,图形的面积是:%d\n", s.perimeter(), s.area())
}
 
func main() {
    r := rectangle{a: 10, b: 20}
    getType(r)
    getResult(r)
 
    c := circle{radios: 5}
    getType2(c)
    getResult(c)
}

上面的例子使用的是方式一,如果要使用方式2,可以将getType()函数改为:

func getType(s shape) {
 switch i := s.(type) {
 case rectangle:
  fmt.Printf("图形的长:%.2f,图形的宽:%.2f \n", i.a, i.b)
 case triangle:
  fmt.Printf("图形的第一个边:%.2f,图形的第二个边:%.2f,图形的第三个边:%.2f \n",i.a,i.b,i.c)
 case circular:
  fmt.Printf("图形的半径:%.2f \n",i.radius)
 }
}

PS:上面求三角形面积使用了海伦公式求三角形的面积,公式为:

三角形的面积=平方根[三角形周长的一半×(三角形周长的一半减去第一个边)×(三角形周长的一半减去第二个边)×(三角形周长的一半减去第三个边)]

到此这篇关于golang中接口对象的转型的文章就介绍到这了,更多相关golang接口对象内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Golang Socket Server自定义协议的简单实现方案

    Golang Socket Server自定义协议的简单实现方案

    这篇文章主要介绍了Golang Socket Server自定义协议的简单实现方案,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • golang语言实现的文件上传与文件下载功能示例

    golang语言实现的文件上传与文件下载功能示例

    这篇文章主要介绍了golang语言实现的文件上传与文件下载功能,结合实例形式分析了Go语言实现的文件传输相关操作技巧,需要的朋友可以参考下
    2020-02-02
  • Go语言学习otns示例分析

    Go语言学习otns示例分析

    这篇文章主要为大家介绍了Go语言学习otns示例分析详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • Go1.21新增slices包的用法详解

    Go1.21新增slices包的用法详解

    Go 1.21新增的 slices 包提供了很多和切片相关的函数,可以用于任何类型的切片,这篇文章主要来和大家介绍一下slices包中相关函数的用法,需要的可以参考一下
    2023-08-08
  • Goland的设置与配置全过程

    Goland的设置与配置全过程

    这篇文章主要介绍了Goland的设置与配置全过程,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • go语言多线程操作实现

    go语言多线程操作实现

    多线程是一种使程序能够并行处理多个任务的技术,Go语言通过goroutine和channel提供了一种相比传统线程更轻量级、易于管理的并发实现方式,本文就来介绍一下go语言多线程操作实现,感兴趣的可以了解一下
    2024-11-11
  • Golang中使用Mqtt的方法示例

    Golang中使用Mqtt的方法示例

    本文介绍了Golang中使用paho.mqtt.golang库实现MQTT客户端与服务器的连接、订阅和消息收发,具有一定的参考价值,感兴趣的可以了解一下
    2025-02-02
  • 关于golang 字符串 int uint int64 uint64 互转问题

    关于golang 字符串 int uint int64 uint64&

    这篇文章主要介绍了golang 字符串 int uint int64 uint64 互转,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-01-01
  • golang搭建静态web服务器的实现方法

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

    这篇文章主要介绍了golang搭建静态web服务器的实现方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-08-08
  • 一文详解Go语言中Mutex互斥锁

    一文详解Go语言中Mutex互斥锁

    Golang中的Mutex互斥锁是一种常用的并发控制机制,用于保护共享资源的访问,在本文中,我们将深入探讨Mutex互斥锁的原理、日常使用、锁结构以及运行机制,需要的朋友可以参考下
    2023-12-12

最新评论