Go语言的几种类型转换

2024-01-07 18:30:26

前言

在日常编程中,类型转换是经常需要用到的。因此本文将总结归纳一下Go语言中常见的一些类型转换。
Go语言中的类型转换可以有多种分类方式:
比如按照是否需要声明,可以分为:隐式类型转换和显式类型转换。
可以再根据使用场景划分为3种:显式类型转换、隐式类型转换和断言。(很多地方这里分出来4种,多了一个强制类型转换,但我认为显式类型转换和强制类型转换应该就是一回事。期待大佬解答一下这里他们的分类依据)
再或按照转换方向,比如从整数类型到浮点数类型的转换,或者从浮点数类型到整数类型的转换… …
本文将学习归纳使用场景分类下的情况。

强制类型转换

就是直接强转,可能会导致数据丢失或溢出。

newType := targetType(expression)

其中,newType是要转换的目标类型,targetType是要转换为的类型,expression是要转换的表达式或变量。

例如:

x := 10
y := float64(x)

float64(x)将整数x转换为浮点数类型,并将结果赋值给变量y。

隐式类型转换

隐式类型转换主要出现在接口处,eg:

package main
 
import "fmt"
 
type Animal interface {
    Sound()
}
 
type Dog struct {
    Breed string
}
 
func (d Dog) Sound() {
    fmt.Println("Woof!")
}
 
func demo2(a Animal) {
    a.Sound()
}
 
func demo1(d1 interface{}) {
    // 隐式类型转换——结构体类型转为接口类型
    demo2(d1.(Animal))
}
 
func main() {
    d1 := Dog{Breed: "滴滴滴"}
    demo1(d1)
}


可以看到,这其中

日常使用中也可能碰见,比如:


func main() {
	var x int = 10
	var y float64 = x // 隐式类型转换,将整数类型转换为浮点数类型
	fmt.Println(y)     // 输出:10.0
}

断言

简单来说相当于执行了一个判断逻辑,如果是A类型则正确,反之则强转为A类型,若转换成功则返回,不成功则报错。

通常使用以下语法进行断言:

value, ok := BInterface.(A)

其中,someInterface 是一个接口类型的值,A 是一个具体的类型。value 是转换后的值,ok 是一个布尔值,表示转换是否成功。如果转换成功,value 将包含转换后的值,ok 为 true;如果转换失败,value 将包含零值,ok 为 false。

具体讲解见此文

总结

个人认为日常使用中用的最多的是强制类型转换,亦可通过函数诸如Atoi , Itoa等。
隐式类型转换主要发生在使用接口时,尤其需要注意看得懂。
断言使用在一些附带有判断的场景。诸如一个kafka消息接收时候断言为[]byte类型。

文章来源:https://blog.csdn.net/Ws_Te47/article/details/135375428
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。