golang类型断言
一、介绍
类型断言,由于接口是一般类型,不知道具体类型,如果要转成具体类型,就需要使用类型断言
例子:
package main
import "fmt" func main(){
var x interface{} var b2 float64 = 1.1
x = b2 //空接口,可以接收任意值 //类型断言
y := x.(float64)
// y2 := x.(float32) //不匹配会报错
fmt.Printf("type:%T 值:%v",y,y)
// fmt.Printf("type:%T 值:%v",y2,y2) } ##结果####
type:float64 值:1.1
断言时带上检测机制,如果失败不报错
例子:
package main
import "fmt" func main(){
var x interface{} var b2 float64 = 1.1
x = b2 //空接口,可以接收任意值 //类型断言
if y,ok := x.(float32); ok {
fmt.Printf("type:%T 值:%v",y,y) }else{
fmt.Println("error!")
}
fmt.Println("end")
} ###结果####
error!
end
二、类型断言最佳实践
例子 一:
package main
import "fmt" //定义一个usb接口
type Usb interface {
//声明了两个没有实现的方法
Start()
Stop()
} type Phone struct {
name string
} //让 Phone 实现 Usb 接口的方法
func (p Phone) Start() {
fmt.Println("手机开始工作。。。")
}
func (p Phone) Stop() {
fmt.Println("手机停止工作。。。")
}
func (p Phone) Call() {
fmt.Println("手机 在打电话..")
} type Camera struct {
name string
}
//让 Camera 实现 Usb 接口的方法
func (c Camera) Start() {
fmt.Println("相机开始工作。。。")
}
func (c Camera) Stop() {
fmt.Println("相机停止工作。。。")
}
type Computer struct {
} func (computer Computer) Working(usb Usb) {
usb.Start()
//如果 usb 是指向 Phone 结构体变量,则还需要调用 Call 方法
//类型断言
if phone, ok := usb.(Phone); ok {
phone.Call()
}
usb.Stop()
}
func main() {
//定义一个 Usb 接口数组,可以存放 Phone 和 Camera 的结构体变量
//这里就体现出多态数组
var usbArr [3]Usb
usbArr[0] = Phone{"vivo"}
usbArr[1] = Phone{"小米"}
usbArr[2] = Camera{"尼康"}
//遍历 usbArr
//Phone 还有一个特有的方法 call(),请遍历 Usb 数组,如果是 Phone 变量,
//除了调用 Usb 接口声明的方法外,还需要调用 Phone 特有方法 call. =》类型断言
var computer Computer
for _, v := range usbArr{
computer.Working(v)
fmt.Println()
}
} ####结果####
手机开始工作。。。
手机 在打电话..
手机停止工作。。。 手机开始工作。。。
手机 在打电话..
手机停止工作。。。 相机开始工作。。。
相机停止工作。。。
例子 二:
package main
import "fmt" //编写一个函数,判断输入参数的类型
func GetType(items... interface{}) {
for index,x := range items {
switch x.(type) {
case bool:
fmt.Printf("第%v个参数是bool类型,值是%v\n",index,x)
case int:
fmt.Printf("第%v个参数是int类型,值是%v\n",index,x)
case string:
fmt.Printf("第%v个参数是string类型,值是%v\n",index,x)
default:
fmt.Printf("第%v个参数类型不是上面的,值是%v\n",index,x)
} } } func main(){
var n1 int = 1
var n2 string = "dd"
var n3 bool = false
GetType(n1,n2,n3) } ###结果###
第0个参数是int类型,值是1
第1个参数是string类型,值是dd
第2个参数是bool类型,值是false
golang类型断言的更多相关文章
- golang 类型断言的学习
在php中有一个 serialize() 函数 可以把数组序列化成字符串进行存储和传输 如果想反序列化这种字符串,在php中只需要一个简单的unserialize() 函数就可以完成了.但是在gola ...
- [Go] golang类型断言
类型断言有点像向下转型,接口类型转到具体的实现实例类型上类型断言是一个使用在接口值上的操作.语法上它看起来像x.(T)被称为断言类型,这里x表示一个接口的类型和T表示一个类型 package main ...
- [golang] go的typeswitch guard(类型区别)语法和type assertion(类型断言)语法
最近在实现golang,看到个go的特性语法: typeswitch guard. typeswitch guard语法如下: package main import "fmt" ...
- Golang的类型断言
类型断言即判断一个变量是不是某个类型的实例,这个经常用在判断接口的类型,基本的格式: y, ok := x.(type) 上面的语句用于判断变量x是不是type类型,有两种结果: x是type类型的变 ...
- Golang之interface(多态,类型断言)
多态用法 package main //一种事物的多种形态,都可以按照统一的接口进行操作 //多态 import ( "fmt" "math/rand" &qu ...
- [Golang学习笔记] 06 程序实体3 类型断言和类型转换
类型断言: 语法:<目标类型的值>,<布尔参数> := <表达式>.( 目标类型 ) // 安全类型断言<目标类型的值> := <表达式>. ...
- golang学习笔记:Interface类型断言详情
原文链接:https://www.2cto.com/kf/201712/703563.html 1. 用于判断变量类型 demo如下: switch t := var.(type){ case str ...
- Go的类型断言解析
经常地我们对一个接口值的动态类型是不确定的,如方法的形参为接口类型时,此时就需要检验它是否符合我们需要的类型.类型断言是一个使用在接口值上的操作.断言类型的语法:x.(T),这里x表示一个接口的类型, ...
- Go语言的类型转换和类型断言
https://my.oschina.net/chai2010/blog/161418 https://studygolang.com/articles/9335 类型转换.类型断言和类型切换 ht ...
随机推荐
- KnockoutJS-快速入门
虽然在WPF中接触过MVVM模式,可是刚开始在Web中接触到Knockout.JS让我大吃一惊,简化了好多工作量,原来可能需要一大堆的JS脚本完成的工作量,被释放许多.接触KnockoutJS一年多了 ...
- 为什么使用 Redis 及其产品定位
一:传统 MySQL+ Memcached 架构遇到的问题 实际 MySQL 是适合进行海量数据存储的,通过 Memcached 将热点数据加载到 cache,加速访问,很多公司都曾经使用过这样的架构 ...
- 图片与Base64的转换
图片转为Base64 // 图片转化成base64字符串 public static String GetImageStr() {// 将图片文件转化为字节数组字符串,并对其进行Base64编码处理 ...
- 命令提示符-bash-4.1$错误解决
有时候在使用用户登陆Linux系统时会发现,命令行提示符成了:-bash-4.1$,不显示用户名,路径信息. 原因:用户家目录里面与环境变量有关的文件被删除所导致的 也就是这俩文件:.bash_pro ...
- org.springframework.beans.factory.BeanDefinitionStoreException: Failed to read candidate component
原因:jdk1.8和你所用框架(spring+springMVC+mybatis)中spring框架的版本有问题, 解决方法:更换jdk1.7或者1.6
- python函数练习题
- 移动端video不全屏播放
<div class="m-video"> <video x5-playsinline="" playsinline="" ...
- Spring Boot使用Maven打包替换资源文件占位符
在Spring Boot开发中,通过Maven构建项目依赖是一件比较舒心的事,可以为我们省去处理冲突等大部分问题,将更多的精力用于业务功能上.近期在项目中,由于项目集成了其他外部系统资源文件,需要根据 ...
- SQLServer之创建事务序列化
创建事务序列化注意事项 语法:set transaction isolation level serialize; 序列化会指定下列内容: 语句不能读取已由其他事务修改但尚未提交的数据. 任何其他事务 ...
- windows server 2012 R2 部署AD域服务
一.部署AD域控制器 首先,我们检查第一台已经安装Windows Server 2012 R2的服务网络的相关配置,确定的服务器IP地址.子网掩码.默认网关的参数如下,由于该服务器既要充当ADDC角色 ...