golang中的格式化说明符

打印数字时,需要考虑如何把数值转换为字符串,这就是数字的格式化,或者称为格式化打印

 %d 用于格式化整型,%x  %X用于格式化16机制表示的数字

%g用于格式化浮点型,%f输出浮点型,%e输出科学计算表示法

%0d用于规定输出定长的整型,其中开头的数字0是必须的

%n.mg用于表示数字n,并精确到小数点后m位,除了人使用g之外,还可以使用e,f例如使用格式化字符串%5.2e来输出3.4结果为3.40e+00

既然字符串是基本数据类型,数组是复合类型最基本的类型,介绍字符串和数组。切片是go语言中最常用的复合类型,类似于其他语言中的队列,map则是go语言中的字典,与引用类型结合使用可以满足大多数需求。因为go语言没有对象和类的概念,所以封装思想主要通过复合类型来实现,比如结构体。

字符串和数组,字符串和数组在go语言的底层存储上都是一样的。数组是具有一定长度且元素数据类型相同的序列,数组的长度是固定。当我们吧数组a赋值给数组b的时候,这个值是完全赋值的,并不是其他语言中引用的传递,所以为了提高此方面的性能要用到指针,但实际操作中一般使用slice,因为slice更为灵活。

zifuc字符串就是一种特殊的数组,特殊之处在于字符串是只读的,数组的长度虽然是固定的,但我们可以通过下标的方式比如a[i],进行值的读写,使具体元素值发生变化。而字符串的长度和具体元素值都是不可变的,字符串可以理解为固定长度且元素不可变的字节数。字符串的赋值是需要注意的地方,比如在对s1,s2这两个字符串进行s1=s2的赋值操作时,本质不会进行赋值,仅会传递字符串的地址和字节长度,因为字符串不可变,就没必要再复制一份了

字符串一般用来存放可读字符,因为go源码要求UTF-8编码,所以一般将字符串按照UTF-8的rune序列来理解。实际上字符串对应的字节序列,存储byte类型的0值也是可以的。此外还可以在字节内存储GBK编码,当然是多个字节对应一个编码,此处将对应字符串理解为字节序列更为准确。

字符串本质上是不可变的字节序列,for  range并不支持非UTF-8编码的遍历,因为程序不知道几个字节对应的一个字符,再者len()函数在go语言中返回的字符串字节数而非字符个数。对于字符串,go语言在reflect.stringHeader的结构体内有如下定义:

    type  StringHeader struct {

    Data  uintptr  

 Len int 

}

类型uintptr 就是指针,用来存放字符串的地址

 第8行打印出来的104和100 就是h和d 两个字符

第9行至第11行,是生成一个新串,如果不写开始的下标默认就是0,不写结束的下标就默认是到最后一个字符,如果是s[i:j]则表示左闭右开的取得字符。后面形式的新串和原来的字符串是公用内存的,新串只是记录地址和长度

介绍完字符串的这些特点,再来介绍UTF-8,unicode和字节的关系,这些概念是处理字符串的理论基础。

对于最初的计算机字符集理论上ASCII编码就够用了,他有128个字符,英文的大小写字母,数字,各种标点,和控制符。不够随着计算机行业的高速发展,如果有一种字符集能够支持所有的语言,那么在程序处理时会更高效,Unicode应运而生。UTF-8是unicode标准是一种具体表现,其特点是字符长度可变,长度为1到字节不等,以内具有这个特点,所以塔可以无缝对接ASCII码,如果UTF-8编码的第一个bit位是0,那么长度为一个字节,即只使用第一字节剩下的7位存储字符,这正好能覆盖ASCII字符集。如果UTF-8编码的前两个bit位是10,则表示长度为两个字节,第二个字节以0开头,对于三个字节的UTF-8码,这三个字节对应的bit位分别是110.10.0这种方式可以压缩字符存储长度。

因为字符串与字节之间存在这种不确定的长度关系,且有可能出现字节损坏或者非UTF-8编码,所以对于字符串的操作,使用strings :提供搜索,比较,切分与字符串连接等功能

bytes:如果要对字符串的底层字节进行操作,可以使用[]bytes转换类型后处理s

strconv:主要是字符串与其他类型的转换,比如int,布尔

unicode:主要是对字符串中的每个字符做判断,比如IsLetter ,IsDigit,IsUpper

字符串可以强制转为[]bytes  []rune 这两种类型进行处理,不管是哪种转换,系统都需要付出多分配一块内存的代价,可是如果需要对字符串进行新增字符等操作,转换到[]bytes后可以使用bytes.Buffer的writeRune方法;而转换到[]rune则会多做一些检查,会要求底层尽可能保持一致

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值