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极简入门教程(四):编写第一个项目

    Golang极简入门教程(四):编写第一个项目

    这篇文章主要介绍了Golang极简入门教程(四):编写第一个项目,本文讲解了workspace、包路径、第一个可执行命令等内容,需要的朋友可以参考下
    2014-10-10
  • Go泛型的理解和使用小结

    Go泛型的理解和使用小结

    泛型是一种非常强大的编程技术,可以提高代码的复用性和可读性,通过泛型容器和类型参数化,Go语言中的泛型可以实现更加灵活和通用的编程,提高代码的复用性和可维护性,本文给大家介绍Go泛型的理解和使用,感兴趣的朋友一起看看吧
    2023-12-12
  • 使用Go语言实现心跳机制

    使用Go语言实现心跳机制

    心跳最典型的应用场景是是探测服务是否存活,这篇文章主要来和大家介绍一下如何使用Go语言实现一个简单的心跳程序,感兴趣的可以了解下
    2024-01-01
  • GoFrame框架Scan类型转换实例

    GoFrame框架Scan类型转换实例

    这篇文章主要为大家介绍了GoFrame框架Scan类型转换的实例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • Golang中定时器的陷阱详解

    Golang中定时器的陷阱详解

    这篇文章主要给大家介绍了关于Golang中定时器陷阱的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用golang具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-09-09
  • Go语言非main包编译为静态库并使用的示例代码

    Go语言非main包编译为静态库并使用的示例代码

    本文以Windows为例,介绍一下如何将Go的非main包编译为静态库,用户又将如何使用。通过实际项目创建常规工程,通过示例代码给大家介绍的非常详细,需要的朋友参考下吧
    2021-07-07
  • Golang中的path/filepath包用法

    Golang中的path/filepath包用法

    这篇文章主要介绍了Golang中的path/filepath包用法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • Go并发控制WaitGroup的使用场景分析

    Go并发控制WaitGroup的使用场景分析

    WaitGroup,可理解为Wait-Goroutine-Group,即等待一组goroutine结束,本文通过具体场景结合实际例子给大家介绍使用WaitGroup控制的实现方法,感兴趣的朋友跟随小编一起看看吧
    2021-07-07
  • 深入string理解Golang是怎样实现的

    深入string理解Golang是怎样实现的

    这篇文章主要为大家介绍了深入string理解Golang是怎样实现的原理详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • go web 预防跨站脚本的实现方式

    go web 预防跨站脚本的实现方式

    这篇文章主要介绍了go web 预防跨站脚本的实现方式,文中给大家介绍XSS最佳的防护应该注意哪些问题,本文通过实例代码讲解的非常详细,需要的朋友可以参考下
    2021-06-06

最新评论