”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > Go 中类型转换和转换的综合指南

Go 中类型转换和转换的综合指南

发布于2024-08-30
浏览:675

A Comprehensive Guide to Type Casting and Conversions in Go

Go,也称为 Golang,是一种静态类型语言。这意味着每个变量的类型在编译时都是已知的,从而为代码提供安全性和可预测性。但是,这也要求从一种类型到另一种类型的任何转换都是明确且经过深思熟虑的。在本文中,我们将探讨 Go 中可用的各种类型转换和转换机制,从基本的数值转换到更复杂的接口和指针转换。

1. 基本类型转换

Go 允许在整数、浮点数和字符串等基本类型之间进行转换,但这些转换必须显式完成。

数字类型

不同数字类型之间的转换很简单,但必须明确:

var i int = 42
var f float64 = float64(i)  // int to float64
var u uint = uint(i)        // int to uint

在此示例中,我们将 int 转换为 float64 和 uint。这些转换是显式的,因为 Go 不执行自动(隐式)类型转换。

字符串和字节切片

Go 字符串是不可变的,但它们可以与字节切片 ([]byte) 相互转换,而字节切片 ([]byte) 是可变的:

var s string = "hello"
var b []byte = []byte(s)   // string to []byte
var s2 string = string(b)  // []byte to string

同样,可以在字符串和符文切片([]rune)之间进行转换,其中符文是 int32 的类型别名:

var r []rune = []rune(s)   // string to []rune
var s3 string = string(r)  // []rune to string

2. 自定义类型转换

在Go中,您可以基于现有类型定义自己的类型。自定义类型与其基础类型之间的转换是显式的:

type MyInt int
var i int = 10
var mi MyInt = MyInt(i)   // int to MyInt
var i2 int = int(mi)      // MyInt to int

此显式转换对于确保编译器可以验证代码的安全性是必要的。

3. 指针转换

Go中的指针引用变量的内存地址。您可以在值与其指针之间进行转换:

var x int = 42
var p *int = &x     // int to *int (pointer to int)
var y int = *p      // *int to int (dereferencing)

4. 接口类型转换

Go中的接口用于定义一组方法。您可以在具体类型和接口之间进行转换:

var a interface{} = 42    // int to interface{}
var b int = a.(int)       // interface{} to int (type assertion)

类型断言

类型断言提供对接口具体值的访问:

if v, ok := a.(int); ok {
    fmt.Println("a is an int:", v)
}

类型开关

类型开关允许您根据接口的动态类型执行不同的操作:

switch v := a.(type) {
case int:
    fmt.Println("a is an int:", v)
case string:
    fmt.Println("a is a string:", v)
default:
    fmt.Println("a is of unknown type")
}

5. 不安全的转换

unsafe 包允许你绕过 Go 的类型安全,从而实现非法的转换:

import "unsafe"

var i int = 42
var p *int = &i
var fp *float64 = (*float64)(unsafe.Pointer(p))  // *int to *float64

警告:应谨慎使用不安全的转换,并且仅在绝对必要时使用,因为它们可能导致未定义的行为。

6. 通道类型转换

通道是 Go 中的一个强大功能,允许 goroutine 之间进行通信。您可以在双向和单向通道之间进行转换:

ch := make(chan int)
var sendOnlyChan chan



7. 结构体和数组转换

具有相同布局的结构体或数组之间的转换需要显式转换:

type Point struct {
    X, Y int
}

type Coord struct {
    X, Y int
}

var p Point = Point{1, 2}
var c Coord = Coord(p)  // Convert Point to Coord (same field types)

8. 切片转换

切片是对数组的引用,虽然您可以在相同类型的切片之间进行转换,但不同类型的切片之间的转换需要显式转换:

var a []int = []int{1, 2, 3}
var b []int = a[1:]  // Convert a slice to another slice of the same type

9. 零接口转换

Go 中的 nil 值可以分配给任何接口类型:

var x interface{} = nil
var y error = nil

10. 函数类型转换

Go 函数可以转换为不同类型,只要签名兼容:

type FuncType func(int) int

func square(x int) int {
    return x * x
}

var f FuncType = FuncType(square)  // Convert function to FuncType

11. 数组到切片的转换

可以从数组创建切片,它本质上是对数组的引用:

var arr [5]int = [5]int{1, 2, 3, 4, 5}
var sl []int = arr[:]  // Convert array to slice

结论

Go 中的类型转换和转换在设计上是明确的,使代码更安全、更容易理解。通过要求显式转换,Go 有助于防止隐式类型强制可能产生的微妙错误,这在其他一些编程语言中很常见。理解这些转换并正确使用它们对于编写健壮且高效的 Go 程序至关重要。

版本声明 本文转载于:https://dev.to/zakariachahboun/a-comprehensive-guide-to-type-casting-and-conversions-in-go-26di?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 如何高效地在一个事务中插入数据到多个MySQL表?
    如何高效地在一个事务中插入数据到多个MySQL表?
    mySQL插入到多个表中,该数据可能会产生意外的结果。虽然似乎有多个查询可以解决问题,但将从用户表的自动信息ID与配置文件表的手动用户ID相关联提出了挑战。使用Transactions和last_insert_id() 插入用户(用户名,密码)值('test','test...
    编程 发布于2025-05-07
  • 如何从PHP中的Unicode字符串中有效地产生对URL友好的sl。
    如何从PHP中的Unicode字符串中有效地产生对URL友好的sl。
    为有效的slug生成首先,该函数用指定的分隔符替换所有非字母或数字字符。此步骤可确保slug遵守URL惯例。随后,它采用ICONV函数将文本简化为us-ascii兼容格式,从而允许更广泛的字符集合兼容性。接下来,该函数使用正则表达式删除了不需要的字符,例如特殊字符和空格。此步骤可确保slug仅包含...
    编程 发布于2025-05-07
  • 如何从Google API中检索最新的jQuery库?
    如何从Google API中检索最新的jQuery库?
    从Google APIS 问题中提供的jQuery URL是版本1.2.6。对于检索最新版本,以前有一种使用特定版本编号的替代方法,它是使用以下语法:获取最新版本:未压缩)While these legacy URLs still remain in use, it is recommended ...
    编程 发布于2025-05-07
  • Python高效去除文本中HTML标签方法
    Python高效去除文本中HTML标签方法
    在Python中剥离HTML标签,以获取原始的文本表示Achieving Text-Only Extraction with Python's MLStripperTo streamline the stripping process, the Python standard librar...
    编程 发布于2025-05-07
  • 如何在鼠标单击时编程选择DIV中的所有文本?
    如何在鼠标单击时编程选择DIV中的所有文本?
    在鼠标上选择div文本单击带有文本内容,用户如何使用单个鼠标单击单击div中的整个文本?这允许用户轻松拖放所选的文本或直接复制它。 在单个鼠标上单击的div元素中选择文本,您可以使用以下Javascript函数: function selecttext(canduterid){ if(do...
    编程 发布于2025-05-07
  • 如何从Python中的字符串中删除表情符号:固定常见错误的初学者指南?
    如何从Python中的字符串中删除表情符号:固定常见错误的初学者指南?
    从python import codecs import codecs import codecs 导入 text = codecs.decode('这狗\ u0001f602'.encode('utf-8'),'utf-8') 印刷(文字)#带有...
    编程 发布于2025-05-07
  • 在细胞编辑后,如何维护自定义的JTable细胞渲染?
    在细胞编辑后,如何维护自定义的JTable细胞渲染?
    在JTable中维护jtable单元格渲染后,在JTable中,在JTable中实现自定义单元格渲染和编辑功能可以增强用户体验。但是,至关重要的是要确保即使在编辑操作后也保留所需的格式。在设置用于格式化“价格”列的“价格”列,用户遇到的数字格式丢失的“价格”列的“价格”之后,问题在设置自定义单元格...
    编程 发布于2025-05-07
  • 如何同步迭代并从PHP中的两个等级阵列打印值?
    如何同步迭代并从PHP中的两个等级阵列打印值?
    同步的迭代和打印值来自相同大小的两个数组使用两个数组相等大小的selectbox时,一个包含country代码的数组,另一个包含乡村代码,另一个包含其相应名称的数组,可能会因不当提供了exply for for for the uncore for the forsion for for ytry...
    编程 发布于2025-05-07
  • 如何在Java字符串中有效替换多个子字符串?
    如何在Java字符串中有效替换多个子字符串?
    在java 中有效地替换多个substring,需要在需要替换一个字符串中的多个substring的情况下,很容易求助于重复应用字符串的刺激力量。 However, this can be inefficient for large strings or when working with nu...
    编程 发布于2025-05-07
  • 如何修复\“常规错误:2006 MySQL Server在插入数据时已经消失\”?
    如何修复\“常规错误:2006 MySQL Server在插入数据时已经消失\”?
    How to Resolve "General error: 2006 MySQL server has gone away" While Inserting RecordsIntroduction:Inserting data into a MySQL database can...
    编程 发布于2025-05-07
  • 如何使用PHP将斑点(图像)正确插入MySQL?
    如何使用PHP将斑点(图像)正确插入MySQL?
    essue VALUES('$this->image_id','file_get_contents($tmp_image)')";This code builds a string in PHP, but the function call ...
    编程 发布于2025-05-07
  • PHP未来:适应与创新
    PHP未来:适应与创新
    PHP的未来将通过适应新技术趋势和引入创新特性来实现:1)适应云计算、容器化和微服务架构,支持Docker和Kubernetes;2)引入JIT编译器和枚举类型,提升性能和数据处理效率;3)持续优化性能和推广最佳实践。 引言在编程世界中,PHP一直是网页开发的中流砥柱。作为一个从1994年就开始发展...
    编程 发布于2025-05-07
  • 为什么不````''{margin:0; }`始终删除CSS中的最高边距?
    为什么不````''{margin:0; }`始终删除CSS中的最高边距?
    在CSS 问题:不正确的代码: 全球范围将所有余量重置为零,如提供的代码所建议的,可能会导致意外的副作用。解决特定的保证金问题是更建议的。 例如,在提供的示例中,将以下代码添加到CSS中,将解决余量问题: body H1 { 保证金顶:-40px; } 此方法更精确,避免了由全局保证金重置引...
    编程 发布于2025-05-07
  • FastAPI自定义404页面创建指南
    FastAPI自定义404页面创建指南
    response = await call_next(request) if response.status_code == 404: return RedirectResponse("https://fastapi.tiangolo.com") else: ...
    编程 发布于2025-05-07
  • 使用jQuery如何有效修改":after"伪元素的CSS属性?
    使用jQuery如何有效修改":after"伪元素的CSS属性?
    在jquery中了解伪元素的限制:访问“ selector 尝试修改“:”选择器的CSS属性时,您可能会遇到困难。 This is because pseudo-elements are not part of the DOM (Document Object Model) and are th...
    编程 发布于2025-05-07

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3