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 转 结构体
-
- 采用类型断言转换
-
- 采用 json 序列化转换 具体见前面章节:【json <-> 结构体】