- 基本数据类型转换
- 数值类型转换
- 在 Go 语言中,不同的数值类型之间可以进行转换。例如,将一个
int
类型转换为float64
类型。
package main import "fmt" func main() { var a int = 10 var b float64 = float64(a) fmt.Println(b) }
- 这里通过
float64(a)
将int
类型的变量a
转换为float64
类型。需要注意的是,这种转换可能会导致精度损失或者溢出,特别是在将范围较大的整数类型转换为范围较小的整数类型时。例如,将一个很大的int64
值转换为int8
可能会超出int8
的取值范围。 - 字符串与数值类型转换
- 字符串转数值:Go 语言提供了一些函数来将字符串转换为数值类型。例如,将一个字符串转换为
int
类型可以使用strconv.Atoi
函数。
package main import ( "fmt" "strconv" ) func main() { str := "123" num, err := strconv.Atoi(str) if err == nil { fmt.Println(num) } else { fmt.Println("转换错误") } }
- 这里使用
strconv.Atoi
函数将字符串str
转换为int
类型。该函数返回两个值,一个是转换后的整数,另一个是可能出现的错误。如果转换成功,err
为nil
;如果转换失败,err
不为nil
,可以根据err
的值来判断转换是否成功。 - 数值转字符串:可以使用
strconv.Itoa
函数将整数转换为字符串。
package main import ( "fmt" "strconv" ) func main() { num := 123 str := strconv.Itoa(num) fmt.Println(str) }
- 对于其他数值类型(如
float
)转字符串,有strconv.FormatFloat
函数。例如:
package main import ( "fmt" "strconv" ) func main() { num := 3.14159 str := strconv.FormatFloat(num, 'f', 2, 64) fmt.Println(str) }
- 这里
FormatFloat
函数的参数依次是要转换的浮点数、格式('f'
表示普通格式)、精度(这里是保留 2 位小数)、位大小(64
位)。
- 接口类型转换
- Go 语言中的接口是一种抽象类型,它定义了一组方法。一个变量如果实现了接口定义的所有方法,就可以赋值给接口类型的变量。接口类型的变量可以在运行时持有不同类型的值,并且可以进行类型断言来获取其具体的类型。
- 类型断言:类型断言用于提取接口中具体的值。它的语法是
value, ok := interfaceVariable.(ConcreteType)
。
package main import "fmt" type Shape interface { Area() float64 } type Circle struct { radius float64 } func (c Circle) Area() float64 { return 3.14 * c.radius * c.radius } func main() { var s Shape = Circle{radius: 2.0} if c, ok := s.(Circle); ok { fmt.Println("这是一个圆,半径为", c.radius) } }
- 在这个例子中,首先定义了一个接口
Shape
和一个实现了该接口的结构体Circle
。然后创建了一个接口类型的变量s
,并将一个Circle
结构体赋值给它。通过类型断言c, ok := s.(Circle)
,如果s
实际上是一个Circle
类型,那么ok
为true
,并且c
就是Circle
类型的值,可以通过c
来访问Circle
结构体的成员。 - 类型转换(类型开关):类型开关是一种更方便的处理接口类型转换的方式,特别是当接口可能包含多种类型的值时。
package main import "fmt" type Animal interface { Speak() string } type Dog struct{} func (d Dog) Speak() string { return "汪汪!" } type Cat struct{} func (c Cat) Speak() string { return "喵喵!" } func main() { animals := []Animal{Dog{}, Cat{}} for _, animal := range animals { switch a := animal.(type) { case Dog: fmt.Println("这是一只狗,它说:", a.Speak()) case Cat: fmt.Println("这是一只猫,它说:", a.Speak()) } } }
- 这里定义了一个接口
Animal
和两个实现该接口的结构体Dog
和Cat
。在main
函数中,创建了一个包含Dog
和Cat
的切片。通过类型开关switch a := animal.(type)
来判断每个元素的具体类型,然后根据不同的类型进行相应的处理。
- 指针类型转换
- 在 Go 语言中,指针类型之间也可以进行转换,但需要注意安全性。如果两个指针类型指向的底层数据类型是兼容的,那么可以进行转换。
- 例如,将
*int
类型转换为*float64
类型(假设底层数据类型是兼容的,这里只是示例实际情况可能需要更复杂的处理)。
package main import "fmt" func main() { var a int = 10 var pInt *int = &a var pFloat *float64 = (*float64)(pInt) fmt.Println(*pFloat) }
- 这种转换可能会导致一些意外的结果,因为
int
和float64
在内存中的表示是不同的。在实际应用中,指针类型转换通常用于在自定义数据结构或者需要对内存进行底层操作的场景中,并且要确保转换的合理性和安全性。例如,在一些与 C 语言交互的 Go 程序中,可能需要进行指针类型的转换来正确地处理数据。