Go类型断言

news2024/11/19 10:28:36

在Go语言中类型断言的语法格式如下:
value, ok := x.(T) 类型断言失败,不会发生panic。根据ok判断是否成功
或者
value:= x.(T) 类型断言失败,会发生panic
其中,x 表示一个接口的类型,T 表示一个具体的类型(也可为接口类型)。
该断言表达式会返回 x 的值(也就是 value)和一个布尔值(也就是 ok),可根据该布尔值判断 x 是否为 T 类型:

  • 如果断言的类型T是一个具体类型,类型断言检查x的动态类型是否和T相同。如果这个检查成功了,类型断言的结果是x的动态值,它的类型是T。
  • 如果断言的类型T是一个接口类型,类型断言检查是否x的动态类型满足T。如果这个检查成功了,动态值没有获取到;这个结果仍然是一个有相同动态类型和值部分的接口值,但是结果为类型T。换句话说,对一个接口类型的类型断言改变了类型的表述方式,改变了可以获取的方法集合(通常更大),但是它保留了接口值内部的动态类型和值的部分。
  • 无论 T 是什么类型,如果 x 是 nil 接口值,类型断言都会失败。
    举例
package main

import (
    "fmt"
)

type i1 interface {
    hello()
}

type i2 interface {
    hello()
    hello2()
}

type i1St struct {
}

type i2St struct {
}

func (s i1St) hello() {
}

func (s i2St) hello() {
}

func (s i2St) hello2() {
}

func main() {
    var myI1 i1
    var myI2 i2
    var myI1St i1St
    var myI2St i2St

    myI1 = myI1St
    myI2 = myI2St

    a, aOk := myI1.(i1)
    fmt.Printf("a, aOk := myI1.(i1) is return %v,%t,type is %T\n", a, aOk, a)
    b, bOk := myI1.(i2)
    fmt.Printf("b, bOk := myI1.(i2) is return %v,%t,type is %T\n", b, bOk, a)
    c, cOk := myI2.(i1)
    fmt.Printf("c, cOk := myI2.(i1) is return %v,%t,type is %T\n", c, cOk, a)
    d, dOk := myI2.(i1)
    fmt.Printf("d, dOk := myI2.(i1) is return %v,%t,type is %T\n", d, dOk, a)
}

结果如下:

a, aOk := myI1.(i1) is return {},true,type is main.i1St
b, bOk := myI1.(i2) is return <nil>,false,type is main.i1St
c, cOk := myI2.(i1) is return {},true,type is main.i1St
d, dOk := myI2.(i1) is return {},true,type is main.i1St

在这里插入图片描述
如果相反地断言的类型T是一个接口类型,然后类型断言检查是否x的动态类型满足T。例子

var w io.Writer
w = os.Stdout
rw := w.(io.ReadWriter) // success: *os.File has both Read and Write
w = new(ByteCounter)
rw = w.(io.ReadWriter) // panic: *ByteCounter has no Read method

w和rw都持有os.Stdout,因此它们都有一个动态类型*os.File,但是变量w是一个io.Writer类型,只对外公开了文件的Write方法,而rw变量还公开了它的Read方法。

判断接口是否为nil

var i interface{}
res, ok := i.(interface{})
fmt.Printf("%v - %t,type is %T\n", res, ok, res)

结果如下:

<nil> - false,type is <nil>

如果需要区分多种类型,可以使用 type switch 断言,这个将会比一个一个进行类型断言更简单、直接、高效。

package main

import (
    "fmt"
)

func main() {
    var a int
    a = 10
    switchType(a)

    var i interface{}
    switchType(i)

    switchType(10.5)
}

func switchType(a interface{}) {
    switch a.(type) {
    case int:
        fmt.Println("the type is int")
    case string:
        fmt.Println("the type is string")
    case float64:
        fmt.Println("the type is float")
    case nil:
        fmt.Println("the type is nil")
    default:
        fmt.Println("unknown type")
    }
}

结果如下:

the type is int
the type is nil
the type is float

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/543168.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

希望所有计算机专业同学都知道这些老师

C语言教程——翁凯老师、赫斌 翁恺老师是土生土长的浙大码农&#xff0c;从本科到博士都毕业于浙大计算机系&#xff0c;后来留校教书&#xff0c;一教就是20多年。 翁恺老师的c语言课程非常好&#xff0c;讲解特别有趣&#xff0c;很适合初学者学习。 郝斌老师的思路是以初学…

进口常用除氟树脂品牌

随着经济的发展&#xff0c;半导体、表面处理、采矿等行业产生了大量的高氟废水&#xff0c;由于高氟水对人体健康具有较大危害&#xff0c;含氟污水治理己经引起了广泛的关注。 多年以前&#xff0c;含氟废水的处理&#xff0c;一般下游污水处理厂通过合并多股废水&#xff0…

html监听界面被隐藏或显示

vue相比于小程序和uni-app 显然少了两个有点用的生命周期 onShow 应用被展示 onHide 应用被隐藏 但其实这个 要做其实也很简单 JavaScript中 有对应的visibilitychange事件可以监听 我们Html参考代码如下 <!DOCTYPE html> <html lang"en"> <head>…

在GB28181项目中,调用eXosip_register_send_register函数并且返回值为-2或者-3的含义是什么

一、eXosip_register_send_register返回-2的原因&#xff1a; 在GB28181项目中&#xff0c;调用eXosip_register_send_register函数并且返回值为-2通常表示注册发送失败。该返回值的含义是注册请求被拒绝&#xff0c;可能是由于身份验证失败或其他原因导致的。 以下是可能导致…

人车混合机器人实现身体平衡功能

1. 功能说明 在R035c样机上安装一个六轴陀螺仪传感器&#xff0c;本文示例将实现机器人身体平衡功能。当用手把机器人人形部分摆动到左侧时&#xff0c;人形部分会自动恢复到中间&#xff1b;当用手把机器人人形部分摆动到右侧时&#xff0c;人形部分也会自动恢复到中间。 ​ 2…

简历照片底色要求是什么?怎么修改证件照底色?

准备一份完美的简历是找到工作的关键之一。其中一个重要的组成部分是照片。照片可以让我们的简历更加生动活泼&#xff0c;同时也可以为面试官在面试时提供更好的印象。但是&#xff0c;如果在照片中使用了错误的背景色&#xff0c;那么简历可能会被忽略或被视为不专业。因此&a…

数据结构与算法——求二叉树叶子数量求二叉树高度

递归特性求树的高度流程图 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string.h> #include <stdlib.h> //二叉树的节点结构体 struct BinaryNode {char ch;//显示的字母struct BinaryNode * lChild;//左孩子struct BinaryNode * rChil…

代码随想录训练营Day45| 70. 爬楼梯 (进阶) 322. 零钱兑换 279.完全平方数

目录 学习目标 学习内容 70. 爬楼梯 &#xff08;进阶&#xff09; 322. 零钱兑换 279.完全平方数 学习目标 70. 爬楼梯 &#xff08;进阶&#xff09; 322. 零钱兑换 279.完全平方数 学习内容 70. 爬楼梯 &#xff08;进阶&#xff09; problems/0070.爬楼梯完全背包版本…

用ChatGPT创作小说,根据不同情境设定做多线推进

小说根据不同情境设定做多线推进 我们在读小说、看影视剧时&#xff0c;经常会有这样那样的遗憾&#xff1a;这里主角怎么没有吻上去呢&#xff1f;为什么不能给个大团圆结局呢&#xff1f;再仔细找找就能发现宝藏了啊&#xff01;等等等等……在网剧领域&#xff0c;已经开始…

gRPC-go参数功能介绍总结目录

本篇文章是gRPC-go框架的参数功能介绍总结 本篇文章的目的&#xff1a; 查看快速方便查询gRPC-go都有哪些参数可用&#xff01;可以快速的查询到相关案例&#xff01; gRPC-go版本是v1.30.0 可以从下面的地址下载gRPC-go版本 链接: https://pan.baidu.com/s/1za02qnUII78n-…

数据钻取,详细数据一览无遗!

钻取数据源 路径 仪表盘设计 >> 统计表 功能简介 图表配置新增「钻取数据源」功能。 钻取数据源是一个对全局图表添加的功能&#xff0c;使得用户点击统计表的图表对维度统计的图表形状进行数据源查看。 使用场景 用户使用饼图统计不同团队的任务时&#xff0c;期望…

沃尔玛、Shopee、亚马逊测评养号如何最大程度提高listing产品销量

打造一条优质的、有吸引力的listing对于每个做跨境电商的都很重要&#xff0c;那沃尔玛也不例外。产品的listing写得越好&#xff0c;就有可能获得更高的曝光和更高的转化&#xff01;今天就跟大家讲一下沃尔玛listing优化的几大因素。Listing的优化不仅仅只有关键词的优化、文…

盘点盛产 Web3 项目的全球七大高校:哪些知名项目从中诞生?

这七所高校分别是哈佛大学、斯坦福大学、加州大学伯克利分校、麻省理工学院、清华大学、北京大学、浙江大学。 作为当前社会最前沿的技术领域之一&#xff0c;Web3 正在吸引越来越多顶级高校校友的加入&#xff0c;例如 Blur、Scroll、Opensea、Aleo、STEPN 等都由斯坦福等一线…

Linux如何部署爬虫

在 Linux 上部署爬虫需要先安装必要的软件和环境&#xff0c;然后编写脚本或选择相应的爬虫框架来完成实际操作。以下是可行的部署过程&#xff1a; 1、安装必要的软件和环境 在 Debian/Ubuntu 系统中使用以下命令安装 Python、pip 和 Git 等软件&#xff1a; sudo apt updat…

JDBC连接GaussDB云数据库操作示例

目录 一、实验环境 二、登录华为云创建测试库表 1、登录GaussDB云数据库 2、建库、建表,用于测试 3、新增普通角色&#xff08;用户&#xff09;用于登录及访问测试&#xff08;可选&#xff09; 4、获取对应的公网IP 三、创建java工程 1、创建java工程 2、添加jar包 …

bug:生产问题,Golang解决csv文件用excel打开中文乱码问题

bug&#xff1a;Golang解决csv文件用excel打开中文乱码问题 1 场景及分析 场景&#xff1a;今天在生成csv文件之后&#xff0c;测试发现用office和wps打开乱码 分析&#xff1a;经过测试之后发现使用记事本打开不乱码&#xff0c;同时用记事本打开之后另存为ANSI编码之后用off…

详解java中的日期与时间;新旧API对比;各种日期格式转换

一、基本概念 1、本地时间 不同的时区&#xff0c;在同一时刻&#xff0c;本地时间是不同的。全球一共分为24个时区&#xff0c;伦敦所在的时区称为标准时区&#xff0c;其他时区按东&#xff0f;西偏移的小时区分&#xff0c;北京所在的时区是东八区。 2、时区 GMT GMT08:0…

Linux基础指令(含英文注释)

前言&#xff1a; Linux下一切皆文件。 文件 文件内容 文件属性。 操作文件 对内容的操作 对属性的操作。 主要的文件是目录文件dir&#xff0c;和普通文件。&#xff08;还有其它的&#xff09; 一、ls/pwd 1、ls 对于目录&#xff0c;该命令列出该目录下的所有子目…

建站笔记——跟小枫社长学建站

该文章为看视频时的一些笔记&#xff0c;完整版可以看小枫社长的视频 小枫社长视频原址 一、租云服务器 学生或者新人可以免费试用几个月 腾讯云阿里云 阿里云对控制台进行了全面升级&#xff0c;在首页使用了新的设计方案&#xff0c;云服务器ECS位置如下&#xff0c;点击左…

浙大数据结构第六周之初识图

题目详情&#xff1a;06-图1 列出连通集 给定一个有N个顶点和E条边的无向图&#xff0c;请用DFS和BFS分别列出其所有的连通集。假设顶点从0到N−1编号。进行搜索时&#xff0c;假设我们总是从编号最小的顶点出发&#xff0c;按编号递增的顺序访问邻接点。 输入格式: 输入第1…