当前位置: 首页 > news >正文

Golang 语言的编程技巧之类型

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.dtcms.com/a/308193.html

相关文章:

  • 基础组件(六):网络缓冲区设计 和 定时器方案
  • TTS语音合成|GPT-SoVITS语音合成服务器部署,实现http访问
  • Vue3+Vite项目如何简单使用tsx
  • nl2sql grpo强化学习训练,加大数据量和轮数后,准确率没提升,反而下降了,如何调整
  • PostgreSQL dblink 与 Spring Boot @Transactional 的事务整合
  • Text2SQL 智能问答系统开发-预定义模板(二)
  • docker离线安装mysql镜像
  • 记录几个SystemVerilog的语法——覆盖率
  • 基于MATLAB的GUI来对不同的(彩色或灰色)图像进行图像增强
  • 【国内电子数据取证厂商龙信科技】内存取证
  • 法式基因音响品牌SK(SINGKING AUDIO)如何以硬核科技重塑专业音频版图
  • 防御保护第一次作业
  • AI Gateway 分析:OpenRouter vs Higress
  • python基础语法3,组合数据类型(简单易上手的python语法教学)(课后习题)
  • BFT平台:打造科研教育“最强机器人矩阵”
  • 自动驾驶控制算法——PID算法
  • 蓝桥杯----DS18B20温度传感器
  • vue3+arcgisAPI4示例:轨迹点模拟移动(附源码下载)
  • InfluxDB 与 Python 框架结合:Django 应用案例(二)
  • ASIC芯片简介
  • LangGraph认知篇-Send机制
  • TypeScript 基础介绍(二)
  • QT6 Python UI文件转换PY文件的方法
  • 如何为C#加入EPPlus 包
  • 【Flask基础②】 | 路由、响应与异常处理
  • 微服务快速集成 TraceId
  • 企业智脑1.3.2版本发布,设备管理+智能体OS双核驱动,重构数字生产力边界
  • 【车联网kafka】Kafka核心架构与实战经验(第二篇)
  • 网络与信息安全有哪些岗位:(4)应急响应工程师
  • 【MySQL集群架构与实践3】使用Dcoker实现读写分离