const
-
定义常量使用const关键字,定义之后不能修改,不能再次赋值,在程序运行期间不会改变。
-
单常量是 const pi=1
-
批量声明
-
const ( statusOk = 200 notFound = 404 serverError = 500 ) - 如果某一行没有显式声明,就和上一行一致(一致到从下往上找,与找到的=的值一致)
-
-
其他
- 字面量:没有出现变量名,直接出现了值,基础类型的字面量相当于时常量
iota
- iota是Go语言的一个预定义标识符,它表示的是const声明块(包括单行声明)中每个常量所处位置在块中的偏移值(从零开始)。
- 在const关键字出现时将被重置为0
- const中每增加一行常量声明,将使 iota 计数一次(包括下划线(_))
- 从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很像解释型语言,但它实际上是编译型语言