当前位置: 首页 > news >正文

golang学习笔记5-基本数据类型的转换

注:本人已有C,C++,Python基础,只写本人认为的重点。
中文官方文档:https://studygolang.com/pkgdoc
一、基本数据类型的相互转换
和C/C++不同,在go中,不同类型的变量之间的赋值必须用显示转换,语法为:T(v),其中v为变量,T为目标数据类型。
强制(显示)转换的特点是:可以从小范围转到大范围,也可以反过来。大范围转小范围时,编译不会报错,但会溢出,结果会变,原理是溢出时,数值被自动截断了
练习1 判断以下两段代码,哪个会编译报错?
代码1

func main() {var n1 int32 = 12var n2 int64var n3 int8n2 = n1 + 20n3 = n1 + 20
}

代码2

func main() {var n1 int32 = 12var n2 int8var n3 int8n2 = int8(n1) + 127n3 = int8(n1) + 128
}

答案是都会报错:第一个显然是不同类型变量赋值,没有使用显示转换,第二个很细,n2的赋值会溢出但不会报错,但n3的计算中有128,超过了int8的上限,所以直接溢出报错。那么这里就涉及比较重要的一点:除了常量赋值时的溢出会报错,其他情况的溢出不会
二、基本数据类型转string
主要有两种方式,如下。
方式一:使用Sprintf函数(推荐)

package mainimport "fmt"func main() {var num1 int = 99var num2 float64 = 23.456var b bool = truevar myChar byte = 'a'var str stringstr = fmt.Sprintf("%d", num1)fmt.Printf("type %T value=%s\n", str, str)str = fmt.Sprintf("%f", num2)fmt.Printf("type %T value=%s\n", str, str)str = fmt.Sprintf("%t", b)fmt.Printf("type %T value=%v\n", str, str)str = fmt.Sprintf("%c", myChar)fmt.Printf("type %T value=%q\n", str, str)
}

其中%s和C语言一样,%q是额外加双引号。
方式二:使用strconv包

package mainimport ("fmt""strconv"
)func main() {var str stringvar num3 int = 99var num4 float64 = 23.456var b2 bool = true//传入参数默认int64,10表示十进制str = strconv.FormatInt(int64(num3), 10)fmt.Printf("type %T value=%q\n", str, str)// 说明:'f':格式,10:小数保留10位,64:float64str = strconv.FormatFloat(num4, 'f', 10, 64)fmt.Printf("type %T value=%q\n", str, str)str = strconv.FormatBool(b2)fmt.Printf("type %T value=%q\n", str, str)//strconv包中有一个函数Itoavar num5 int64 = 4567str = strconv.Itoa(int(num5)) //传入参数默认intfmt.Printf("type %T value=%q\n", str, str)
}

三、string转基本数据类型

package mainimport ("fmt""strconv"
)// 演示golang中string转成基本数据类型
func main() {var str string = "true"var b bool// b, _ = strconv.ParseBool(str)// 说明// 1. strconv.ParseBool(str) 函数会返回两个值 (value bool, err error)// 2. 因为我只想获取到 value bool ,不想获取 err 所以我使用_忽略b, _ = strconv.ParseBool(str)fmt.Printf("b type %T  b=%v\n", b, b)var str2 string = "1234590"var n1 int64var n2 intn1, _ = strconv.ParseInt(str2, 10, 64)n2 = int(n1)fmt.Printf("n1 type %T  n1=%v\n", n1, n1)fmt.Printf("n2 type %T n2=%v\n", n2, n2)var str3 string = "123.456"var f1 float64f1, _ = strconv.ParseFloat(str3, 64)fmt.Printf("f1 type %T f1=%v\n", f1, f1)//注意:如果转换不成功,默认为0var str4 string = "hello"var n3 int64 = 11n3, _ = strconv.ParseInt(str4, 10, 64) //n3=0fmt.Printf("n3 type %T n3=%v\n", n3, n3)
}

关于strconv的更多细节可参考官方文档,这里不做赘述。


http://www.mrgr.cn/news/33411.html

相关文章:

  • Transcipher:从对称加密到同态加密
  • 部署林风社交论坛/社交论坛linfeng-community遇到问题集合
  • 大数据:驱动企业变革的引擎
  • C++如何进阶? -- 整理一些学习资料
  • Mixamo动画使用技巧
  • 充电桩小程序系统开发源码
  • 黑马十天精通MySQL知识点
  • ollama设置开机启动服务
  • Tomcat靶场攻略
  • django应用JWT(JSON Web Token)实战
  • 使用 CMake 创建和调用动态库在 Windows 和 Ubuntu上的差异
  • 消息队列(MQ)消息堆积问题排查与解决思路
  • 华为HarmonyOS灵活高效的消息推送服务(Push Kit) -- 6 撤回通知消息
  • RAII技术
  • 点赞系统实现
  • python爬虫中json和xml字符串的xPath和jsonpath过滤语法区别对比
  • 深入浅出Docker
  • Spring_AMQP
  • Linux:进程(四)
  • 内核是如何发送数据包