目录

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 <-> 结构体】