类型断言即判断一个变量是不是某个类型的实例,这个经常用在判断接口的类型,基本的格式:

y, ok := x.(type)

  上面的语句用于判断变量x是不是type类型,有两种结果:

    1. x是type类型的变量,那么返回x的副本赋值给y,ok的值为true
    2. x不是type类型的变量,那么返回一个空的stuct,ok的值为false

  注意判断x是不是type类型的变量时,那么  type类型的结构(struct)  就必须实现  x类型的接口,否则进行类型断言是不合法的。

  看一个完整的示例:

package main

import "fmt"

type human interface {
say()
}
type stu struct {
name string
} func (s stu) say() {
fmt.Println("his name is ", s.name)
}
func hide(h human) {
//进行类型断言
//前提是stu的结构类型(struct)必须实现 h类型的接口
if p, ok := h.(stu); ok {
fmt.Print("是stu的结构类型 ")
fmt.Println(p.name, ok)
} else {
fmt.Println("不是stu的结构类型")
}
}
func main() {
var h human
h = stu{name: "xyz"}
h.say()
hide(h)
}

  可以在进行类型断言的func那里传入一个空接口(空接口本身没有任何方法,则所有结构都实现了空接口,此时空接口类似其他语言中的超类Object),所以可以有更多的类型断言,根据传入类型进行不同操作,还可以使用 switch   type ,

  示例如下:

func hide(x interface{}) {
switch v := x.(type) {
case stu:
fmt.Println(v.name)
default:
fmt.Println("none")
}
}

  注意上面的是 x.(type),并没有指定type类型,反而让系统去猜x到底是什么样的类型。

  

Golang的类型断言的更多相关文章

  1. golang 类型断言的学习

    在php中有一个 serialize() 函数 可以把数组序列化成字符串进行存储和传输 如果想反序列化这种字符串,在php中只需要一个简单的unserialize() 函数就可以完成了.但是在gola ...

  2. [golang] go的typeswitch guard(类型区别)语法和type assertion(类型断言)语法

    最近在实现golang,看到个go的特性语法: typeswitch guard. typeswitch guard语法如下: package main import "fmt" ...

  3. golang类型断言

    一.介绍 类型断言,由于接口是一般类型,不知道具体类型,如果要转成具体类型,就需要使用类型断言 例子: package main import "fmt" func main(){ ...

  4. [Go] golang类型断言

    类型断言有点像向下转型,接口类型转到具体的实现实例类型上类型断言是一个使用在接口值上的操作.语法上它看起来像x.(T)被称为断言类型,这里x表示一个接口的类型和T表示一个类型 package main ...

  5. Golang之interface(多态,类型断言)

    多态用法 package main //一种事物的多种形态,都可以按照统一的接口进行操作 //多态 import ( "fmt" "math/rand" &qu ...

  6. [Golang学习笔记] 06 程序实体3 类型断言和类型转换

    类型断言: 语法:<目标类型的值>,<布尔参数> := <表达式>.( 目标类型 ) // 安全类型断言<目标类型的值> := <表达式>. ...

  7. golang学习笔记:Interface类型断言详情

    原文链接:https://www.2cto.com/kf/201712/703563.html 1. 用于判断变量类型 demo如下: switch t := var.(type){ case str ...

  8. golang type 和断言 interface{}转换

    摘要 类型转换在程序设计中都是不可避免的问题.当然有一些语言将这个过程给模糊了,大多数时候开发者并不需要去关 注这方面的问题.但是golang中的类型匹配是很严格的,不同的类型之间通常需要手动转换,编 ...

  9. Go的类型断言解析

    经常地我们对一个接口值的动态类型是不确定的,如方法的形参为接口类型时,此时就需要检验它是否符合我们需要的类型.类型断言是一个使用在接口值上的操作.断言类型的语法:x.(T),这里x表示一个接口的类型, ...

随机推荐

  1. git笔记(1)-搭建

    1. git下载 地址:https://git-scm.com/download/win 2. 安装(略) 3. 创建本地仓库 方法一:(1) 打开git bash here, 进入相应目录(打算创建 ...

  2. vue原理简介

    写vue也有一段时间了,对vue的底层原理虽然有一些了解,这里总结一下. vue.js中有两个核心功能:响应式数据绑定,组件系统.主流的mvc框架都实现了单向数据绑定,而双向绑定无非是在单向绑定基础上 ...

  3. bootstrap的datepicker在选择日期后调用某个方法

    bootstrap的datepicker在选择日期后调用某个方法 2016-11-08 15:14 1311人阅读 评论(0) 收藏 举报 首先感谢网易LOFTER博主Ivy的博客,我才顿悟了问题所在 ...

  4. rem实现自适应

    总结一下,rem实现自适应:用rem代替px,配合媒体查询设置font-size:n%. 首先,px是死的.若一律用px,那就会大的显得小,小的屏幕显得大.其次,rem是活的,通过设置字体大小可以引起 ...

  5. JSP内置九个对象Request请求对象

    jsp内置对象是什么呢? 例如Java语言使用一个对象之前需要实例化(也就是所说的new一个对象),创建对象这个过程有点麻烦,所以在jsp中提供了一些内置对象,用来实现很多jsp应用.在使用内置对象时 ...

  6. linux 软连接创建 压缩解压缩 linux的dns服务相关

    linux软连接创建 注意用绝对路径,语法如下 ln -s 目标文件绝对路径 软连接名字绝对路径 ln -s /小护士.txt /tmp/hs.txt 修改linux的PS1变量,命令提示符变量 PS ...

  7. chrome postman插件手动安装

    注:转自 http://blog.csdn.net/u010246789/article/details/51481134 1.下载postman插件,可以自己到网上下载,也可以点击http://do ...

  8. 如何用chrome扩展将网页变成黑底白字,用以保护视力

    不知道有没有科学依据,自己感觉黑底白字对视力好些,于是动手加个chrome扩展: 第一步:建个文件夹,名称比如叫changeColor; 第二步:在changeColor文件夹中建三个文件:manif ...

  9. ubuntu18.04 递归批量删除op_test_xml/ 目录下 .pyc后缀的文件

    find op_test_xml/ -type f -name "*.pyc" -exec rm -f {} \;

  10. 在Ubuntu18.04上使用Anaconda(python3.7)环境中安装tensorflow1.13.1

    由于清华镜像源迟迟没有更新tensorflow1.13.1导致python3.7不能使用tensorflow 这里有一个解决方法 管理员模式打开(一定要管理员模式 不然会导致权限不足) 输入 pip ...