Go语言基本数据类型(3)

目录

编码

UNICODE

UTF-8

基本数据类型

字符串


编码

UNICODE

起初计算机世界就只有一个ASCII字符集:美国信息交换标准代码。ASCII,更准确地说是美国的ASCII,使用7bit来表示128个字符:包含英文字母的大小写、数字、各种标点符号和设备控制符。对于早期的计算机程序来说,这些就足够了,但是这也导致了世界上很多其他地区的用户无法直接使用自己的符号系统。随着互联网的发展,混合多种语言的数据变得很常见(译注:比如本身的英文原文或中文翻译都包含了ASCII、中文、日文等多种语言字符)。如何有效处理这些包含了各种语言的丰富多样的文本数据呢?答案就是使用Unicode( http://unicode.org ),它收集了这个世界上所有的符号系统包括重音符号和其它变音符号,制表符和回车符,还有很多神秘的符号,每个符号都分配一个唯一的Unicode码点,Unicode码点对应Go语言中的rune整数类型。

UTF-8

我们可以将一个符文序列表示为一个int32序列。这种编码方式叫UTF-32或UCS-4,每个Unicode码点都使用同样的大小32bit来表示。这种方式比较简单统一,但是它会浪费很多存储空间,因为大数据计算机可读的文本是ASCII字符,本来每个ASCII字符只需要8bit或1字节就能表示。而且即使是常用的字符也远少于65,536个,也就是说用16bit编码方式就能表达常用字符。但是,还有其它更好的编码方法吗?

UTF8是一个将Unicode码点编码为字节序列的变长编码。UTF8编码由Go语言之父Ken Thompson和Rob Pike共同发明的,现在已经是Unicode的标准。UTF8编码使用1到4个字节来表示每个Unicode码点,ASCII部分字符只使用1个字节,常用字符部分使用2或3个字节表示。每个符号编码后第一个字节的高端bit位用于表示总共有多少编码个字节。如果第一个字节的高端bit为0,则表示对应7bit的ASCII字符,ASCII字符每个字符依然是一个字节,和传统的ASCII编码兼容。如果第一个字节的高端bit是110,则说明需要2个字节;后续的每个高端bit都以10开头。更大的Unicode码点也是采用类似的策略处理。

  • 0xxxxxxx runes 0-127 (ASCII)
  • 110xxxxx 10xxxxxx 128-2047 (values <128 unused)
  • 1110xxxx 10xxxxxx 10xxxxxx 2048-65535 (values <2048 unused)
  • 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx 65536-0x10ffff (other values unused)

基本数据类型

Go语言将数据类型分为四类:基础类型复合类型引用类型接口类型

基础类型包括:数字、字符串和布尔型。布尔型的值只可以是常量 true 或者 false。数字类型支持整型和浮点型,并且支持复数,其中位的运算采用补码。复合数据类型包括:数组、结构体是通过组合简单类型,来表达更加复杂的数据结构。引用类型包括:指针、slice、map、 channel、接口和函数类型。当声明引用类型的变量时,创建的变量被称作标头(header)值。从技术细节上说,字符串也是一种引用类型。每个引用类型创建的标头值是包含一个指向底层数据结构的指针。每个引用类型还包含一组独特的字段,用于管理底层数据结构。因为标头值是为复制而设计的,所以永远不需要共享一个引用类型的值。标头值里包含一个指针,因此通过复制来传递一个引用类型的值的副本,本质上就是在共享底层数据结构。

  • bool;true, false
  • int(32位或64位)
    • int8 有符号 8 位整型 (-128 到 127)
    • int16 有符号 16 位整型 (-32768 到 32767)
    • int32 有符号 32 位整型 (-2147483648 到 2147483647)
    • int64 有符号 64 位整型 (-9223372036854775808 到 9223372036854775807)
  • uint (32位或64位)
    • uint8 无符号 8 位整型 (0 到 255)
    • uint16 无符号 16 位整型 (0 到 65535)
    • uint32 无符号 32 位整型 (0 到 4294967295)
    • uint64 无符号 64 位整型 (0 到 18446744073709551615)
  • string (utf8编码的Unicode文本,英文1个字节,中文3个字节)
    • “hello world 你好,中国”
  • byte    uint8 的别名(unsigned char)一般用于强调数值是一个原始的数据而不是一个小的整数
  • rune     int32 的别名,代表一个Unicode码
  • uintptr    无符号整型,用于存放一个指针,没有指定具体的bit大小但是足以容纳指针。uintptr类型只有在底层编程时才需要,特别是Go语言和C语言函数库或操作系统接口相交互的地方。
  • 浮点数
    • float32 IEEE-754 32位浮点型数
    • float64 IEEE-754 64位浮点型数

浮点数的范围极限值可以在math包找到。常量math.MaxFloat32表示float32能表示的最大数值,大约是 3.4e38;对应的math.MaxFloat64常量大约是1.8e308。它们分别能表示的最小值近似为1.4e-45和4.9e-324。

const Avogadro = 6.02214129e23 // 阿伏伽德罗常数 

const Planck = 6.62606957e-34 // 普朗克常数
  • 复数
    • complex64 32 位实数和虚数
    • complex128 64 位实数和虚数

字符串

package main

import (
	"fmt"
	s "strings"
)

func main() {
	s1 := "hello world,你好,世界"
	fmt.Println(len(s1))

	fmt.Println(s.Contains(s1, "orld"))     //查看字符串是否包含子串,返回bool
	fmt.Println(s.Count(s1, "o"))           //子串在主串中出现的个数
	fmt.Println(s.HasPrefix(s1, "he"))      //查看主串是否是以子串开头的
	fmt.Println(s.HasSuffix(s1, "rld")) //查看主串是否是以子串结尾的,
                                         //用途:文件扩展名
	fmt.Println(s.Index(s1, "orl"))  //子串在主串中的位置,没有返回-1
	s2 := s.Join([]string{"hello", "world"}, "-") //字符串拼接
	fmt.Println(s2)

	s3 := s1 + "china"
	fmt.Println(s3)

	s2 = s.Repeat("abb", 5) //字符串重复拼接
	fmt.Println(s2)

	s2 = s.Replace(s1, "o", "O", 1) //字符串替换,返回新的字符串
	fmt.Println(s2)

	ip := "192.168.1.1"
	fields := s.Split(ip, ".") //字符串拆分
	fmt.Println(fields)
	for _, value := range fields {
		fmt.Println(value)
	}

	fmt.Println(s.ToUpper(s1)) //转化为大写
	fmt.Println(s.ToLower(s1)) //转化为小写

	buf1 := []byte(s1) //字符串按字节转化为buff
	buf2 := []rune(s1) //按照4个字节为单位组成unicode编码

	s3 = string(buf1) //buff转化为字符串
	s4 := string(buf2)
	fmt.Println(s3, s4)
}
output:
27
true
2
true
false
7
hello-world
hello world,你好,世界china
abbabbabbabbabb
hellO world,你好,世界
[192 168 1 1]
192
168
1
1
HELLO WORLD,你好,世界
hello world,你好,世界
hello world,你好,世界 hello world,你好,世界

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值