这是我参与「第三届青训营 -后端场」笔记创作活动的的第 2 篇笔记
数据类型
Go 是静态类型语言, 一旦某个变量被声明, 那么其类型不能再被改变
浮点型变量
声明
float64为双精度浮点类型- 64 bit, 占用 8 byte 内存
- Java 中的
double math包中的函数操作均为float64类型
float32为单精度浮点类型- 占用 4 byte 内存
- 只要数字含有小数, 那么就是
float64类型 - 如果是整数想要声明为浮点型, 则需要指定类型为
float64
打印精度
- 使用
Print或Println打印浮点类型的时候, 默认的行为是尽可能的多显示几位小数 - 如果需要指定显示的位数, 需要使用
Printf函数和%f格式化动词
运算精度
- 浮点类型不适合用于金融计算
- 为了尽量最小化舍入错误, 建议先乘后除
比较浮点类型
可以使用 math/Abs , 比较差值是否足够小
整数型变量
- Go 中有 10 种整数类型
- 不可以存储小数部分
- 范围有限
- 通常根据数值范围来选取整数类型
- 5 种整数类型是有符号的 (signed)
- 能表示正整数, 0, 负整数
intint8int16int32int64
- 5 种整数类型是无符号的 (unsigned)
- 能表示正整数, 0
uintuint8uint16uint32uint64
int和uint取值由操作系统决定(32 bit / 64 bit)
uint8 适合用于表示 8 bit 颜色
- rgb 取值范围 0-255
- 如果很多颜色数据连续存储, 例如未被压缩的图片, 那么使用
uint8可以节省很多内存
十六进制表示
- 在数字前加
0x, 可以用十六进制的形式表示数字 - 打印十六进制的数, 使用
%x格式化动词%02x表示最小宽度为 2, 不足 2 用 0 填充
整数环绕
- 赋值超出整数取值范围会发生「环绕」
大数存储
- 使用
int64 - 使用
uint64(更大的正数) - 使用浮点类型 (精度不高)
使用科学计数法, 如
24e10声明变量时, 默认为float64类型
使用 big 包
big.Int- 较大整数 ()
- 使用
int64创建 - 使用字符串创建
big.Float- 任意精度的浮点类型
big.Rat- 分数
大数常量
- Go 中不指明变量类型, 会使用类型推断
- 常量可以是无类型的(untyped)
字符串类型
string
- 可一个给某个变量赋予不同的
string值 - 但是
string本身是不可变的- 与 Java 相同
- 本质是字符数组
len
- 返回字符串所占
byte数- 如果字符都用
utf-8编码, 则返回字符串长度
- 如果字符都用
- 使用
utf-8包, 可以按rune计算字符串长度
RuneCountInString
- 返回字符串长度(以
rune计)
DecodeRuneInString
- 返回第一个字符以及字符所占字节数
Go中的函数可以返回多个值
range 关键字
- 使用
range关键字可以遍历各种集合-
使用
_缺省str := "Hello world" for _, c := range str { fmt.Printf("%c\n", c) }
-
字符串字面值
- 可以包含转义字符
- 如果希望得到原始字符而不是转移, 可以使用反引号
`代替"
字符类型
- 字符字面值使用
'括起来 - 如果没有指定字符类型, 那么 Go 会推断它的类型为
rune
类型别名
- Unicode 联盟为超过 100 万个字符分配了相应的数值, 这个数叫做 code point
- 为了表示这样的 uncode code point , Go 语言提供了
rune类型, 它是int32的一个类型别名 byte是uint8的别名- 可以表示 ASCII 定义的英语字符, 是 Unicode 的一个子集 (共 128 个字符)
- 可以使用
type关键字自定义类型别名
打印数据类型
- 在
Printf中使用%T打印数据类型
默认值
- Go 里面每个类型都有一个默认值, 它称作零值
- 声明变量但不初始化, 其值为零值
类型转换
不能混用类型
-
使用
+连接字符串 -
不能连接字符串和数值
- 报错
str := "Hello" + 10 + " World"- Java 中可以这么写
- 报错
-
整形和浮点类型不能混用
-
浮点类型转换为小数类型, 小数点后面的部分会被截断
-
无符号和有符号整数类型之间需要转换
-
大小不同的整数类型之间需要转换
- 转换时超出类型容纳范围也会发生「环绕」
- 可以通过
math包下的maxmin常量判断是否超过范围
-
数值转化为
string, 其值必须能转化为code point- 不会报错, 但是会输出乱码
-
strconv包下的Itoa(Integer to ASCII)可以将数值转换为字符串 -
也可以使用
Sprintf- 这个函数返回一个
string, 不想控制台打印字符串
- 这个函数返回一个
-
Atoi(ASCII to integer)函数可以将字符串表示的数值转换为int数值- 如果要转换的数值过大, 可能会发生错误
- 这个函数返回两个结果, 转换的数值和
err, 如果err == nil就是没有发生错误nil就是 Java 中的null
-
Print这一类函数会把bool类型的值打印为trueflase的string -
Go 语言中
bool类型只能是true/false不能把 1 / 0 作为true/false