Golang的类型断言
类型断言即判断一个变量是不是某个类型的实例,这个经常用在判断接口的类型,基本的格式:
y, ok := x.(type)
上面的语句用于判断变量x是不是type类型,有两种结果:
- x是type类型的变量,那么返回x的副本赋值给y,ok的值为true
- 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的类型断言的更多相关文章
- golang 类型断言的学习
在php中有一个 serialize() 函数 可以把数组序列化成字符串进行存储和传输 如果想反序列化这种字符串,在php中只需要一个简单的unserialize() 函数就可以完成了.但是在gola ...
- [golang] go的typeswitch guard(类型区别)语法和type assertion(类型断言)语法
最近在实现golang,看到个go的特性语法: typeswitch guard. typeswitch guard语法如下: package main import "fmt" ...
- golang类型断言
一.介绍 类型断言,由于接口是一般类型,不知道具体类型,如果要转成具体类型,就需要使用类型断言 例子: package main import "fmt" func main(){ ...
- [Go] golang类型断言
类型断言有点像向下转型,接口类型转到具体的实现实例类型上类型断言是一个使用在接口值上的操作.语法上它看起来像x.(T)被称为断言类型,这里x表示一个接口的类型和T表示一个类型 package main ...
- 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 ...
- golang type 和断言 interface{}转换
摘要 类型转换在程序设计中都是不可避免的问题.当然有一些语言将这个过程给模糊了,大多数时候开发者并不需要去关 注这方面的问题.但是golang中的类型匹配是很严格的,不同的类型之间通常需要手动转换,编 ...
- Go的类型断言解析
经常地我们对一个接口值的动态类型是不确定的,如方法的形参为接口类型时,此时就需要检验它是否符合我们需要的类型.类型断言是一个使用在接口值上的操作.断言类型的语法:x.(T),这里x表示一个接口的类型, ...
随机推荐
- web测试笔记
WEB兼容性测试 一.客户端兼容性 1.浏览器的兼容性测试 a.内核角度 Tridnt内核:代表作IE.腾讯.遨游.世界之窗等 Gecko内核:代表作Firefox webkit内核:代表作Safar ...
- vs2010 2013 2015 有用各种功能插件
https://blog.csdn.net/daydayup_chf/article/details/80803221
- Docker卸载镜像
Linux服务器Docker卸载某个镜像: 首先输入命令docker images查看当前docker下有多少镜像: 1 [root@iZwz9a191mdam4di3dozk3Z ~]# docke ...
- 引用变量 php面试总结1
(1)PHP引用变量 概念:不同的变量名,访问同一个变量内容,使用& 知识点: 使用php函数 (a)memory_get_usage() 查看内存使用情况 eg // 定义一个变量 $a = ...
- SQL INNER JOIN 关键字
SQL INNER JOIN 关键字 在表中存在至少一个匹配时,INNER JOIN 关键字返回行. INNER JOIN 关键字语法 SELECT column_name(s) FROM table ...
- python获取数据网页数据并创建文件夹保存(基于python3.6)
from urllib.parse import urljoin import urllib.request from bs4 import BeautifulSoup import os impor ...
- centos7下安装docker(15.2跨主机网络-overlay)
为支持容器跨主机通信,Docker提供了overlay driver,使用户可以创建基于VxLAN的overlay网络.VxLAN可将二层数据封装到UDP进行传输,VxLAN提供与VLAN相同的以太网 ...
- jenkins进行andriod打包,上传蒲公英
环境:macos jenkins sdk gradle 1.构建操作注意: mac电脑上 选择invoke gradle task数值是:clean 2.再创建一个task 然后进行gradle加参数 ...
- A. Many Equal Substrings(水题)
思路: 直接比较橘色框里的取第一次相等,即可. #include<iostream> #include<string> using namespace std; string ...
- 一、Oracle 安装
一.oracle的安装和链接1.oracle数据库的后台服务: a.Oracle11ghomeTNSListener:数据库服务器的监听程序,负责监听客户端的链接请求 b.OracleServiceO ...