golang,go,博客,开源,编程

go基本数据类型之间相互转换

Published on with 0 views and 0 comments

在 Go 中,不同的数据类型之间的转换是常见的需求。Go 是静态类型语言,因此转换必须显式进行。常见的数据类型转换有数字类型之间、字符串与数字类型之间、结构体与 JSON 之间的转换等。下面是一些常见的数据类型转换示例:

1. 数字类型之间的转换

Go 提供了显式的类型转换,数字类型之间的转换非常常见。比如 int 转换成 float64 或者 float32 转换成 int

示例:intfloat64float64int

package main

import "fmt"

func main() {
	// int to float64
	var i int = 42
	var f float64 = float64(i) // 显式转换
	fmt.Printf("int: %d, float64: %f\n", i, f)

	// float64 to int
	var f2 float64 = 42.58
	var i2 int = int(f2) // 显式转换,丢失小数部分
	fmt.Printf("float64: %f, int: %d\n", f2, i2)
}

输出:

int: 42, float64: 42.000000
float64: 42.580000, int: 42

2. 字符串与数字类型之间的转换

Go 中的字符串和数字之间的转换也需要显式转换,通常使用 strconv 包。

示例:stringintintstring

package main

import (
	"fmt"
	"strconv"
)

func main() {
	// string to int
	str := "123"
	i, err := strconv.Atoi(str) // Atoi 转换字符串到整数
	if err != nil {
		fmt.Println("Error converting string to int:", err)
	}
	fmt.Printf("string: %s, int: %d\n", str, i)

	// int to string
	i2 := 456
	str2 := strconv.Itoa(i2) // Itoa 转换整数到字符串
	fmt.Printf("int: %d, string: %s\n", i2, str2)
}

输出:

string: 123, int: 123
int: 456, string: 456

3. 字符串与 []byte (字节切片) 之间的转换

Go 中可以很方便地在字符串与字节切片之间进行转换。

示例:string[]byte[]bytestring

package main

import "fmt"

func main() {
	// string to []byte
	str := "Hello, Go!"
	bytes := []byte(str)
	fmt.Printf("string: %s, []byte: %v\n", str, bytes)

	// []byte to string
	bytes2 := []byte{72, 101, 108, 108, 111} // 对应 "Hello"
	str2 := string(bytes2)
	fmt.Printf("[]byte: %v, string: %s\n", bytes2, str2)
}

输出:

string: Hello, Go!, []byte: [72 101 108 108 111 44 32 71 111 33]
[]byte: [72 101 108 108 111], string: Hello

4. 结构体与 JSON 之间的转换

Go 中结构体与 JSON 之间的转换通常通过 encoding/json 包来实现。结构体需要通过 json.Marshal 转换为 JSON 字符串,通过 json.Unmarshal 从 JSON 字符串转换为结构体。

示例:结构体与 JSON 的转换

package main

import (
	"encoding/json"
	"fmt"
)

type Person struct {
	Name string `json:"name"`
	Age  int    `json:"age"`
}

func main() {
	// 结构体转 JSON
	p := Person{Name: "John", Age: 30}
	jsonData, err := json.Marshal(p) // 转换为 JSON 字符串
	if err != nil {
		fmt.Println("Error marshalling struct:", err)
	}
	fmt.Printf("Struct to JSON: %s\n", jsonData)

	// JSON 转 结构体
	jsonStr := `{"name":"Alice","age":25}`
	var p2 Person
	err = json.Unmarshal([]byte(jsonStr), &p2) // 解析 JSON
	if err != nil {
		fmt.Println("Error unmarshalling JSON:", err)
	}
	fmt.Printf("JSON to Struct: %+v\n", p2)
}

输出:

Struct to JSON: {"name":"John","age":30}
JSON to Struct: {Name:Alice Age:25}

5. 时间与字符串之间的转换

时间类型的转换主要通过 time 包来处理,可以将时间转换为字符串,或者从字符串解析出时间。

示例:stringtime.Timetime.Timestring

package main

import (
	"fmt"
	"time"
)

func main() {
	// string to time.Time
	dateStr := "2025-01-06 14:30:00"
	layout := "2006-01-02 15:04:05"
	t, err := time.Parse(layout, dateStr) // 根据格式解析字符串
	if err != nil {
		fmt.Println("Error parsing time:", err)
	}
	fmt.Printf("string: %s, time: %v\n", dateStr, t)

	// time.Time to string
	currentTime := time.Now()
	timeStr := currentTime.Format(layout) // 格式化为字符串
	fmt.Printf("time: %v, string: %s\n", currentTime, timeStr)
}

输出:

string: 2025-01-06 14:30:00, time: 2025-01-06 14:30:00 +0000 UTC
time: 2025-01-06 14:30:00 +0000 UTC, string: 2025-01-06 14:30:00

6. 类型断言

在 Go 中,接口类型可以通过类型断言转换成其他类型。类型断言用于从接口类型转换成具体类型。它不仅是一个转换操作,而且可以用于判断某个接口变量是否持有特定的类型。

示例:类型断言

package main

import "fmt"

func main() {
	var x interface{} = 42 // interface{} 存储任何类型

	// 断言为 int 类型
	if v, ok := x.(int); ok {
		fmt.Printf("x is of type int with value: %d\n", v)
	} else {
		fmt.Println("x is not of type int")
	}

	// 断言为 string 类型
	if v, ok := x.(string); ok {
		fmt.Printf("x is of type string with value: %s\n", v)
	} else {
		fmt.Println("x is not of type string")
	}
}

输出:

x is of type int with value: 42
x is not of type string

7. 数组与切片之间的转换

Go 中的数组和切片是不同的类型,数组是固定长度的,而切片是动态的。虽然切片和数组的底层结构非常相似,但它们并不是直接可以互相转换的类型。

示例:数组转换为切片,切片转换为数组(切片无法直接转换为数组,需指定数组长度)

package main

import "fmt"

func main() {
	// 数组转切片
	arr := [3]int{1, 2, 3}
	slice := arr[:] // 使用数组的全部作为切片
	fmt.Println("Array:", arr)
	fmt.Println("Slice:", slice)

	// 切片转数组(必须指定数组长度)
	slice2 := []int{4, 5, 6}
	arr2 := [3]int{}
	copy(arr2[:], slice2) // 使用 copy 将切片内容复制到数组
	fmt.Println("Slice:", slice2)
	fmt.Println("Array:", arr2)
}

输出:

Array: [1 2 3]
Slice: [1 2 3]
Slice: [4 5 6]
Array: [4 5 6]

总结

Go 中常见的类型转换包括:

  • 数字类型之间的转换:例如 intfloat64float64int
  • 字符串和数字之间的转换:使用 strconv 包进行转换。
  • 字符串和字节切片之间的转换。
  • 结构体和 JSON 之间的转换:使用 encoding/json 包。
  • 时间和字符串之间的转换:使用 time 包。
  • 类型断言:将接口类型转换为具体类型。
  • 数组和切片之间的转换:数组转切片较为简单,切片转数组需要手动处理。

在 Go 中,类型转换一般是显式的,需要使用适当的转换方式。


标题:go基本数据类型之间相互转换
作者:mooncakeee
地址:http://blog.dd95828.com/articles/2025/01/06/1736153967969.html
联系:scotttu@163.com