在Go语言中,类型转换是非常常见的操作。以下是不同类型之间转换的一些主要方法:
1. 基本类型转换
基本类型包括整型、浮点型、复数、字符串等。
-
整型到浮点型:
govar i int = 10 var f float64 = float64(i)
-
浮点型到整型 (会丢失小数部分):
govar f float64 = 10.5 var i int = int(f)
-
字符串到数字 (需要使用
strconv
包):goimport "strconv" var s string = "123" var i int, err = strconv.Atoi(s) // 或者使用 ParseInt for different bases: var i64 int64, err = strconv.ParseInt(s, 10, 64)
-
数字到字符串:
goimport "strconv" var i int = 123 var s string = strconv.Itoa(i) // 或者 ParseXXX 系列函数的返回值: var s = strconv.FormatInt(int64(i), 10)
-
字符串与字节切片:
govar s string = "hello" var b []byte = []byte(s) var s2 string = string(b)
2. 类型断言与类型转换
在处理接口类型时,可能需要类型断言或类型转换。
-
类型断言 (用于接口类型):
govar x interface{} = 7 i, ok := x.(int) if !ok { fmt.Println("type assertion failed") }
-
类型转换 (对于结构体指针或接口实现):
gotype Animal interface { Speak() } type Dog struct {} func (d Dog) Speak() { fmt.Println("Woof!") } var a Animal = &Dog{} if dog, ok := a.(*Dog); ok { // 现在可以使用 dog 了 }
3. 自定义类型转换
对于自定义类型,可以定义方法来实现转换。
-
自定义类型到基础类型 :
gotype MyInt int func (mi MyInt) Int() int { return int(mi) } var mi MyInt = 10 var i int = mi.Int()
4. 使用unsafe
包进行不安全转换
这通常不推荐,因为它绕过了Go的类型系统,但有时在需要极高性能或与C代码交互时使用。
-
Pointer 转换 :
goimport "unsafe" var f float64 = 3.14 var i int64 = *(*int64)(unsafe.Pointer(&f))
注意事项:
- Go语言不支持隐式类型转换,所有类型转换都必须显式进行。
- 转换时要注意数据溢出、精度损失等问题。
- 使用
unsafe
包时要非常小心,因为它可以导致程序崩溃或不可预知的行为。
通过这些方法,你可以在Go中灵活地进行各种类型转换。记得在转换过程中处理可能的错误,比如在字符串与数字间转换时使用strconv
包中的函数时要检查错误返回值。