一、go语言支持哪些数据类型?
Go语言支持丰富的数据类型,主要分为基本数据类型、复合数据类型和特殊数据类型三类:
- 基本数据类型:
- 布尔型(bool):取值为
true
或false
。 - 整数型:包括有符号整数(
int
、int8
、int16
、int32
、int64
)和无符号整数(uint
、uint8
、uint16
、uint32
、uint64
),其中int
和uint
的宽度取决于平台(32位或64位)。 - 浮点型:
float32
(32位)和float64
(64位),后者是默认浮点类型。 - 复数型:
complex64
(实部和虚部均为float32
)和complex128
(实部和虚部均为float64
)。 - 字符串型(string):UTF-8编码的不可变文本,本质是字节序列。
- 字节型:
byte
(uint8
的别名)和rune
(int32
的别名,用于存储Unicode字符)。
- 布尔型(bool):取值为
- 复合数据类型:
- 数组(array):固定长度的相同类型元素序列,长度是类型的一部分(如
[5]int
)。 - 切片(slice):可变长度的数组封装,支持动态扩容(如
[]int
)。 - 映射(map):键值对集合,键需为相同类型(如
map[string]int
),键唯一值可不唯一。 - 结构体(struct):用户自定义的聚合类型,可包含不同类型字段(如
type Point struct { X, Y int }
)。 - 指针(pointer):存储变量内存地址(如
*int
)。 - 函数(function):可作为类型传递(如
func(a int) int
)。 - 接口(interface):定义方法集合,实现多态(如
type Reader interface { Read() }
)。 - 通道(channel):用于协程(goroutine)间通信(如
chan int
)。
- 数组(array):固定长度的相同类型元素序列,长度是类型的一部分(如
- 特殊数据类型:
- 空值(nil):表示无值,常用于指针、切片等。
- 错误(error):内置接口类型,用于错误处理。
二、如何在Go中实现变量的类型转换?
在Go中,类型转换需显式操作,不支持隐式转换,主要方法包括:
- 显式类型转换(T(v)):
- 语法:
目标类型(表达式)
,例如将int
转为float64
:f := float64(42)
。 - 适用场景:数值类型间转换(如整型与浮点型),但需注意精度丢失(如
float
转int
会截断小数)。
- 语法:
- 使用
strconv
包处理字符串转换:- 字符串转基本类型:如
strconv.Atoi("123")
将字符串转为int
,返回值和错误信息。 - 基本类型转字符串:如
strconv.Itoa(123)
或strconv.FormatFloat(3.14, 'f', 2, 64)
。
- 字符串转基本类型:如
- 类型断言(针对接口类型):
- 语法:
value, ok := interfaceVar.(具体类型)
,例如从空接口interface{}
提取字符串:s, ok := i.(string)
。 - 失败时
ok
为false
,若忽略ok
可能触发panic
。
- 语法:
- 强制转换(需谨慎):
- 使用
unsafe.Pointer
实现跨类型指针转换,如newPtr := (*T2)(unsafe.Pointer(ptr))
,但可能引发安全问题。
- 使用
注意事项:
- 不兼容类型(如
float
转[]byte
)会编译失败。 - 字符串与
[]byte
可直接互转:b := []byte(s)
或s := string(b)
。