既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
package main
import (
"fmt"
"sync"
)
type Object struct {
// 可以添加更多属性
}
实现对象池
接下来,我们创建一个对象池结构体,它包含一个能够存放可用对象的缓冲通道。
type Pool struct {
idle chan \*Object
capacity int
}
我们还需要实现一个创建新池的方法。这个方法会预先填充池。
func NewPool(cap int) \*Pool {
p := &Pool{
idle: make(chan \*Object, cap),
capacity: cap,
}
for i := 0; i < cap; i++ {
p.idle <- &Object{} // 预先填充对象
}
return p
}
获取和回收对象
客户端可以通过这两个方法从池中获取和回收对象。
func (p \*Pool) Acquire() \*Object {
return <-p.idle // 从池中获取一个对象
}
func (p \*Pool) Release(obj \*Object) {
p.idle <- obj // 将对象归还到池中
}
测试对象池
最后,我们编写一个简单的程序来测试我们的对象池。
func main() {
pool := NewPool(2) // 创建一个容量为2的池
// 获取对象
obj1 := pool.Acquire()
fmt.Println("Acquired:", obj1)
// 获取第二个对象
obj2 := pool.Acquire()
fmt.Println("Acquired:", obj2)
// 尝试获取第三个对象,此时会阻塞,因为池已空
//go func() {
// obj3 := pool.Acquire()
// fmt.Println("Acquired:", obj3)
//}()
// 回收一个对象
pool.Release(obj1)
fmt.Println("Released:", obj1)
// 现在可以获取更多对象了
obj3 := pool.Acquire()
fmt.Println("Acquired:", obj3)
![img](https://img-blog.csdnimg.cn/img_convert/f523417980c4306554cf9e8a3c356f13.png)
![img](https://img-blog.csdnimg.cn/img_convert/a4fb85ec850bad11e1750bdeb541dfcb.png)
![img](https://img-blog.csdnimg.cn/img_convert/cbfa1173d4dbe8fd43fe093c09a50162.png)
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!**
**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**
**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618658159)**
目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**
**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618658159)**