Go语言数据类型转换指南 不看后悔系列

简介: Go语言数据类型转换指南 不看后悔系列

数据类型的转换在编程中经常用到,Go 语言中数据类型转换分为显式和隐式转换两种。理解转换方法可以避免许多错误。

本文将系统详细介绍 Go 语言各主要数据类型之间的显式和隐式转换规则、方法以及需要注意的细节。通过学习本文可以全面掌握 Go 语言数据类型转换的方式。

1

 

一、概述

Go 语言数据类型转换分两种:

  1. 隐式转换:Go 自动进行的默认转换。
  2. 显式转换:需要使用转换函数进行强制转换;

2

 

二、整型转换

整型之间可以互相转换,但需要遵守数据范围限制:

var i int16 = 100
var j int8
j = int8(i) // 显式转换


超出类型范围则取模:

var i int16 = 128
var j int8
j = int8(i) // j == -128

3

 

三、浮点数转换

浮点数转换规则:

  1. 转换成功时直接转换
  2. 越界时转换为±Inf
  3. 精度损失时直接截断

示例:

var f float64 = 1.5
var i int8 = int8(f) // i == 1

4

 

四、其他整型转换

其他整型类型均可以转换为 int:

var b byte = 'A'
var i int = int(b) 

但反向转换时需要范围判断。

5

 

五、interface{}转换

interface{}可以存储任意类型,转换时需判断类型:

var a interface{} = 100 
v, ok := a.(int)
if ok {
  fmt.Println(v)
}

类型断言转换失败则 ok 为 false。

6

 

六、string 与其他转换

string 转换为其他:

s := strconv.Itoa(123) // int to string
f, _ := strconv.ParseFloat("1.5", 64) // string to float64

其他类型转换为 string:

i := 100
s := strconv.Itoa(i)

需要使用 strconv 包进行转换。

7

 

七、切片转换

切片不能直接转换为其他类型,但可以转换为[]byte 或自己:

var s1 []int = []int{1, 2, 3}
var s2 []byte = []byte(s1) // 可行
var s3 []string = s1 // 错误,不能转换

    8

     

    八、Map 转换

    map 只能转换为自身(map)或转换为 interface{}:

    var m1 map[string]int = map[string]int{
      "a": 1,
      "b": 2, 
    }
    var m2 interface{} = m1
    var m3 map[string]int = m1 // 可行

    map 到其他类型直接转换会编译错误。

    9

     

    九、指针转换

    Go 不支持指针间的直接转换,但可以通过先获取值再赋值的方式实现转换。

    var a *int = new(int)
    var b *float64 = a // 错误

    但可以通过获取指针的值进行转换:

    var a *int = new(int)
    *a = 100
    var b *float64 = new(float64)
    *b = float64(*a) //可行

    10

     

    总结

    Go 语言中合理进行数据类型转换可以避免许多错误,需要注意每个类型之间的转换规则。显式转换可以避免意外的隐式转换。

    通过学习本文,我们可以全面掌握 Go 语言各种数据类型间的转换方法。这将有助于我们进行灵活的编程。


    目录
    相关文章
    |
    1天前
    |
    程序员 Go PHP
    为什么大部分的 PHP 程序员转不了 Go 语言?
    【9月更文挑战第8天】大部分 PHP 程序员难以转向 Go 语言,主要因为:一、编程习惯与思维方式差异,如语法风格和编程范式;二、学习成本高,需掌握新知识体系且面临项目压力;三、职业发展考量,现有技能价值及市场需求不确定性。学习新语言虽有挑战,但对拓宽职业道路至关重要。
    22 10
    |
    2天前
    |
    算法 程序员 Go
    PHP 程序员学会了 Go 语言就能唬住面试官吗?
    【9月更文挑战第8天】学会Go语言可提升PHP程序员的面试印象,但不足以 solely “唬住” 面试官。学习新语言能展现学习能力、拓宽技术视野,并增加就业机会。然而,实际项目经验、深入理解语言特性和综合能力更为关键。全面展示这些方面才能真正提升面试成功率。
    20 10
    |
    1天前
    |
    编译器 Go
    go语言学习记录(关于一些奇怪的疑问)有别于其他编程语言
    本文探讨了Go语言中的常量概念,特别是特殊常量iota的使用方法及其自动递增特性。同时,文中还提到了在声明常量时,后续常量可沿用前一个值的特点,以及在遍历map时可能遇到的非顺序打印问题。
    |
    6天前
    |
    安全 大数据 Go
    深入探索Go语言并发编程:Goroutines与Channels的实战应用
    在当今高性能、高并发的应用需求下,Go语言以其独特的并发模型——Goroutines和Channels,成为了众多开发者眼中的璀璨明星。本文不仅阐述了Goroutines作为轻量级线程的优势,还深入剖析了Channels作为Goroutines间通信的桥梁,如何优雅地解决并发编程中的复杂问题。通过实战案例,我们将展示如何利用这些特性构建高效、可扩展的并发系统,同时探讨并发编程中常见的陷阱与最佳实践,为读者打开Go语言并发编程的广阔视野。
    |
    3天前
    |
    存储 Shell Go
    Go语言结构体和元组全面解析
    Go语言结构体和元组全面解析
    |
    8天前
    |
    Go
    golang语言之go常用命令
    这篇文章列出了常用的Go语言命令,如`go run`、`go install`、`go build`、`go help`、`go get`、`go mod`、`go test`、`go tool`、`go vet`、`go fmt`、`go doc`、`go version`和`go env`,以及它们的基本用法和功能。
    20 6
    |
    8天前
    |
    存储 Go
    Golang语言基于go module方式管理包(package)
    这篇文章详细介绍了Golang语言中基于go module方式管理包(package)的方法,包括Go Modules的发展历史、go module的介绍、常用命令和操作步骤,并通过代码示例展示了如何初始化项目、引入第三方包、组织代码结构以及运行测试。
    16 3
    |
    10天前
    |
    缓存 安全 Java
    如何利用Go语言提升微服务架构的性能
    在当今的软件开发中,微服务架构逐渐成为主流选择,它通过将应用程序拆分为多个小服务来提升灵活性和可维护性。然而,如何确保这些微服务高效且稳定地运行是一个关键问题。Go语言,以其高效的并发处理能力和简洁的语法,成为解决这一问题的理想工具。本文将探讨如何通过Go语言优化微服务架构的性能,包括高效的并发编程、内存管理技巧以及如何利用Go生态系统中的工具来提升服务的响应速度和资源利用率。
    |
    10天前
    |
    Rust Linux Go
    Rust/Go语言学习
    Rust/Go语言学习
    |
    11天前
    |
    Java 数据库连接 数据库
    携手前行:在Java世界中深入挖掘Hibernate与JPA的协同效应
    【8月更文挑战第31天】Java持久化API(JPA)是一种Java规范,为数据库数据持久化提供对象关系映射(ORM)方法。JPA定义了实体类与数据库表的映射及数据查询和事务控制方式,确保不同实现间的兼容性。Hibernate是JPA规范的一种实现,提供了二级缓存、延迟加载等丰富特性,提升应用性能和可维护性。通过结合JPA和Hibernate,开发者能编写符合规范且具有高度可移植性的代码,并利用Hibernate的额外功能优化数据持久化操作。
    27 0