Go语言基础补充学习 | 青训营

98 阅读3分钟

const

  • 定义常量使用const关键字,定义之后不能修改,不能再次赋值,在程序运行期间不会改变。

  • 单常量是 const pi=1

  • 批量声明

    • const ( 
          statusOk = 200 
          notFound = 404 
          serverError = 500 
      )
      
    • 如果某一行没有显式声明,就和上一行一致(一致到从下往上找,与找到的=的值一致)
  • 其他

    • 字面量:没有出现变量名,直接出现了值,基础类型的字面量相当于时常量

iota

  • iota是Go语言的一个预定义标识符,它表示的是const声明块(包括单行声明)中每个常量所处位置在块中的偏移值(从零开始)。
    1. 在const关键字出现时将被重置为0
    2. const中每增加一行常量声明,将使 iota 计数一次(包括下划线(_))
    3. 从0开始按一行往下计数
      • //声明中隐式重复的
        const ( 
            C0 = iota 
            C1
            _
            C3 
        )
        const ( 
            B = 1 << (10 * iota) // 1 (1 << 10 * 0) 
            KB // 1024 (1 << 10 * 1) 
            MB // 1048576 (1 << 10 * 2) 
            GB // 1073741824 (1 << 10 * 3) 
            TB // 1099511627776 (1 << 40 * 4) 
            PB // 1125899906842624 (1 << 50 * 5) 
        )
        

。 const ( AA, BB = iota + 1, iota + 2 //1 2 CC, DD //2,3,做一个顺延的的操作 )

      //可以显式转化
      const( 
          a = iota // int 
          b float32 = iota //float32 
          c = iota // int (如果不显示指定=iota,则类型和b相同) 
      )
      
      //位运算
      const ( 
          FlagNone = 0 // 0 
          FlagRead = 1 << iota // 2 
          FlagWrite // 4 
          FlagExec // 8 
      )
      ```
      
  • 枚举实现

    • 这是一种实现枚举类型的惯用方式:
      • 创建一个新的整数类型 如type WeekDay int
      • 使用 iota 列出其值,在第一行字段后面+WeekDay = iota
  • type

    • 非本地类型不能定义方法
    • 类型别名 type 别名 = Type
    • 定义函数的类型 type myfun func (int,int)(string),即你可以将myfun作为返回值类型
    • 新类型定义 type 类型名 Type
    • 定义接口和结构体

性能优化建议

  • 数据衡量一段代码,用go本身提供的benchmark(基准性能测试)
    • go test -bench=benchmem
  • 建议
    • 空结构体不占内存,节省资源,本身语义很强,仅作占位符

    • strings.Builder性能更优,直接将底层的[]byte转换成字符串返回,bytes.Buffer申请了新空间,前两者底层都是[]byte,因此加号凭借性能最差

    • map尽量预估好空间并进行分配make(map[int]int,size),不然会扩容增加内存拷贝和Rehash的消耗

    • Set实现可以用map代替,只需要用map的key即可,不过map会占用更多的字节空间

    • atomic包

      • 锁调用,操作系统,系统调用
      • atomic操作都是硬件实现,效率比锁高
      • sync.Mutex保护一段逻辑而不仅仅是一个遍历

总结

  • 更加熟悉go语言对做go项目是很有必要的
  • go很像解释型语言,但它实际上是编译型语言