目录

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,可以使用 %s

3. interface 转 数字

一般建议使用 【断言转换】,如果是字符串数字,可以先转字符串,然后再转数字

4. interface 转 结构体

    1. 采用类型断言转换
    1. 采用 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/