# Go 语言中的类型断言与类型转换详解
# 1. 类型断言(Type Assertion)
# 1.1 基本概念
类型断言用于确定一个接口值的实际类型,语法为:
其中:
value 必须是接口类型
Type 是要断言的具体类型
# 1.2 使用方式
# 1.2.1 基本语法
| var i interface{} = "hello" |
| |
| |
| str := i.(string) |
| |
| |
| if str, ok := i.(string); ok { |
| fmt.Println(str) |
| } else { |
| fmt.Println("断言失败") |
| } |
# 1.2.2 type switch
| func printType(i interface{}) { |
| switch v := i.(type) { |
| case int: |
| fmt.Printf("整数: %d\n", v) |
| case string: |
| fmt.Printf("字符串: %s\n", v) |
| case bool: |
| fmt.Printf("布尔值: %v\n", v) |
| default: |
| fmt.Printf("未知类型: %T\n", v) |
| } |
| } |
# 1.3 常见错误
| |
| str := "hello" |
| value := str.(string) |
| |
| |
| var i interface{} = 42 |
| str := i.(string) |
# 2. 类型转换(Type Conversion)
# 2.1 基本概念
类型转换用于将一个类型的值转换为另一个类型,语法为:
# 2.2 常见转换场景
# 2.2.1 数值类型转换
| var i int = 42 |
| var f float64 = float64(i) |
| var u uint = uint(f) |
# 2.2.2 字符串与数值转换
| import "strconv" |
| |
| |
| str := "123" |
| if num, err := strconv.Atoi(str); err == nil { |
| fmt.Printf("转换成功:%d\n", num) |
| } |
| |
| |
| num := 123 |
| str = strconv.Itoa(num) |
# 2.2.3 切片类型转换
| |
| str := "hello" |
| bytes := []byte(str) |
| backToStr := string(bytes) |
# 2.3 注意事项
- 类型安全
| |
| var f float64 = 3.14 |
| i := int(f) |
| |
| |
| var big int64 = 1<<32 |
| small := int32(big) |
- 类型兼容性
| type MyInt int |
| var i int = 42 |
| var mi MyInt = MyInt(i) |
| |
| type Person struct { Name string } |
| type Student struct { Name string } |
| p := Person{Name: "Tom"} |
| s := Student(p) |
# 3. 类型断言与类型转换的区别
| 特性 |
类型断言 |
类型转换 |
| 使用场景 |
接口类型 |
具体类型 |
| 语法 |
value.(Type) |
Type(value) |
| 安全检查 |
支持 ok 模式 |
编译时检查 |
| 失败处理 |
可以通过 ok 判断 |
编译错误或 panic |
| 适用范围 |
仅接口类型 |
兼容的具体类型 |
# 4. 最佳实践
| |
| if value, ok := interfaceValue.(Type); ok { |
| |
| } |
| |
| |
| switch v := value.(type) { |
| case string: |
| |
| case int: |
| |
| default: |
| |
| } |
| |
| |
| func SafeInt32(val int64) (int32, error) { |
| if val > math.MaxInt32 || val < math.MinInt32 { |
| return 0, fmt.Errorf("value out of int32 range") |
| } |
| return int32(val), nil |
| } |
# 总结
- 类型断言用于接口类型,确定接口值的实际类型
- 类型转换用于具体类型之间的转换
- 类型断言应使用安全的形式避免 panic
- 类型转换要注意数据范围和精度损失
- 合理使用这两种机制可以提高代码的类型安全性
提示:在实际开发中,应该优先考虑类型安全的设计,减少类型断言和转换的使用。