# ARTS 第13周

[TOC]

### Algorithm

#### 难度：[easy]

[参考代码]

type heroNode2 struct {
No       int
Name     string
NickName string
front    *heroNode2
next     *heroNode2
}
}

func NewHero2(no int, name, nickName string) *heroNode2 {
return &heroNode2{No: no, Name: name, NickName: nickName}
}

}

for tmp.next != nil {
tmp = tmp.next
}
hero.front = tmp
tmp.next = hero
}

flag := false
for {
if tmp.No == hero.No {
fmt.Println("have this Node...")
return
} else if tmp.No > hero.No {
flag = true
break
}
if tmp.next == nil {
break
}
tmp = tmp.next
}
if flag {
tmp.front.next = hero
hero.front = tmp.front
tmp.front = hero
hero.next = tmp
} else {
tmp.next = hero
hero.front = tmp
}
}

fmt.Println("empty double list")
return
}

for tmp != nil {
fmt.Printf("No: %d\tName: %s\tNickName: %s\n", tmp.No, tmp.Name, tmp.NickName)
tmp = tmp.next
}
}

func (d *DoubleLinkList) delete(hero *heroNode2) {
fmt.Println("empty double list")
return
}
flag := false
for tmp != nil {
if tmp.No == hero.No {
flag = true
break
}
}
if flag {
tmp.front.next = tmp.next
if tmp.next != nil {
tmp.next.front = tmp.front
}
} else {
fmt.Println("doesn't have this hero...")
}
}

func (d *DoubleLinkList) update(hero *heroNode2) {
fmt.Println("empty double list")
return
}
for tmp != nil {
if tmp.No == hero.No {
tmp.Name = hero.Name
tmp.NickName = hero.NickName
break
}
tmp = tmp.next
}
}

func (d *DoubleLinkList) count() int {
count := 0
for tmp.next != nil {
count++
tmp = tmp.next
}
return count
}

return
}
//遍历这个list，将每一元素取出，插入新list的头结点后面
pNext := pCur.next
for {
fmt.Println(pCur, pNext)

fmt.Println("first---------")
newDouble.list()
fmt.Println("----------")
d.list()
} else {
newDouble.list()
}

pCur = pNext
if pCur == nil {
break
}
pNext = pNext.next
}
log.Fatal()
}

func (d *DoubleLinkList) reIndex(num int) *heroNode2 {
return nil
}
if d.count()-1 < num {
fmt.Println("invalid index")
return nil
}
for tmp.next != nil {
tmp = tmp.next
}
for i := 0; i < num; i++ {
tmp = tmp.front
}
return tmp
}

return
}
for tmp.next != nil {
tmp = tmp.next
}
fmt.Printf("No: %d\tName: %s\tNickName: %s\n", tmp.No, tmp.Name, tmp.NickName)
tmp = tmp.front
}
}

d.reverse()
d.list()
d.reverse()
}

### Review

Error Handling In Go, Part I https://www.ardanlabs.com/blog/2014/10/error-handling-in-go-part-i.html

### Share

mysql 缓冲池(buffer pool)： https://mp.weixin.qq.com/s/nA6UHBh87U774vu4VvGhyw

1.把页加到缓冲池（插入老生代头部）；
2.从页里读出相关的row（插入新生代头部）；

MySQL缓冲池加入了一个“老生代停留时间窗口”的机制：
（1）假设T=老生代停留时间窗口；
（2）插入老生代头部的页，即使立刻被访问，并不会立刻放入新生代头部；
（3）只有满足“被访问”并且“在老生代停留时间”大于T，才会被放入新生代头部；

（1）缓冲池(buffer pool)是一种常见的降低磁盘访问的机制；
（2）缓冲池通常以页(page)为单位缓存数据；
（3）缓冲池的常见管理算法是LRU，memcache，OS，InnoDB都使用了这种算法；
（4）InnoDB对普通LRU进行了优化：

### 本周阅读

第4周：1, 2, 3, 4,

Go 语言中的错误处理 - 第二部分：https://mp.weixin.qq.com/s/nxtEB6q3jophnnnvQaYNDA

Error Handling In Go, Part I: https://www.ardanlabs.com/blog/2014/10/error-handling-in-go-part-i.html