- 全局变量声明但不赋值的时候必须要声明其类型, 因为编译器没有可以推断其类型的依据
var a // 错误
var a string // 正确
var a = "abc" // 正确
var a string = "abc" // 正确
- 局部变量的声明可以使用 := 简写, 并且编译器会根据值的类型自动推断其类型, 但是不能进行二次声明. 更重要的是声明的局部变量不能不使用
func test(){
a := 1
return
// 错误, 因为 a 并没有被使用
}
- 常亮的声明,对应的值必须是在编译期间就能够得到的. 即不能将常量设置为一个函数的输出(內建函数除外). 但可以是一个数学表达式, 因为数学表达式编译期间可以计算
// 示例1:
func main() {
const a = t() //错误, 编译期间并不能得到常亮的值
}
func t() int {
return 1
}
// 示例2:
func main() {
const a = 2 + 3
print(a)
}
// 正确
- 变量的相等比较: go语言中必须是相同类型的值才可以进行比较. 如果一个变量对应的值是一个接口interface, 那么另外一个变量也必须是实现了相同接口的interface
- 数字类型的长度问题
int 和 uint 在 32 位操作系统上,它们均使用 32 位(4 个字节),在 64 位操作系统上,它们均使用 64 位(8 个字节)。
uintptr 的长度被设定为足够存放一个指针即可。
Go 语言中没有 float 类型。(Go语言中只有 float32 和 float64)没有double类型
各种类型的大小
整数:
int8(-128 -> 127)
int16(-32768 -> 32767)
int32(-2,147,483,648 -> 2,147,483,647)
int64(-9,223,372,036,854,775,808 -> 9,223,372,036,854,775,807)
无符号整数:
uint8(0 -> 255)
uint16(0 -> 65,535)
uint32(0 -> 4,294,967,295)
uint64(0 -> 18,446,744,073,709,551,615)
浮点型(IEEE-754 标准):
float32(+- 1e-45 -> +- 3.4 * 1e38)
float64(+- 5 * 1e-324 -> 107 * 1e308)
int 型是计算最快的一种类型。
整型的零值为 0,浮点型的零值为 0.0。
float32 精确到小数点后 7 位,float64 精确到小数点后 15 位。由于精确度的缘故,你在使用 == 或者 != 来比较浮点数时应当非常小心。
你最好在正式使用前测试对于精确度要求较高的运算。
你应该尽可能地使用 float64,因为 math 包中所有有关数学运算的函数都会要求接收这个类型。
你可以通过增加前缀 0 来表示 8 进制数(如:077),增加前缀 0x 来表示 16 进制数(如:0xFF),
以及使用 e 来表示 10 的连乘(如: 1e3 = 1000,或者 6.022e23 = 6.022 x 1e23)。
局部变量你可以使用 a := uint64(0) 来同时完成类型转换和赋值操作,这样 a 的类型就是 uint64。
Go 中不允许不同类型之间的混合使用,但是对于常量的类型限制非常少,因此允许常量之间的混合使用,
下面这个程序很好地解释了这个现象(该程序无法通过编译):
package main
func main() {
var a int
var b int32
a = 15
b = a + a // 编译错误, 因为b是int32类型, a是int类型
b = b + 5 // 因为 5 是常量,可以被隐式转换为int32所以可以通过编译,
}
可以通过显示转换来解决不同类型的计算问题
package main
func main() {
var a int
var b int32
a = 15
b = int32(a + a)
print(b) // 30
}
6.算术运算问题
/ 对于整数运算而言,结果依旧为整数,例如:9 / 4 -> 2。
取余运算符只能作用于整数:9 % 4 -> 1。
浮点数除以 0.0 会返回一个无穷尽的结果,使用 +Inf 表示。
7.字符串问题
go 语言使用 utf-8 编码
字符串分为两类
解释型字符串 和 非解释型字符串
解释型:
使用双引号 "" 包括, 这里字符串在输出的时候会转义特殊字符(\n \t \r \u \\ 等 ), 比如 \n 输出的时候会换行而不是展示 \n
非解释型:
使用反引号 `` 包括, 特殊字符在输出的时候不会进行转义, 即 \n 会原样输出
可以通过 len() 方法来获取字符串的长度(注意这个长度不是有多少个汉字, 这里的长度输出的是字节长度)
使用 == != < <= > >= 在内存中按字节比较来实现字符串的对比
go字符串也支持标准索引,但需要注意的是这是纯字节操作:
如果是ASCII码字符串, 使用[]索引没有问题, 但如果是utf-8字符串得到的并不一定是你想要的结果
字符串 str 的第 1 个字节:str[0]
第 i 个字节:str[i - 1]
最后 1 个字节:str[len(str)-1]
还有 获取字符串中某个字节的地址的行为是非法的,例如:&str[i]
字符串的拼接使用+号完成
字符串format的各种 % 号含义
%v 打印结构体
%+v 打印结构体 带上结构体的字段名
%T 打印类型
%t 打印布尔
%d 打印整数
%b 打印二进制
%x 打印16进制
%f 打印浮点数
%e 打印科学计数法
%s 打印字符串
%q 打印双引号字符串, 即在填充字符串的时候,会自动的在填充字符串的位置两边添加双引号
%p 打印指针
%6d 打印字符宽度, 当数字不够长度时会在前面补充空格补充. %6s 一样的含义
%.4f 打印浮点数的精度, 当超过4位小数位时, 会进行四舍五入, 小于4位时后面会补充0
%-6s 左对齐, 在右侧补充长度