1. go语言注意事项

  1. 全局变量声明但不赋值的时候必须要声明其类型, 因为编译器没有可以推断其类型的依据
var a // 错误
var a string  // 正确
var a = "abc" // 正确
var a string = "abc" // 正确
  1. 局部变量的声明可以使用 := 简写, 并且编译器会根据值的类型自动推断其类型, 但是不能进行二次声明. 更重要的是声明的局部变量不能不使用
func test(){
  a := 1
  return
  // 错误, 因为 a 并没有被使用
}
  1. 常亮的声明,对应的值必须是在编译期间就能够得到的. 即不能将常量设置为一个函数的输出(內建函数除外). 但可以是一个数学表达式, 因为数学表达式编译期间可以计算
// 示例1:
func main() {
    const a = t() //错误, 编译期间并不能得到常亮的值
}
func t() int {
    return 1
}

// 示例2:
func main() {
    const a = 2 + 3
    print(a)
}
// 正确
  1. 变量的相等比较: go语言中必须是相同类型的值才可以进行比较. 如果一个变量对应的值是一个接口interface, 那么另外一个变量也必须是实现了相同接口的interface
  2. 数字类型的长度问题
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 左对齐, 在右侧补充长度
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。