这个笔记不系统,只是记录我个人认为的一些有意义的技巧,防止忘记,故记录于此。
last update 2014-10-06
代码风格
语法
Go 是静态类型语言言,不能在运行行期改变变量类型。
Go语言和C语言一样,类型都是基于值传递的
range 会复制对象,比如对list [3]int{0, 1, 2}; 建议改用用引用用类型,其底层数据不会被复制,比如 []int{1, 2, 3, 4, 5}。另外两种引用用类型 map、channel 是指针包装,而不像 slice 是 struct。
滥用用 defer 可能会导致性能问题。
Add String() method for integers const values
数据结构
slice的cap是int. MaxInt
const MaxUint = ^uint(0)
const MinUint = 0
const MaxInt = int(MaxUint >> 1)
const MinInt = -MaxInt - 1
const MaxUint = ^uint(0)
const MinUint = 0
const MaxInt = int(^uint(0) >> 1)
const MinInt = -(int(^uint(0) >> 1) - 1)
字符处理相关
字符串可以用索引号访问某字节,如 s[i],其长度包含在数据结构中,所以获取长度很快。支持用两个索引号返回子串s[1:5]。子串依然指向原字节数组,仅修改了指针和⻓长度属性。
要修改字符串,可先将其转换成 []rune(unicode) 或 []byte,完成后再转换为换string。无论哪种转都会重新分配内存,并复制字节数组。
func DNAComplement(s string) string {
return strings.Map(func(r rune) rune {
switch r {
case 'a':
return 't'
...
}
return r
}, s)
}
其它
\p{Han}
`,更多:golang 的正则表达式中 \p 怎么用?bytes
Regexp
Flag
(?i)^n
)Memoizing Pure Functions。
A pure function is a function which always produces the same result for a giv-en argument or arguments—and that has no side effects. If a pure function is expensive to compute and frequently used with the same arguments, we can use memoization to reduce the processing overhead—at the price of using more memory. 比如用闭包来做 recursive Fibonacci algorithm,用cache保存各种情况下的值。
joining two slices: append([]int{1,2}, []int{3,4}…)