go数据类型转换

 

简单的转换操作

在必要以及可行的情况下,一个类型的值可以被转换成另一种类型的值。由于Go语言不存在隐式类型转换,因此所有的类型转换都必须显式的声明:

valueOfTypeB = typeB(valueOfTypeA)

类型转换只能在定义正确的情况下转换成功,例如从一个取值范围较小的类型转换到一个取值范围较大的类型(将 int16 转换为 int32)。当从一个取值范围较大的类型转换到取值范围较小的类型时(将 int32 转换为 int16 或将 float32 转换为 int),会发生精度丢失(截断)的情况。

实例

以下实例中将整型转化为浮点型,并计算结果,将结果赋值给浮点型变量:

   var sum int = 17
   var count int = 5
   var mean float32   
   mean = float32(sum)/float32(count)
   fmt.Printf("mean 的值为: %fn",mean)

只有相同底层类型的变量之间可以进行相互转换(如将 int16 类型转换成 int32 类型),不同底层类型的变量相互转换时会引发编译错误(如将 bool 类型转换为 int 类型)

Sprintf

fmt的sprintf方法也提供了一些简单的将其他数据类型转为string类型的操作

注意:sprintf 使用中需要注意转换的格式 int 为%d float 为%f bool 为%t byte 为%c

  • int转成string:
var i int = 20
strs = fmt.Sprintf("%d", i)
  • byte转string:
var b byte = 'a'

strs = fmt.Sprintf("%c", b)
  • bool转string:
var t bool = true
strs = fmt.Sprintf("%t", t)
  • float64转string:
var f float64 = 12.456
strs = fmt.Sprintf("%f", f)

strconv

strconv包提供了字符串与简单数据类型之间的类型转换功能。可以将简单类型转换为字符串,也可以将字符串转换为其它简单类型。

这个包里提供了很多函数,大概分为几类:

  • 字符串转int:Atoi()
  • int转字符串: Itoa()
  • ParseTP类函数将string转换为TP类型:ParseBool()、ParseFloat()、ParseInt()、ParseUint()。因为string转其它类型可能会失败,所以这些函数都有第二个返回值表示是否转换成功
  • FormatTP类函数将其它类型转string:FormatBool()、FormatFloat()、FormatInt()、FormatUint()
  • AppendTP类函数用于将TP转换成字符串后append到一个slice中:AppendBool()、AppendFloat()、AppendInt()、AppendUint()

还有其他一些基本用不上的函数,见官方手册:https://golang.org/pkg/strconv/。

当有些类型无法转换时,将报错,返回的错误是strconv包中自行定义的error类型。有两种错误: var ErrRange = errors.New("value out of range") var ErrSyntax = errors.New("invalid syntax")

例如,使用Atoi("a")将"a"转换为int类型,自然是不成功的。如果print输出err信息,将显示:

strconv.Atoi: parsing "a": invalid syntax

Format类函数

将给定类型格式化为string类型:FormatBool()、FormatFloat()、FormatInt()、FormatUint()。

  • int 转换成 string
var num1 int = 20
s1 := strconv.Itoa(num1)
fmt.Printf("str type %T ,strs=%v \n", s1, s1)
  • int64转成string
var num2 int64 = 200
s2 := strconv.FormatInt(num2, 10)
fmt.Printf("str type %T ,strs=%v \n", s2, s2)
  • float 转 string
/*
参数 1:要转换的值
参数 2:格式化类型
'f'(-ddd.dddd)、
'b'(-ddddp±ddd,指数为二进制)、
'e'(-d.dddde±dd,十进制指数)、
'E'(-d.ddddE±dd,十进制指数)、
'g'(指数很大时用'e'格式,否则'f'格式)、
'G'(指数很大时用'E'格式,否则'f'格式)。
参数 3: 保留的小数点 -1(不对小数点格式化)
参数 4:格式化的类型
*/
var num3 float64 = 20.113123
s2 := strconv.FormatFloat(num2,'f',6,64)
fmt.Printf("str type %T ,strs=%v \n", s2, s2)
  • bool 转 string
s4 := strconv.FormatBool(true)
fmt.Printf("str type %T ,strs=%v \n", s4, s4)

Parse类函数

Parse类函数用于转换字符串为给定类型的值:ParseBool()、ParseFloat()、ParseInt()、ParseUint()。

由于字符串转换为其它类型可能会失败,所以这些函数都有两个返回值,第一个返回值保存转换后的值,第二个返回值判断是否转换成功。

string转成int:

int, err := strconv.Atoi(string)

string转成int64:

int64, err := strconv.ParseInt(string, 10, 64)

string转成uint64:

uint64, err := strconv.ParseUint(string, 10, 64)

Append类函数

AppendTP类函数用于将TP转换成字符串后append到一个slice中:AppendBool()、AppendFloat()、AppendInt()、AppendUint()。

Append类的函数和Format类的函数工作方式类似,只不过是将转换后的结果追加到一个slice中。

// 声明一个slice
b10 := []byte("int (base 10):")
  
// 将转换为10进制的string,追加到slice中
b10 = strconv.AppendInt(b10, -42, 10)
fmt.Println(string(b10))

b16 := []byte("int (base 16):")
b16 = strconv.AppendInt(b16, -42, 16)
fmt.Println(string(b16))

 

参考:

https://blog.csdn.net/m0_38132420/article/details/78196933

https://www.cnblogs.com/shuiyuejiangnan/p/9707066.html

https://studygolang.com/articles/24559

https://www.cnblogs.com/f-ck-need-u/p/9863915.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值