Golang Note

· Read in about 2 min · (267 Words)

这个笔记不系统,只是记录我个人认为的一些有意义的技巧,防止忘记,故记录于此。

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。无论哪种转都会重新分配内存,并复制字节数组。

strings包

  • strings.TrimRight(s, “\r\n”)删除换行和回车符。string.TrimSpace(s)去除两端的空白字符。
  • strings.HasPrefix(s, t),strings.HasSuffix(s, t)
  • strings.Repeat(s, i)
  • strings.Fields(s)。The []string that results in splitting s on white-space
  • strings.Map(mf, t)
func DNAComplement(s string) string {
    return strings.Map(func(r rune) rune {
        switch r {
        case 'a':
            return 't'
                ...
        }
        return r
    }, s)
}

其它

bytes

  • bytes.Compare(a, b []byte)

Regexp

Flag

  • i case-insensitive (default false) regexp.Compile((?i)^n)
  • m multi-line mode: ^ and $ match begin/end line in addition to begin/end text (default false)
  • s let . match \n (default false)
  • U ungreedy: swap meaning of x* and x*?, x+ and x+?, etc (default false)

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保存各种情况下的值。

Go的单例模式


joining two slices: append([]int{1,2}, []int{3,4}…)