golang 类型转换

基本上就是 stringintfloatboolinterface{} 这几个类型互相转换

数字类型互转

数字类型可以直接通过同名的内置方法进行转换:

var numInt int = 6
var numFloat64 float64
var numFloat32 float32
numFloat64 = float64(numInt)
numInt = int(numFloat64)
numFloat32 = float32(numInt)
numInt = int(numFloat32)

strconv

这是一个专门做字符串相关类型转换的库,主要方法如下:

// 字符串 转 数字
func strconv.Atoi(s string) (int, error)
// 数字 转 字符串
func strconv.Itoa(i int) string

// 各种类型 转 字符串
func strconv.FormatBool(b bool) string
func strconv.FormatFloat(f float64, fmt byte, prec int, bitSize int) string
func strconv.FormatInt(i int64, base int) string
func strconv.FormatUint(i uint64, base int) string

// 字符串 转 各种类型
func strconv.ParseBool(str string) (bool, error)
func strconv.ParseFloat(s string, bitSize int) (float64, error)
func strconv.ParseInt(s string, base int, bitSize int) (i int64, err error)
func strconv.ParseUint(s string, base int, bitSize int) (uint64, error)

上述方法看定义就直到是干啥的了,要注意的是上边的参数中:base指的是进制,一般填10bitSize 指的是位数,浮点数只有 3264 可以填,整数可以填 08163264(填0和填32是一样的效果)

fmt.Sprintf

这个方法能将各种类型转换为字符串表示。

使用 fmt 包中的 Sprintf 方法。格式化输出字符串,其中可以根据类型写格式化占位符(如:%d 或者 %f 什么的),golang可以直接用 %v 占位符,可以将变量按值的本来值输出。

var varInt interface{} = 6
var varFolat interface{} = 6.6
var varBool interface{} = true
p := fmt.Sprintf("%v, %v, %v",varInt,varFolat,varBool)
fmt.Println(p)

// 6, 6.6, true

意思就是,你可以只拿一个 interface{} 类型的变量将其格式化成为字符串。

需要注意的是,如果使用 %f 占位符格式化 float64 类型,则输出的字符串会用0补全小数点后6位:

num := 4.48
str := fmt.Sprintf("%f", num)
fmt.Println(str)

// 4.480000

interface{} 类型转换

一般情况下,interface{} 转换为其他类型是直接在其后加 .(type)

// 假设拿到一个 interface{} 类型的变量,其中数据是数字 6
var unknown interface{} = 6

var num int

// num = unknown // 直接赋值会报错:cannot use unknown (variable of type interface{}) as int value in assignment

num = unknown.(int) // 类型转换后赋值
fmt.Println(num)

但是,如果我们不确定 unknown 是数字,那咋办呢?是有办法的。.(type)这种转换方式,可以返回两个值,第二个值就是转换是否成功:

var unknown interface{} = 6
var num int
num, ok := unknown.(int)
fmt.Println(num, ok)

// 6 true

如果类型不对,就是下面这种情况。

var unknown interface{} = 6
var num string
num, ok := unknown.(string)
fmt.Println(num, ok)

//  false

因此我们可以写出下述代码:

var unknown interface{} = 6
if num, ok := unknown.(int); ok {
    fmt.Printf("unknown 是 int 类型:%d \n", num)
} else {
    fmt.Println("unknown 不是 int 类型")
}

《golang 类型转换》有1条留言

发表评论

%d 博主赞过: