Go中数据类型分为四种:基础类型、聚合类型、引用类型、接口类型
1.整数
- 有符号整数分四种:8位(int8)、16位(int16)、32位(int32)、64位(int64)
- 有符号对应的无符号:uint8、unint16、unint32、unit64
-
int
和unit
.这两种类型的大小与编译器和硬件平台有关 -
rune
类型是int32
类型的同义词,常常用于指明一个值的Unicode码点.同样还有byte
和int8
类似 -
unitptr
是一种无符号整数,大小并不明确,但是足以存储指针.该类型仅仅用于底层编程,例如Go与C程序库或者操作系统的接口界面
2.浮点数
Go有两种浮点数float32
和float64
.绝大多数情况下优先选用float64.
3.复数
Go有两种大小的复数complex64
和complex128
,两者分别由float32
和float64
构成.
4.布尔值
bool
型的值只有两种可能:true
和false
5.字符串
字符串是不可变的字节序列,它可以包含任意数据,包括0值字节.需要注意一下几点:
- 内置的
len()
返回的是字符串的字节数(不是文字符号的数目) - 可以通过
s[i]
的方式获取第i+1
个字节的值.因为下标是从0
开始算的,所以需要+1
,所以下标的最大值为len(i)-1
(在s不为空串的情况下).越过下标取值将会抛出异常. -
s[i]
获取到的并不一定就是一个完整的字符.因为Go中的字符串是UTF-8编码.关于编
码的知识请参考ASCII,Unicode和UTF-8 - 子字符串操作
s[i:j]
将产生一个新的字符串,内容取自于原字符串的字节,下标从i(包括)
开始到j(不包括)
.字节的大小为j-i
- 不能通过
s[i] = 'a'
这种方式修改字符串的内容.因为字符串内容部的数据不允许修改.这代表两个字符串能安全的共用同一段底层内存,使得复制字符串开销降低.例如s
和s[0,6]
使用的同一段内存,他们不需要重新分配新的内存
字符串共用内存段
5.1字符串字面量
字符串可以直接写成字符串字面量
,形式就是使用双引号的总结序列.
有部分字符无法输入的可以通过转义序列写入,形式就是以\
开始.常用的有一下几种:
输入内容 | 含义 |
---|---|
\b | 退格符 |
\f | 换页符 |
\n | 换行符 |
\r | 回车符 |
\t | 指标符 |
\' | 单引号 |
\" | 双引号 |
\\ | 反斜杆 |
原生的字符串字面量的书写形式以``反引号,而不是使用单引号或者双引号.在原生的字符串字面量中,转义序列将失效.
5.2 字符串和字节slice
Go中对字符串操作提供了四个重要的包:bytes,strings,strconv和unicode
strings
包主要提供搜索,替换,比较,修整,切分与连接字符串等函数
bytes
包提供的函数与strings
类似,用户操作字节slicep(bytep[]类型)
strconv
包主要提供类型转换和为字符串去除添加引号等函数
unicode
包主要提供判别文字符号特征等函数.
5.3 字符串和数字相互转换
strconv
包可以相互转换数字和字符.
x,err := strconv.Atoi("123") //将字符串123转化成整数123
y,err := strconv.ParseInt("123",10,64) //转换成十进制整数,最长为64位
6.常量
常量是一种表达式,在编译阶段就能计算出表达式的值
,不需要等到运行时才知道它的值.所以常量本质上都属于基本类型:布尔,字符串或数字.
//声明一个float64类型的常量
const pi float64 = 3.1415926
//声明一个name常量,类型可以自己推导出来
const name = "tom"
//多个常量,还可以这样简写方便
const (
author = "莫言"
country string = "中国"
//内置函数len()计算常量的长度也是常量
l = len(country)
)
许多常量的就在编译时就能完成,某些错误通常要运行时才能检测到,但是操作数是常量,编译时就会报错.例如整数除以0,字符串下标越界,以及任何产生无限大值的浮点数运算.
对于常量操作数,所有数学运算,逻辑运算和比较运算的结果依然是常量.
6.1常量生成器iota
iota从0开始取值,逐项+1.例如下面代码:
type Weekday int
const(
Sundy Weekday = iota
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
)
上面的代码中,Sunday的值为,Monday的值为1,以此类推.
6.2无类型常量
虽然常量可以有任意一个确定的基础类型,例如int或float64,但是许多常量并没有一个明确的基础类型.编译器为这些没有明确的基础类型的数字常量提供比基础类型更高精度的算术运算.例如下面的例子:
package main
import "fmt"
//无类型常量
const pi = 3.1415926
func mian(){
var f1 float32 = 1.2
var f2 float64 = 1.3
// pi可以与f1(float32)相加
fmt.Println(f1 + pi)
// pi可以与f2(float64)相加
fmt.Println(f2 + pi)
// f1 + f2 相加编译不通过
}
网友评论