因为是指针所以要先将指针指到下一个元素再删。
错误写法(简洁,漂亮,但是。。。):
for e := l.Front(); e != nil; e = e.Next() {
l.Remove(e)
}
正确写法
var next *Element
for e := l.Front(); e != nil; e = next {
next = e.Next()
l.Remove(e)
}
// 看看具体实现代码(container/list.go)
func (l *List) remove(e *Element) *Element {
e.prev.next = e.next //当前元素前一个元素指向当前的下一个元素
e.next.prev = e.prev //当前元素下一个元素的上一个元素是当前元素的上一个元素
e.next = nil // avoid memory leaks 释放指针
e.prev = nil // avoid memory leaks
e.list = nil
l.len--
return e
}
Format 的时候 时间必须是 2006-01-02 15:04:05 ,奇葩时间。
原因:
这里写死了(time/format.go)
const (
ANSIC = "Mon Jan _2 15:04:05 2006"
UnixDate = "Mon Jan _2 15:04:05 MST 2006"
RubyDate = "Mon Jan 02 15:04:05 -0700 2006"
RFC822 = "02 Jan 06 15:04 MST"
RFC3339 = "2006-01-02T15:04:05Z07:00"
……
)
values := []string{"a", "b", "c"}
for _, v := range values {
go func() {
fmt.Println(v)
}()
}
time.Sleep(2*time.Second)
fmt.Println("end")
输出三个c,而不是顺序的a, b, c
//查找错误
values := []string{"a", "b", "c"}
for _, v := range values { //(1)
go func() { //(2)
fmt.Println(v) //隐式用v的地址传递
}()
}
(1)复用了临时变量,只有一个临时变量的空间
(2) 只是goroutine放到调度队列,不是立刻运行,还要排队先,等排到自己的时候,黄花菜已经凉了
解决
for _, v := range values {
go func(u string) {
fmt.Println(u)
}(v) //明确值复制,作为栈变量
}
类似的
list := make(map[int]*Link)
for _, lnk := range linktree {
list[lnk.Code] = &lnk
}
解决
list := make(map[int]*Link)
for _, lnk := range linktree {
var lnk = linktree
list[lnk.Code] = &lnk
}
当多个channel都处于就绪状态时,激活的channel是随机的
A Tour of Go: A select blocks until one of its cases can run, then it executes that case. It chooses one at random if multiple are ready
切勿想当然的认为先来后到
Golang没有直接的queue
可以预期queue长度的情况下用channel
无法预期长度是用list当作队列用
也可以根据实际情况,将list作为channel的二级队列(sometimes you may need it)
解决方案:
1.如果map的value较大,通常应该使用指针来存储,以避免性能问题,类似的还有channel,slice等
2.避免[]byte和string的反复来回转换
func (p *ConnectionPool) InitPool(size int, f FactoryMethod) {
p.conn = make(chan interface{}, size)
for i := 0; i < size; i++ {
p.conn <- f()
}
p.size = size
}
func (p *ConnectionPool) Get() interface{} {
return <-p.conn
}
func (p *ConnectionPool) Put(conn interface{}) {
p.conn <- conn
}