Go语言类型转换大全
在Go语言开发中,数据类型转换是高频操作,涉及字符串、数字、JSON、结构体、字节等不同格式的互转。本文将系统介绍Go语言中的各种类型转换方法,涵盖标准库和第三方库的最佳实践以及最优方案,帮助开发者写出更健壮的代码。
一、基本类型转换
1. 字符串 <-> 数字
// string -> int
num, err := strconv.Atoi("123") // 返回 (int, error)
// int -> string
str := strconv.Itoa(123) // 返回 string
// string → float64
f, err := strconv.ParseFloat("3.14", 64) // (float64, error)2. 字符串 <-> 字节
// string -> byte
var b=[]byte("hello world")
str:=string(b)
// byte -> string
var str="hello world"
b=[]byte(str)如果不考虑性能的话(数据量不大),可以考虑使用:cast 库: github.com/spf13/cast
4. 数字互转
var i int = 42
var f float64 = float64(i) // int → float64
var u uint = uint(f) // float64 → uint二、结构体转换
1. json <-> 结构体
// json -> 结构体
type User struct {
Name string `json:"name"`
Age int `json:"age"`
}
var user User
jsonStr := `{"name": "Alice", "age": 25}`
err := json.Unmarshal([]byte(jsonStr), &user) // JSON → 结构体
// 结构体 -> json
user := User{Name: "Bob", Age: 30}
jsonData, err := json.Marshal(user) // 结构体 → JSON
fmt.Println(string(jsonData)) // {"name":"Bob","age":30}2. json <-> map
var data map[string]interface{}
jsonStr := `{"name": "Charlie", "score": 95.5}`
json.Unmarshal([]byte(jsonStr), &data) // JSON → map
fmt.Println(data["name"])
json.Marshal(&data) // map ->JSON三、时间类型转换
// time.time → 字符串
now := time.Now()
timeStr := now.Format("2006-01-02 15:04:05") // Go的格式化模板
// 字符串 → time.Time
t, err := time.Parse("2006-01-02", "2024-03-20") // 解析日期
// time.time -> 时间戳
time.Now().UnixMilli() // 毫秒
time.Now().Unix() // 秒
// 时间戳秒 -> time.time
t := time.Unix(val, 0)
// 时间戳毫秒 -> time.time
t := time.Unix(0, val*int64(time.Millisecond))更多时间转换可以参考库:https://github.com/fiveyoboy/gotime
四、interface 转基本类型
1. 类型断言转换
在已知类型的情况下,可以直接断言判断转换
var str interface ="******"
s,ok:=str.(string)
if ok{
fmt.Println("is str")
}// 使用 switch type
var str interface ="******"
switch str.(type){
case string:
//
case int:
//
case float64:
//
}直接断言的方式最常用
2. interface 转 字符串
可以使用 fmt.Sprintf()
var str interface ="******"
var s=fmt.Sprintf("%v",str) // %v是通用的占位符,但是建议如果知道类型的情况下,比如这里类型是string,可以使用 %s3. interface 转 数字
一般建议使用 【断言转换】,如果是字符串数字,可以先转字符串,然后再转数字
4. interface 转 结构体
-
- 采用类型断言转换
-
- 采用 json 序列化转换 具体见前面章节:【json <-> 结构体】
常见问题
Q1. 为什么直接用 string(123) 转出来不是“123”而是乱码?
因为 123 是整数,直接转 string 会把它当成 ASCII 码值,对应的字符是“{”。
整数转字符串必须用 strconv.Itoa,不能直接强转。
Q2. 浮点数转字符串后,怎么去掉末尾的“0”?比如 3.1400 想转成“3.14”?
可以用 strconv.FormatFloat 并指定格式符为 ‘g’,它会自动去掉多余的零。
示例:strconv.FormatFloat(3.1400, 'g', -1, 64),输出“3.14”。
Q3. 切片转数组时,用赋值而不是 copy 会怎么样?
如果直接写 arr := [3]int(slice),当切片长度不等于数组长度时会直接编译报错;
用 copy 函数则不会报错,未赋值的位置会填充该类型的默认值(比如 int 是 0)。
Q4:中文字符串转切片时用 []byte 会乱码,怎么解决?
因为中文是多字节字符(比如 UTF-8 编码下一个中文占 3 个字节),用 []byte 转会把中文拆分成多个字节,导致乱码。
改用 []rune 转换,它会把每个中文当成一个完整的字符处理。
总结
GO 语言类型转换的核心原则是“显式声明、类型兼容”,不同场景的转换逻辑各有侧重:
-
基础类型转换要注意精度和错误处理,
-
复合类型转换要匹配结构和长度,
-
接口类型转换要做好类型校验。
新手最容易犯的错是“直接强转所有类型”,比如用 string(123) 转整数、用 []byte 转中文字符串。
记住关键技巧:数值与字符串转换优先用 strconv 库,多字节字符处理优先用 []rune。
实际开发中,转换前一定要先判断“源值是否合法”“类型是否兼容”,比如字符串转整数前先校验是否为纯数字,大范围整数转小范围前先判断值的范围。
大家还遇到哪些转换的问题?欢迎大家在评论区分享交流~
版权声明
未经授权,禁止转载本文章。
如需转载请保留原文链接并注明出处。即视为默认获得授权。
未保留原文链接未注明出处或删除链接将视为侵权,必追究法律责任!
本文原文链接: https://fiveyoboy.com/articles/golang-type-convert/
备用原文链接: https://blog.fiveyoboy.com/articles/golang-type-convert/