经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Go语言 » 查看文章
golang中接口对象的转型两种方式
来源:jb51  时间:2021/10/11 17:56:44  对本文有异议

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

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

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

2. 方式二:

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

示例:

  1. package main
  2. import (
  3. "fmt"
  4. "math"
  5. )
  6. type shape interface {
  7. perimeter() int
  8. area() int
  9. }
  10. type rectangle struct {
  11. a int // 长
  12. b int // 宽
  13. }
  14. func (r rectangle) perimeter() int {
  15. return (r.a + r.b) * 2
  16. }
  17. func (r rectangle) area() int {
  18. return r.a * r.b
  19. }
  20. type circle struct {
  21. radios int
  22. }
  23. func (c circle) perimeter() int {
  24. return 2 * c.radios * int(math.Round(math.Pi))
  25. }
  26. func (c circle) area() int {
  27. return int(math.Round(math.Pow(float64(c.radios), 2) * math.Pi))
  28. }
  29. func getType(s shape) {
  30. if i, ok := s.(rectangle); ok {
  31. fmt.Printf("长方形的长:%d,长方形的宽是:%d\n", i.a, i.b)
  32. } else if i, ok := s.(circle); ok {
  33. fmt.Printf("圆形的半径是:%d\n", i.radios)
  34. }
  35. }
  36. func getType2(s shape) {
  37. switch i := s.(type) {
  38. case rectangle:
  39. fmt.Printf("长方形的长:%d,长方形的宽是:%d\n", i.a, i.b)
  40. case circle:
  41. fmt.Printf("圆形的半径是:%d\n", i.radios)
  42. }
  43. }
  44. func getResult(s shape) {
  45. fmt.Printf("图形的周长是:%d,图形的面积是:%d\n", s.perimeter(), s.area())
  46. }
  47. func main() {
  48. r := rectangle{a: 10, b: 20}
  49. getType(r)
  50. getResult(r)
  51. c := circle{radios: 5}
  52. getType2(c)
  53. getResult(c)
  54. }

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

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

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

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

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

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号