go 的 Pool池对象-sync.Pool

 Golang  2023-04-10  admin  392  529

package main

import (
	"fmt"
	"strconv"
	"sync"
)

//在go中,原生的池化数据结构为sync.Pool, 有三个方法:
//New字段为一个方法,定义为func() interface{}, 在新建Pool时,定义好New字段,以供后续从池中获取对象时,如果当前池中无对象,则使用此方法来新建对象。
//Get()方法:从池中获取对象
//Put(x interface{})方法:将对象放入池中

var pool2 *sync.Pool

type Person2 struct {
	Name string
	Age  int
}

func init() {
	pool2 = &sync.Pool{
		New: func() interface{} {
			fmt.Println("creating a new person")
			return new(Person2)
		},
	}

	//初始化时创建10个对象
	for i := 0; i < 10; i++ {
		pool2.Put(&Person2{"name_" + strconv.Itoa(i), i})
	}
}

func main() {

	for i := 0; i < 9; i++ {
		fmt.Println("Get object from pool again:", pool2.Get().(*Person2))
	}

	p := pool2.Get().(*Person2)
	fmt.Println("Get object from pool again:", p)
	pool2.Put(p) //用完之后放回

	fmt.Println("Get object from pool again:", pool2.Get().(*Person2))
	fmt.Println("Get object from pool again:", pool2.Get().(*Person2))
}

//Get object from pool again: &{name_0 0}
//Get object from pool again: &{name_9 9}
//Get object from pool again: &{name_8 8}
//Get object from pool again: &{name_7 7}
//Get object from pool again: &{name_6 6}
//Get object from pool again: &{name_5 5}
//Get object from pool again: &{name_4 4}
//Get object from pool again: &{name_3 3}
//Get object from pool again: &{name_2 2}
//Get object from pool again: &{name_1 1}
//Get object from pool again: &{name_1 1}
//creating a new person
//Get object from pool again: &{ 0}


如果文章对您有帮助,点击下方的广告,支持一下作者吧!

转载必须注明出处:

go 的 Pool池对象-sync.Pool —— code.cent123.com

相关推荐


在go协程中共享资源需要加锁处理

在go协程中共享资源需要加锁处理packagemain import( &quot;fmt&quot; &quot;sync&quot; ) //创建一个互斥锁 varmutex=&amp;sync.Mutex{} //定义一个共享资源 varsharedResource=0 //定义一个等待组 varwg=sync.WaitGroup{} //定义一

go 的 Pool池对象 sync.Pool 创建mysql连接池

//在这个例子中,我们创建了一个sync.Pool,其中包含一个New函数,该函数创建一个MySQL连接 //在someFunction中,我们使用dbPool.Get()从池中获取一个MySQL连接 //然后我们使用连接进行一些操作,最后使用dbPool.Put()将连接放回池中 //我们可以通过设置dbPool的大小来初始化连接池中的连接数量 //例如,如果我们想要初始化10个连接,我

go WaitGroup 的使用方法

在 Go 中,sync 包下的 WaitGroup 能有助于我们控制协程之间的同步。当需要等待一组协程都执行完各自任务后,才能继续后续逻辑。这种场景,就非常适合使用它。WaitGroup 提供三个 API。Add(delta int) 函数提供了 WaitGroup 的任务计数,delta 的值可以为正也可以为负,通常在添加任务时使用。Done() 函数其实就是 Add(-1),在任务完成时调用。

go 协程管理及传参处理

Go语言中的goroutine虽然相对于系统线程来说比较轻量级(初始栈大小仅2KB),(并且支持动态扩容),而正常采用java,c++等语言启用的线程一般都是内核态的占用的内存资源一般在4m左右,而假设我们的服务器CPU内存为4G,那么很明显才用的内核态线程的并发总数量也就是1024个,相反查看一下Go语言的协程则可以达到4*1024*1024/2=200w.这么一看就明白了为什么Go语言天生支持