golang类型转换与类型断言

本文详细介绍了Go语言中的类型转换、类型断言和类型切换。类型转换需要显式进行,对于不兼容类型会导致编译错误。类型断言用于将接口类型转换为特定类型,若非法则可能导致运行时错误,可通过加`ok`判断来避免。类型切换(type switch)用于检查值的类型是否匹配多个类型之一,包括匹配nil接口的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

主要内容:
类型转换
类型断言
类型切换

类型转换

我们知道,golang 是一个强类型的语言,没有所谓的隐式转换,具体例子:

var a int64 = 0
var b int32 = 1
a = b

上面的例子在golang里面是编译通不过的。但是在C++或者Java这种编译器都是会做隐式的自动转换的。

golang提供了语法来做显示的类型转换,语法如下:

<结果类型> := <目标类型> ( <表达式> )

类型转换是用来在不同但相互兼容的类型之间的相互转换的方式,所以,当类型不兼容的时候,是无法转换的。如下:

var var1 int = 7
var2 := float32(var1)
var3 := int64(var1)
var4 := []int8(var1)

上面的var4就会报错,因为类型不兼容。

还有一点需要特别注意的是指针类型的转换,这个需要借助 unsafe 包来做,具体可以看关于unsafe相关的文章。

类型断言

类型断言就是将接口类型的值(x),装换成类型(T)。格式为:

x.(T)
v:=x.(T)
v,ok:=x.(T)

类型断言的必要条件就是 x 是接口类型,非接口类型的x不能做类型断言:

var i int=10
//错误 i不是接口类型
v:=i.(int) 

T可以是非接口类型,如果想断言合法,则T应该实现x的接口

T也可以是接口,则x的动态类型也应该实现接口T

var x interface{}=7  //x的动态类型为int,值为7
i:=x.(int)           // i的类型为int ,值为7

type I interface {m()}
var y I

s:=y.(string)      //非法: string 没有实现接口 I (missing method m)
r:=y.(io.Reader)   //y如果实现了接口io.Reader和I的情况下,  r的类型则为io.Reader

类型断言如果非法,运行时就会出现错误,为了避免这种错误,可以使用一下语法:

v,ok:=x.(T)

ok代表类型断言是否合法,如果非法,ok则为false,这样就不会出现panic了.

类型切换 type switch

类型切换用来比较类型而不是对值进行比较

type switch 它用于检测的是值x的类型T是否匹配某个类型.

格式如下,类似类型断言,但是括号内的不是某个具体的类型,而是单词type:

switch x.(type){
  
 }

type switch语句中可以有一个简写的变量声明,这种情况下,等价于这个变量声明在每个case clause 隐式代码块的开始位置。如果case clause只列出了一个类型,则变量的类型就是这个类型,否则就是原始值的类型

假设下面的例子中的x的类型为x interface{}:

switch i := x.(type) {
case nil:
  	printString("x is nil") // i的类型是 x的类型 (interface{})
case int:
  	printInt(i) // i的类型 int
case float64:
  	printFloat64(i) // i的类型是 float64
case func(int) float64:
 	printFunction(i) // i的类型是 func(int) float64
case bool, string:
  	printString("type is bool or string") // i的类型是 x (interface{})
default:
 	printString("don't know the type") // i的类型是 x的类型 (interface{})
}

上面的例子中有一个case clause中的类型是nil,它用来匹配x为nil的interface{}的情况。

Golang 中,类型转换可以通过使用类型断言、强制类型转换和接口转换等方式实现。 1. 类型断言 类型断言用于判断一个接口对象是否实现了某个接口或者是否是某个具体类型的对象。语法如下: ``` value, ok := interfaceObj.(Type) ``` 其中,interfaceObj 是一个接口类型的变量,Type 是一个具体类型。如果 interfaceObj 实现了 Type 接口或者是 Type 类型的对象,则 value 为 interfaceObj 转换Type 类型后的值,ok 为 true;否则 value 为 Type 类型的零值,ok 为 false。 举个例子: ``` var i interface{} = "hello" s, ok := i.(string) if ok { fmt.Println(s) } ``` 上面的代码中,i 是一个空接口类型的变量,值为字符串 "hello"。通过类型断言,将 i 转换成字符串类型的变量 s,然后输出 s 的值。 2. 强制类型转换 强制类型转换用于将一个变量从一种类型强制转换成另一种类型。语法如下: ``` value := Type(expression) ``` 其中,expression 是要转换的表达式,Type 是要转换成的类型。如果 expression 可以被转换Type 类型,则 value 为 expression 转换Type 类型后的值;否则会发生运行时错误。 举个例子: ``` var i int = 10 f := float64(i) fmt.Println(f) ``` 上面的代码中,i 是一个整型变量,值为 10。通过强制类型转换,将 i 转换成浮点型变量 f,然后输出 f 的值。 3. 接口转换 接口转换用于将一个接口对象转换成另一个接口类型的对象。语法如下: ``` interfaceObj := expression.(InterfaceType) ``` 其中,expression 是要转换的表达式,InterfaceType 是目标接口类型。如果 expression 实现了 InterfaceType 接口,则 interfaceObj 为 expression 转换成 InterfaceType 类型后的对象;否则会发生运行时错误。 举个例子: ``` type Writer interface { Write([]byte) (int, error) } var w io.Writer = os.Stdout f := w.(*os.File) ``` 上面的代码中,w 是一个 io.Writer 接口类型的变量,值为 os.Stdout。通过接口转换,将 w 转换成 os.File 类型的变量 f,然后输出 f 的值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值