字
字节笔记本
2026年2月22日
Go学习(三)Go基本数据类型总结
最近一直在写Go,但是一直都不是很明白Go的基础数据类型都有哪些,int,int32,int64都有,而且运算的时候还需要先转换,感觉使用起来很麻烦,所以特意看了一下官方文档深入了解一下Go相关的数据类型。
- 基本类型:boolean,numeric,string类型的命名实例是预先声明的。
- 复合类型:array,struct,指针,function,interface,slice,map,channel类型(可以使用type构造)。
Numeric types
int类型中哪些支持负数
- 有符号(负号):int8 int16 int32 int64
- 无符号(负号):uint8 uint16 uint32 uint64
浮点类型
浮点类型的值有float32和float64(没有 float 类型)
byte和rune特殊类型是别名
- byte就是uint8的别名
- rune就是int32的别名
int和uint取决于操作系统
- int和uint取决于操作系统(32位机器上就是32字节,64位机器上就是64字节)
- uint是32字节或者64字节
- int和uint是一样的大小
类型转换注意事项
为了避免可移植性问题,除了byte(它是uint8的别名)和rune(它是int32的别名)之外,所有数字类型都是不同的。在表达式或赋值中混合使用不同的数字类型时,需要转换。例如,int32和int不是相同的类型,即使它们可能在特定架构上具有相同的大小。
所以上面的文档解释了为什么int,int32,int64之间需要进行类型转换才能进行运算。
String types
字符串是不可变的:一旦创建,就不可能改变字符串的内容。预先声明的字符串类型是字符串。
可以使用内置函数len来发现字符串s的长度(以字节为单位的大小)。如果字符串是常量,则length是编译时常量。字符串的字节可以通过整数索引0到len(s)-1来访问。取这种元素的地址是非法的;如果s[i]是字符串的第i个字节,则&s[i]无效。
Map Types
初始容量不限制其大小:map增长以适应存储在其中的项目数,除了nil map。nil map等价于空map,不能添加元素。
go
make(map[string]int)
make(map[string]int, 100)int,int32,int64相互转换
int转换成int32,int64
go
// int转换成int32
i32 = int32(i)
// int转换成int64
i64 = int64(i)int32,int64转换成int
go
// int32转换成int
i = int(int32)
// int64转换成int
i = int(int64)实例测试
测试一:
go
package main
import (
"fmt"
)
func main() {
// 超出int32范围的值
var i64 int64 = 2147483647123
var i32 int32
var i int
// 转换不会损失精读(因为操作系统是64位,int就相当于int64)
i = int(i64)
// 转换会损失精读
i32 = int32(i64)
fmt.Println(i)
fmt.Println(i32)
fmt.Println(i64)
}结果如下:
text
2147483647123
-877
2147483647123测试二:
go
package main
import (
"fmt"
)
func main() {
var i64 int64
// 不超出int32范围的值
var i32 int32 = 21474836
var i int
// 转换不会损失精读
i = int(i32)
// 转换不会损失精读
i64 = int64(i32)
fmt.Println(i)
fmt.Println(i32)
fmt.Println(i64)
}结果如下:
text
21474836
21474836
21474836int和string相互转换
int,int32,int64转换成string
go
// 通过fmt.Sprintf方法转换(%d代表Integer,i可以是int,int32,int64类型)
str1 := fmt.Sprintf("%d", i)
// 通过strconv.Itoa方法转换(i是int类型)
str2 := strconv.Itoa(i)
// 通过strconv.FormatInt方法转换(i可以是int,int32,int64类型)
str3 := strconv.FormatInt(int64(i), 10)fmt.Sprintf实现:
go
// Sprint formats using the default formats for its operands and returns the resulting string.
// Spaces are added between operands when neither is a string.
func Sprint(a ...interface{}) string {
p := newPrinter()
p.doPrint(a)
s := string(p.buf)
p.free()
return s
}strconv.Itoa实现:
go
func Itoa(i int) string {
return FormatInt(int64(i), 10)
}strconv.FormatInt实现:
go
// FormatInt returns the string representation of i in the given base,
// for 2 <= base <= 36. The result uses the lower-case letters 'a' to 'z'
// for digit values >= 10.
func FormatInt(i int64, base int) string {
_, s := formatBits(nil, uint64(i), base, i < 0, false)
return s
}string转换成int,int32,int64
go
// string转换成int64
strInt64, _ := strconv.ParseInt(str, 10, 64)
// string转换成int32
strInt32, _ := strconv.ParseInt(str, 10, 32)
// 这里strInt32实际上还是int64类型的,只是截取了32位,所以最终还是要强转一下变成int32类型,如果不强转成int32是会编译报错的
var realInt32 int32 = 0
realInt32 := int32(strInt32)
// string转换成int
strInt, err := strconv.Atoi(str)参考文章
- https://my.oschina.net/goal/blog/196891
- https://golang.org/ref/spec#Numeric_types
- http://stackoverflow.com/questions/39442167/convert-int32-to-string-in-golang
分享: