golang中的类型断言

2023-10-27

goLang有类型转换,类型断言,类型切换

1.接口类型断言

类型断言就是将接口类型的值(x),装换成类型(T),成功则返回 T 的实例。格式为:

x.(T) // 不安全,会造成panic,程序中断
v := x.(T) // 不安全,会造成panic,程序中断
v, ok: = x.(T) // 推荐写法

类型断言的必要条件就是x是接口类型,非接口类型的x不能做类型断言:

var i int=10
v:=i.(int) //错误 i不是接口类型,无法使用接口断言

T可以是非接口类型,如果想断言合法,则T应该实现x的接口
T也可以是接口,则x的动态类型也应该实现接口T

var x interface{}=7  //x的动态类型为int,值为7
i:=x.(int)           // i的类型为int ,值为7

type I interface {m()}
var y I

s:=y.(string)      //非法: string 没有实现接口 I (missing method m)
r:=y.(io.Reader)   //y如果实现了接口io.Reader和I的情况下,  r的类型则为io.Reader

类型断言如果非法,运行时就会出现错误,为了避免这种错误,可以使用一下语法:
v,ok:=x.(T)
ok代表类型断言是否合法,如果非法,ok则为false,这样就不会出现panic了

在断言的时候,值类型和对应的指针类型是两个类型。

2.接口类型切换 type switch

类型切换用来比较类型而不是对值进行比较,type switch它用于检测的是值x的类型T是否匹配某个类型.

格式如下,类似类型断言,但是括号内的不是某个具体的类型,而是单词type:

 switch ins := x.(type){
  
 }

ins 为对应类型的实例。

type switch语句中可以有一个简写的变量声明,这种情况下,等价于这个变量声明在每个case clause 隐式代码块的开始位置。

如果case clause只列出了一个类型,则变量的类型就是这个类型,否则就是原始值的类型。

假设下面的例子中的x的类型为x interface{}:

switch i := x.(type) {
case nil:
  printString("x is nil") // i的类型是 x的类型 (interface{})
case int:
  printInt(i) // i的类型 int
case float64:
  printFloat64(i) // i的类型是 float64
case func(int) float64:
  printFunction(i) // i的类型是 func(int) float64
case bool, string:
  printString("type is bool or string") // i的类型是 x (interface{})
default:
  printString("don't know the type") // i的类型是 x的类型 (interface{})
}

也许你已经看到上面的例子中有一个case clause中的类型是nil,它用来匹配x为nil的interface{}的情况。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

golang中的类型断言 的相关文章

  • 【Golang入门】Golang第一天心得

    生活所迫 入门一下Go 很奇葩的第一点 接口 package main import fmt 定义一个接口 type Shape interface Area float64 定义一个矩形类型 type Rectangle struct W
  • golang之跨语言ipc通信

    1 golang之跨语言ipc通信 文章目录 1 golang之跨语言ipc通信 1 1 unix domain Socket unix域套接字 介绍 1 2 IPC SOCKET通信 1 2 1 函数及地址定义介绍 1 2 2 UNIX
  • go字符串详解

    文章目录 摘要 1 byte和rune类型 2 字符串 string 3 练习 反转字符串 摘要 go字符串结构体包含 指向底层存储数组的指针 字符串长度 字符串按utf 8将字符编码成二进制数 然后存储在byte数组中 因为utf 8编码
  • golang: Logrus实现日志打印

    Github https github com sirupsen logrus golang标准库的日志框架非常简单 仅仅提供了print panic和fatal三个函数 对于更精细的日志级别 日志文件分割以及日志分发等方面并没有提供支持
  • Go语言入门【09】结构体

    结构体 相比于Java 在Go语言中没有类的概念 但是多了结构体 结构体与Java中的类很像 是表示一系列同一类型或不同类型的数据构成的数据集合 例如可以将学生抽象成一个结构体 每一个学生有以下属性 Name 姓名 Age 年龄 Gende
  • Go语言实现区块链与加密货币-Part3(交易优化,单机模拟多节点通信)

    交易 二 在这个系列文章的一开始 我们就提到了 区块链是一个分布式数据库 不过在之前的文章中 我们选择性地跳过了 分布式 这个部分 而是将注意力都放到了 数据库 部分 到目前为止 我们几乎已经实现了一个区块链数据库的所有元素 今天 我们将会
  • 基于Go语言实现简易Web应用

    目录 前言 Go语言特点 写在使用Go语言实现Web应用前面 创建Web服务器 声明一个结构体操作 加入中间件的使用 使用静态文件服务器 最后 前言 在编程语言中 近几年问世的几个新语言都是非常不错的 比如Go Python Rust等等
  • 有哪些不错的 Golang 开源项目?

    目前人在字节做 Go 开发 寻找 Golang 开源项目学习目的可能是 想学习或者提高自己对 Go 项目的组织和编排能力 想学习 Go 项目的框架设计 想在一些 Go 语法上细节的优化和进阶 我推荐两个项目 一 tinode 这是一个开源的
  • 【go语言开发】Minio基本使用,包括环境搭建,接口封装和代码测试

    本文主要介绍go语言使用Minio对象存储 首先介绍搭建minio 创建bucket等 然后讲解封装minio客户端接口 包括但不限于 上传文件 下载 获取对象url 最后测试开发的接口 文章目录 前言 Minio docker安装mini
  • go-zero 开发入门-加法客服端示例

    定义 RPC 接口文件 接口文件 add proto 的内容如下 syntax proto3 package add 当 protoc gen go 版本大于 1 4 0 时需加上 go package 否则编译报错 unable to d
  • go-zero开发入门之gateway深入研究1

    创建一个 gateway 示例 main go package main import flag fmt gateway middleware github com zeromicro go zero core conf github co
  • go-zero开发入门-API网关鉴权开发示例

    本文是 go zero开发入门 API网关开发示例 一文的延伸 继续之前请先阅读此文 在项目根目录下创建子目录 middleware 在此目录下创建文件 auth go 内容如下 鉴权中间件 package middleware impor
  • “go mod tidy”之错误“not a valid zip file”

    执行 go mod tidy 时 遇到如下错误 rpc imports github com zeromicro go zero zrpc imports github com zeromicro go zero zrpc resolver
  • GoLong的学习之路,进阶,Viper(yaml等配置文件的管理)

    本来有今天是继续接着上一章写微服务的 但是这几天有朋友说 再写Web框架的时候 遇到一个问题 就是很多的中间件 redis 微信 mysql mq 的配置信息写的太杂了 很不好管理 希望我能写一篇有管理配置文件的 所以这篇就放到今天写吧 微
  • Go 语言中切片的使用和理解

    切片与数组类似 但更强大和灵活 与数组一样 切片也用于在单个变量中存储相同类型的多个值 然而 与数组不同的是 切片的长度可以根据需要增长和缩小 在 Go 中 有几种创建切片的方法 使用 datatype values 格式 从数组创建切片
  • 协程-单线程内的异步执行

    1 仿协程实例 不同事件依次顺序执行 coding utf 8 import time def calculate 1 step event name for index in range step print This is s even
  • go语言实现文件夹上传前后端代码案例

    go语言实现文件夹上传前后端代码案例 前端用于上传的测试界面 如果上传的文件夹有子文件要遍历子文件夹创建出子文件夹再进行拷贝 需要获取文件名和对应的路径 将文件的相对路径和文件对象添加到FormData中 这几行代码很关键 for let
  • Golang拼接字符串性能对比

    g o l a n g golang g o l an g
  • 这套Go语言开发框架组合真的非常高效

    我尝试过很多框架 从Django Flask和Laravel到NextJS和SvelteKit 到目前为止 这是我唯一可以使用的不会让我感到疯狂或者放弃项目的堆栈 框架 我喜欢所有这些框架 但我只是不太适应它们的设计方式 实际上 我是一个弱
  • 【go语言】结构体数据填充生成md错误码文件

    这里使用pongo2这个模版引擎库进行md文件渲染 GitHub flosch pongo2 Django syntax like template engine for Go package main import fmt github

随机推荐

  • lua-nginx-module

    Name ngx http lua module Embed the power of Lua into Nginx HTTP Servers This module is a core component of OpenResty If
  • 一款超级简洁的个人博客系统搭建教程(附源码)

    开发环境 IDEA jdk1 8 mysql8 33 开发框架 springboot 1 首先 确保已安装 Git 和 IntelliJ IDEA 如果你还没有安装 Git 请前往官网下载并安装 Git 2 打开 IntelliJ IDEA
  • 线程生命周期与线程状态

    每个Java程序都有一个主线程 即main 方法对应的线程 要实现多线程 必须在主线程中创建新的线程 每个线程要经历新生 new 就绪 runnable 运行 running 阻塞 blocked 死亡 dead 五种状态 线程从新生到死亡
  • js文件中再引入js文件的方法

    原文地址 http hi baidu com maojianlw item f0cfc9dcefc8ac12e0f46fe0 在我们的网站项目中 经常会出现这种场景 我们有一个或几个通用的js代码文件 比如专门进行字符串处理的string
  • sqli-labs/Less-27

    这一关 首先我们先去判断一下注入类型是否为数字型 然后我担心空格被过滤 所以将空格都换成了 0b 输入如下 id 1 0band 0b1 2 回显如下 从这可以看出逻辑运算符是没有被过滤掉的 并且这个注入点属于字符型注入 然后判断是单引还是
  • 详解Scrapy Cluster中Kafka与Redis的消息生产和消费

    相对于Scrapy框架 增加了Kafka和Redis模块的Scrapy Cluster要复杂的多 因此要搞清楚各大模块之间是如何工作的 就至关重要了 在Scrapy Cluster框架中 有三大系统模块 Kafka Redis Scrapy
  • type-c 介绍

    自从Apple发布了新MacBook 就一堆人在说USB Type C 我来从硬件角度解析下这个USB Type C 顺便解惑 特色 尺寸小 支持正反插 速度快 10Gb 这个小是针对以前电脑上的USB接口说的 实际相对android机上的
  • 七夕 H5小游戏,人脸融合搭载颜值评分

    七夕节因为其独特的文化属性成为各家大显神通的战场 人工智能时代 AI 七夕的玩法也越来越多 人脸融合 颜值评分这些有趣的黑科技都多少与大家见过面 但是将两个有趣的点结合到一起还是第一次 七夕 x H5小游戏 x 黑科技 近日 旷视科技的Fa
  • 揭开正则表达式的神秘面纱

    正则表达式30分钟入门教程 http deerchao net tutorials regex regex htm 揭开正则表达式的神秘面纱 http www regexlab com zh regref htm 原创文章 转载请保留或注明
  • angular:ng-star-inserted作用

    参考 javascript Angular 5 adds ng star inserted in some classes what is that Stack Overflow BrowserAnimationsModule来使用的 控制
  • chatgpt赋能python:如何用Python输出HelloWorld?

    如何用Python输出Hello World 作为初学者入门Python编程 输出Hello World是一个最基本的练习 那么 究竟该如何用Python输出Hello World呢 环境准备 在开始之前 需要先安装Python 并确保环境
  • (亲试有效)u盘制作启动盘后空间容量变小解决方法

    问题 大家有可能使用U盘来制作启动盘的需要 但是使用过来发现U盘的空间容量变小了 1G 2G 4G 8G 16G等变成了几百M都有可能 但是无论你再怎么格式化 还是找不回原来的空间容量 怎么办呢 自己经历过 亲身体验有效 方法简单 所以写出
  • 百度交易中台之账房系统架构浅析

    导读 百度交易中台作为集团移动生态战略的基础设施 面向收银交易与清分结算场景 为赋能业务提供高效交易生态搭建 目前支持百度体系内多个产品线 主要包含 小程序 地图打车 百家号 招财猫 好看视频等 本文主要介绍了百度交易中台的商户财务对账相关
  • 关于获取时间戳函数gettimeofday的用法小结

    Linux下gettimeofday函数 2020年6月8日16点33分 函数头文件及原型为 include
  • 常用LaTex指令

    目录 表格 跨行 列 表格 图片 双栏图片 单栏图片 多图 左中右 字体 加粗 斜体 公式 加粗 向量 花体 只适用于大写字母 引用参考文献 引用图片 表格 公式等 脚注 行号 单栏 双栏 格式 去除页码 表格 跨行 列 表格 begin
  • idea 使用Maven 建web项目模板选择

    1 选择模板 2 修改pom xml文件 3 完善目录 需要添加的目录 4 修改web xml 版本 最后修改web xm名即可 完成
  • kafka入门案例

    来源 我是码农 转载请保留出处和链接 本文链接 http www 54manong com id 1228 Conumer demo1 java内容如下 package com lenovo kafka demo import org ap
  • QT 设置样式的两种方式

    1 通过直接加载样式表文件 若现为整个APP加载同一个样式表文件 可直接读取整个qss文件 然后QApplication 设置样式表的成员函数最终继承自父类QGuiApplication 的类对象执行a setStyleSheet cons
  • 星星之火-59:ETSI与FCC在5GHz非授权频谱LAA上要求的差异

    目录 1 ETSI与FCC概述 2 ETSI与FCC在5GHz非授权频谱的比较 2 1 频谱概述 2 2 可用信道数的差异 2 3 基站的发送功率的差异 2 3 雷达信号规范的差异 1 ETSI与FCC概述 ETSI 欧洲电信标准化协会 E
  • golang中的类型断言

    goLang有类型转换 类型断言 类型切换 1 接口类型断言 类型断言就是将接口类型的值 x 装换成类型 T 成功则返回 T 的实例 格式为 x T 不安全 会造成panic 程序中断 v x T 不安全 会造成panic 程序中断 v o