美文网首页go
1. go语言注意事项

1. go语言注意事项

作者: 陆_志东 | 来源:发表于2019-12-11 20:31 被阅读0次
    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 左对齐, 在右侧补充长度
    

    相关文章

      网友评论

        本文标题:1. go语言注意事项

        本文链接:https://www.haomeiwen.com/subject/mhuagctx.html