Go 的类型转换常常让人有点迷,有两种形式的"类型转换":

  • Type(obj) :这种形式的类型转换要求 obj 对象的类型和 Type 是等价类型,即实现了相同的方法
  • obj.(Type) :这种形式用于向下转型,即接口对象转结构体对象,所以 obj 必须是一个接口对象 , 这种形式在 Go 中一般叫做类型断言

代码示例:

package mainimport "fmt"type Animal interface {GetName() string
}// Cat 实现 Animal 接口
type Cat struct {name string
}
func (c *Cat)GetName() string {return "I'm cat : " + c.name
}// Dog 实现 Animal 接口
type Dog struct {name string
}
func (d *Dog)GetName() string {return "I'm dog : " + d.name
}func main() {cat := Cat{name: "hello kitty",}animal := Animal(&cat) // 结构体转接口,括号里需要传递一个 *Cat 类型而不能是 Cat 类型,因为是 *Cat 类型实现了 GetName() 方法,而不是 Cat 类型fmt.Println(animal.GetName())dog1 := Dog(cat) // 结构体之间进行转换,括号里需要传递一个 Cat 类型,因为 Cat = Dog, *Cat = *Dogfmt.Println(dog1.GetName())dog2 := (*Dog)(&cat)fmt.Println(dog2.GetName())  // 如上所述,*Cat = *Dogcat2, ok := animal.(*Cat) // 类型断言,左边必须是一个接口类型的对象,当接口对象的实际类型和要转换的目标类型匹配时,转换成功,否则失败if ok {fmt.Println("convert animal to cat - " + cat2.GetName())} else {fmt.Println("can not convert animal to cat")}dog3 , ok := animal.(*Dog) // 类型断言,接口对象的实际类型和要转换的目标类型不匹配if ok {fmt.Println("convert animal to dog - " + dog3.GetName())} else {fmt.Println("can not convert animal to dog")}}

运行结果:

I'm cat : hello kitty
I'm dog : hello kitty
I'm dog : hello kitty
convert animal to cat - I'm cat : hello kitty
can not convert animal to dog

Go 两种形式的“类型转换”相关推荐

  1. Python基础day05【函数(函数传参的两种形式、函数形参)、拆包、引用、可变与不可变类型、引用做函数参数注意点】

    视频.源码.课件.软件.笔记:超全面Python基础入门教程[十天课程]博客笔记汇总表[黑马程序员]    目录 0.复习 1.函数传参的两种形式[掌握] 2.函数形参 2.1.缺省参数(默认参数) ...

  2. c语言中的普通字符包括什么,【判断题】C语言中的字符常量通常有两种形式:普通字符和转义字符。...

    [判断题]C语言中的字符常量通常有两种形式:普通字符和转义字符. 更多相关问题 ---Can you speak French?---Yes, but only____.A.a littleB.lit ...

  3. SQL 关于apply的两种形式cross apply 和 outer apply

    SQL 关于apply的两种形式cross apply 和 outer apply 阅读目录 SQL 关于apply的两种形式cross apply 和 outer apply Sql学习第四天--S ...

  4. 【算法笔记】莫比乌斯反演(包含定理,两种形式的证明及入门经典模板)

    整理的算法模板合集: ACM模板 目录 一.莫比乌斯反演 二.几个概念和定理 三.两种形式的莫比乌斯反演证明 四.POJ 3904 Sky Code(入门例题) 一.莫比乌斯反演 学习笔记,我是看这个 ...

  5. java语言的多态性及特点_Java中的方法的多态性有两种形式:( )和( )。_学小易找答案...

    [填空题]已知函数 ,则微分 . [填空题]. [单选题]71.用转动小滑板法车圆锥时产生( )误差的原因是小滑板转动角度计算错误. [单选题] [填空题]Java中的方法的多态性有两种形式:( )和 ...

  6. include的两种形式、CPP的搜索路径

    文章目录 1 include的两种形式.CPP的搜索路径 1 include的两种形式.CPP的搜索路径 #include "stdio.h" //1.源文件所在路径//2.-I选 ...

  7. 注意力机制的两种形式

    注意力机制的两种形式: 一.additive attention(tensorflow里面称为Bahdanau attention)        这种机制的定义引用了论文https://arxiv. ...

  8. java类型转换答案,在java中支持两种类型的类型转换,自动类型转换和强制类型转换。父类转化为子类需要强制转换。...

    在java中支持两种类型的类型转换,自动类型转换和强制类型转换.父类转化为子类需要强制转换. 更多相关问题 计算机病毒通过()传染扩散得极快,危害最大. 当一个现象的数量由小变大,另一个现象的数量相反 ...

  9. MyBatis collection的两种形式——MyBatis学习笔记之九

    与association一样,collection元素也有两种形式,现介绍如下: 一.嵌套的resultMap 实际上以前的示例使用的就是这种方法,今天介绍它的另一种写法.还是以教师映射为例,修改映射 ...

最新文章

  1. android服务器压力测试,Android压力测试Monkey工具
  2. 使用DOS命令找到占用80端口的程序,关闭该程序
  3. 吴恩达深度学习课程deeplearning.ai课程作业:Class 4 Week 3 Car detection
  4. 机房配电柜、配电箱在安装时应该注意哪些“禁忌”?
  5. 解决yarn build时报错:内存溢出FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed
  6. C#数据本地存储方案之SQLite
  7. day9-继承式多线程
  8. wps数据匹配怎么做_【VK技术分享】数据安全怎么做—静态数据的识别和治理
  9. python调试蓝牙适配器_我写了一个查看Android手机的蓝牙模块是否开启的代码。在AVD上调试,因为是电脑,没有蓝牙适配器,可是...
  10. 基于MaxCompute+PAI的用户增长方案实践
  11. TimeUnit类中的sleep() 和Thread.sleep()
  12. 为什么要使用多层开发?
  13. 关于opengl 编程指南中使用几何着色器渲染毛发的分析
  14. S3C2440 ADC采样光敏电阻传感器驱动
  15. 百度网盘视频加速代码
  16. Learn OpenCV之Heatmap
  17. Thread小练习(网图下载)
  18. android 百度地图 itemizedoverlay,[008] 百度地图API之ItemizedOverlay的使用(Android) .
  19. c语言判断两个单词是否为变位词,C++变位词问题分析
  20. pytest接口自动化测试框架 | 用python代码测试接口

热门文章

  1. 0基础学python看什么书-0基础学Python入门书籍应该看什么?
  2. python学生管理系统-python实现学生成绩管理系统
  3. python实现简单的api接口-Python实现简单的API接口
  4. python课程与c+课程有什么不同-C和Python我该先学什么?
  5. python网上编程课程-什么是Python编程课程
  6. python3教程-Python3教程
  7. Linux如何让命令提示符显示完整的路径
  8. Opengl-面剔除(一种优化方式)
  9. xor java_java基于密匙的xor加解密
  10. @TransactionalEventListener与@Async实现事务提交后异步处理事件