1、介绍

        Golang 语言是一门静态类型的编程语言,我们在编写代码时,为了提升代码的灵活性,有时会使用空接口类型,对于空接口类型的变量,一般会通过类型断言判断变量的类型,而且可能还会遇到遇到类型转换的场景,下面我们对类型的断言、类型转换和类型选择。

2、编程技巧

        类型断言,类型端要提供了访问接口类型值的底层具体值的方式,这是需要注意的是被类型断言的值必须是接口类型的值,类型断言返回两个值,被断言的接口类型值的底层具体值和一个表示是否断言成功的布尔类型的值。

t,ok := i.(T)

        未使用类型断言:

func main() {id := getVal(1)fmt.Println(id)
}func getVal(val interface{}) interface{} {return val
}

        使用类型断言:

func main() {id := getVal(1)id, ok := id.(int);if !ok {err := errors.New("illegal paramter")fmt.Println(err)return}fmt.Println(id)
}func getVal(val interface{}) interface{} {return val
}

        阅读上面这两段代码,main 函数中都是通过调用getVal()函数,使用类型推断的方式给变量id 赋值,不同的是main 函数,第一段代码中未使用类型断言,第二段代码中使用了类型断言,所以第一代码的main 函数如果调用 getVa()函数时传递非整型参数,也可以正常输出;第二段代码的main 函数如果调用 getVal() 函数时传递非整型参数,将会被断言代码拦截。

       类型转换:

        类型转换的表达式T(v),将v 转换为类型T 。关于类型转换,我们需要注意的“坑”如下所示:

        整型之间的转换:

func main() {var a inta = 128b := int8(a)fmt.Println(b)
}

       输出结果:-128

        阅读上面这段代码, int 类型的变量 a 赋值为128 ,将变量a 转换为int8 类型的变量b , 输出变量b 的结果是 -128 ,原因是int 类型和 int8 类型的取值范围不同。

        浮点型转为整形:

import "fmt"func main() {var a float64a = 3.1415926b := int(a)fmt.Println(b)
}

        输出结果:3

        浮点型float64的变量a, 转换为int 类型的变量b ,输出结果是3,变量a 值的小数部分被截掉了。

        整型转换为字符串类型:

import "fmt"func main() {var a inta = -1b := string(a)fmt.Println(b)
}

        输出结果:�

        int 类型变量 a,转换为 string 类型变量 b,变量 b 的输出结果是 ,表示未知字符,原因是 Unicode 码点(code point)中没有 -1。

        字符串类型和切片(字节切片和字符切片)类型相互转换:

import "fmt"func main() {var a stringa = "编程"b := []byte(a)fmt.Println(b)c := []rune(a)fmt.Println(c)
}

       输出结果:

        [231 188 150 231 168 139]
[32534 31243]

        将字符串类型的变量a 分别转换为字节切片类型变量b 和字符切片类型变量c,它们的输出结果不同,原因是UTF-8 编码一个中文汉字是3个字节,3个字节代表1个字符 。而字符切片类型的元素本身就是Unicode 字符。

        类型选择:

func main() {var a interface{}a = falseswitch val := a.(type) {case int:fmt.Printf("val:%d type:%T\n", val, val)case string:fmt.Printf("val:%d type:%T\n", val, val)default:fmt.Printf("unknowtype:%T\n", val)}
}

        这段代码使用的 type swtich 判断空接口类型变量a 的实际数据类型是否为我们预定义的类型之一。

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计数组合学7.11(RSK算法)

7.11 RSK算法 在对称函数理论中,有一个非凡的组合对应关系,称为RSK算法。(关于缩写RSK的含义以及其他名称,请参阅本章末尾的注释。)这里我们仅介绍RSK算法的最基本性质,从而能够给出舒尔函数一些基本性质的…

国产嵌入式调试器之光? RT-Trace 初体验!

做过嵌入式开发的工程师肯定都知道有这么个玩意儿 —— J-Trace,与我们日常使用的普通调试器不同点在于,它在基本的下载/调试代码之上还具有非常强大的代码运行跟踪能力,从而实现代码覆盖率的分析、指令回溯、CPU 资源监控等一系列强大的功能…

SLAM中的非线性优化-2D图优化之零空间实战(十六)

终于有时间更新实战篇了,本节实战几乎包含了SLAM后端的所有技巧,其中包括:舒尔补/先验Factor/鲁棒核函数/FEJ/BA优化等滑动窗口法的相关技巧,其中构建2D轮式里程计预积分以及绝对位姿观测的10帧滑动窗口,并边缘化最老帧…

知识随记-----Qt 实战教程:使用 QNetworkAccessManager 发送 HTTP POST

文章目录Qt 网络编程:使用 QNetworkAccessManager 实现 HTTP POST 请求概要整体架构流程技术名词解释技术细节注意事项:Qt 网络编程:使用 QNetworkAccessManager 实现 HTTP POST 请求 概要 本文介绍如何使用 Qt 框架的网络模块(…

wordpress批量新建产品分类

1、下载安装插件:bulk-category-import-export2、激活插件后,左侧点击插件下的导入,选择product categories,点击下一步3、这里可以选择导入的分类列表文件,可以选择分隔符,CSV文件默认为‘,’要…

CentOS 镜像源配置与 EOL 后的应对策略

引言 本文将详细介绍如何使用 阿里云开源镜像站 配置 CentOS 的各类软件源,包括基础源、历史归档源(vault)、ARM 架构源、Stream 版本以及调试信息源(debuginfo),并重点讲解在 CentOS 8 停止维护后&#x…

CTF实战:用Sqlmap破解表单输入型SQL注入题(输入账号密码/usernamepassword)

目录 引言 步骤1:用Burp Suite捕获表单请求 步骤2:用Sqlmap获取数据库名称 参数解释: 输出示例(根据题目环境调整): 步骤3:获取目标数据库中的表名 参数解释: 输出示例&#…

质数时间(二分查找)

题目描述如果把一年之中的某个时间写作 a 月 b 日 c 时 d 分 e 秒的形式,当这五个数都为质数时,我们把这样的时间叫做质数时间,现已知起始时刻是 2022 年的 a 月 b 日 c 时 d 分 e 秒,终止时刻是 2022 年的 u 月 v 日 w 时 x 分 y…

Python训练Day29

浙大疏锦行 类的装饰器装饰器思想的进一步理解:外部修改、动态类方法的定义:内部定义和外部定义

新手DBA实战指南:如何使用gh-ost实现MySQL无锁表结构变更

新手DBA实战指南:如何使用gh-ost实现MySQL无锁表结构变更 作为DBA,大表结构变更(DDL)一直是令人头疼的问题。传统的ALTER TABLE操作会锁表,严重影响业务连续性;而常见的pt-online-schema-change工具虽然能实现在线变更,但依赖触发器机制,在高并发场景下性能表现不佳。本…

OSPF综合

一、实验拓扑二、实验需求1、R4为ISP,其上只配置IP地址;R4与其他所直连设备间均使用公有IP; 2、R3-R5、R6、R7为MGRE环境,R3为中心站点; 3、整个OSPF环境IP基于172.16.0.0/16划分;除了R12有两个环回&#x…

技术面试知识点详解 - 从电路到编程的全栈面经

技术面试知识点详解 - 从电路到编程的全栈面经 目录 模拟电路基础数字电路原理电源设计相关编程语言基础数据库与并发网络协议基础算法与数据结构 模拟电路基础 1. 放大电路类型判断 这是模拟电路面试的经典题目,通过电压放大倍数判断放大电路类型: …

LangGraph认知篇-Command函数

Command简述 在 LangGraph 中,Command 是一个极具实用性的功能,它能够将控制流(边)和状态更新(节点)巧妙地结合起来。这意味着开发者可以在同一个节点中,既执行状态更新操作,又决定下…

【目标检测】小样本度量学习

小样本度量学习(Few-Shot Metric Learning)通常用于分类任务​(如图像分类),但它也可以与目标检测(Object Detection)结合,解决小样本目标检测(Few-Shot Object Detectio…

cmd怎么取消关机命令

在 Windows 的命令提示符(CMD)中取消已计划的关机操作,可以通过 shutdown 命令的 ​**-a**​ 参数实现。以下是具体步骤:​操作方法​​打开 CMD​按下 Win R 组合键,输入 cmd 并回车,打开命令提示符窗口。…

网易云音乐硬刚腾讯系!起诉SM娱乐滥用市场支配地位

企查查APP显示,近日,法院公开杭州乐读科技有限公司、杭州网易云音乐科技有限公司起诉SM ENTERTAINMENT CO. 、卡斯梦(上海)文化传播有限公司等开庭信息,案由涉及滥用市场支配地位纠纷。公告显示,该案件计划…

[css]切角

使用css实现一个切角的功能&#xff0c;有以下几种方案&#xff1a; <div class"box"></div>方案一&#xff1a;linear-gradient linear-gradient配合backgroud-image可以实现背景渐变的效果。linear-gradient的渐变过渡区的占比是总的空间&#xff08;高…

分享一个可以测试离线服务器性能的脚本

在日常运维工作中&#xff0c;经常会遇到系统性能莫名跟不上业务需求的情况&#xff1a;服务器响应变慢、应用加载卡顿、资源占用异常飙升等问题频繁出现&#xff0c;却难以快速问题根源究竟在CPU过载、内存泄漏、磁盘I/O阻塞还是网络带宽瓶颈。这种时候&#xff0c;特别需要一…

Python Pandas.unique函数解析与实战教程

Python Pandas.unique 函数解析与实战教程 摘要 本文章旨在全面地解析 pandas 库中的 unique 函数。pandas.unique 是一个用于从一维数组型(array-like)对象中提取唯一值的高效工具。我们将从其核心功能、函数签名、参数详解、返回值类型,到关键行为特性(如顺序保留、缺失…

排序算法入门:直接插入排序详解

这里写目录标题介绍原理代码实现分析介绍 直接插入排序是一种简单直观的排序算法&#xff0c;适用于小规模数据或基本有序的数据集。其核心思想是构建有序序列&#xff0c;对于未排序数据&#xff0c;在已排序序列中从后向前扫描&#xff0c;找到相应位置并插入。 原理 我们…