上卷 程序设计
中卷 标准库
- bufio 1.18
- bytes 1.18
- io 1.18
- container 1.18
- encoding 1.18
- crypto 1.18
- hash 1.18
- index 1.18
- sort 1.18
- context 1.18
- database 1.18
- connection
- query
- queryrow
- exec
- prepare
- transaction
- scan & null
- context
- tcp
- udp
- http
- server
- handler
- client
- h2、tls
- url
- rpc
- exec
- signal
- embed 1.18
- plugin 1.18
- reflect 1.18
- runtime 1.18
- KeepAlived
- ReadMemStats
- SetFinalizer
- Stack
- sync 1.18
- atomic
- mutex
- rwmutex
- waitgroup
- cond
- once
- map
- pool
- copycheck
- nocopy
- unsafe 1.18
- fmt 1.18
- log 1.18
- math 1.18
- time 1.18
- timer
下卷 运行时
源码剖析
附录
文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
5.3.1 应用
切片除作为非正式 “数组指针” 外,还充当 动态数组 或 向量 (vector)角色。
当然,更可实现一些常用数据结构。
// FILO: 先进后出,栈。 type Stack []int func NewStack() *Stack { s := make(Stack, 0, 10) return &s } func (s *Stack) Push(v int) { *s = append(*s, v) } func (s *Stack) Pop() (int, bool) { if len(*s) == 0 { return 0, false } x, n := *s, len(*s) v := x[n - 1] *s = x[:n - 1] return v, true } // --------------------------- func main() { s := NewStack() // push for i := 0; i < 5; i++ { s.Push(i + 10) } // pop for i := 0; i < 7; i++ { fmt.Println(s.Pop()) } } /* 14 true 13 true 12 true 11 true 10 true 0 false 0 false */
// FIFO:先进先出,队列。 type Queue []int func NewQueue() *Queue { q := make(Queue, 0, 10) return &q } func (q *Queue) Put(v int) { *q = append(*q, v) } func (q *Queue) Get() (int, bool) { if len(*q) == 0 { return 0, false } x := *q v := x[0] // copy(x, x[1:]) // *q = x[:len(x) - 1] *q = append(x[:0], x[1:]...) // 等同上两行。 return v, true } // --------------------------- func main() { q := NewQueue() // put for i := 0; i < 5; i++ { q.Put(i + 10) } // get for i := 0; i < 7; i++ { fmt.Println(q.Get()) } } /* 10 true 11 true 12 true 13 true 14 true 0 false 0 false */
容量固定,且无需移动数据的环状队列。
import ( "log" "sync" "math/rand" "time" ) type Queue struct { sync.Mutex data []int head int tail int } func NewQueue(cap int) *Queue { return &Queue{ data: make([]int, cap) } } func (q *Queue) Put(v int) bool { q.Lock() defer q.Unlock() if q.tail - q.head == len(q.data) { return false } q.data[q.tail % len(q.data)] = v q.tail++ return true } func (q *Queue) Get() (int, bool) { q.Lock() defer q.Unlock() if q.tail - q.head == 0 { return 0, false } v := q.data[q.head % len(q.data)] q.head++ return v, true } // --------------------------- func main() { rand.Seed(time.Now().UnixNano()) const max = 100000 src := rand.Perm(max) // 随机测试数据。 dst := make([]int, 0, max) q := NewQueue(6) // ------------------------ var wg sync.WaitGroup wg.Add(2) // put go func() { defer wg.Done() for _, v := range src { for { if ok := q.Put(v); !ok { continue } break } } }() // get go func() { defer wg.Done() for len(dst) < max { if v, ok := q.Get(); ok { dst = append(dst, v) continue } } }() wg.Wait() // 转换成数组进行比较。 if *(*[max]int)(src) != *(*[max]int)(dst) { log.Fatalln("fail !!!") } log.Printf("%+v\n", *q) } // {data:[99011 52214 53425 10572 82360 78821] head:100000 tail:100000}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论