Go协程池设计思路(Task-Job-Worker)

本文首先介绍了Go语言中的接收器Receiver概念,详细解释了接收者类型为struct和指针时的区别,强调了指针作为接收者时方法会修改原始结构体的值。然后,文章进入正题,探讨了协程池的设计思路,指出在高并发场景下限制goroutine数量以提高CPU利用率的重要性,并提供了一个简单的协程池实现示例。
摘要由CSDN通过智能技术生成

1. 铺垫:Go 的接收器Receiver

在go语言中,没有类的概念,但是可以给类型(结构体,自定义类型)定义方法。所谓方法就是定义了接受者的函数。接受者定义在func关键字和函数名之间。可以理解成为结构体定义函数方法,类似于C++中的类方法。

type Person struct {
    name string
    age int
}

func (p Person) say() {
    fmt.Printf("I'm %s,%d years old\n",p.name,p.age)
}

接受者类型可以是struct,也可以是指向struc的指针。

  • 接收者的类型为struct
package main

import "fmt"

type Person struct {
name string
age int
}
func (p Person) say() {
fmt.Printf("I'm %s,%d years old\n",p.name,p.age)
}
func (p Person) older(){
    p.age = p.age +1
}
func main() {
    var p1 Person = Person{"lineshen",25}
    p1.older()
    p1.say()
    var p2 *Person = &Person{"leleyue",22}
    p2.older()
    p2.say()
}

output:

I'm lineshen,25 years old
I'm leleyue,22 years old

对于p1的调用,是没有问题的,因为传递的是结构体,在方法中改变结构体属性,并不能改变原来内存中的值。

对于p2的调用会产生疑问,p2明明是个指针,为什么再调用了older方法之后,打印结果还是22 years old?
方法的接受者是Person而调用者是*Person。其实在p2调用时存在一个转换p2.older() -> *p2.older(); p2.say() -> *p2.say()
p2是指向Person实例的指针。因此,方法执行时的接受者实际上还是一个值而非引用,因此值是不会发生改变的。

  • 接收者的类型为指针
package main

import "fmt"

type Person struct {
name string
age int
}
func (p *Person) say() {
fmt.Printf("I'm %s,%d years old\n",p.name,p.age)
}
func (p *Person) older(){
    p.age = p.age +1
}
func main() {
    var p1 Person = Person{"lineshen",25}
    p1.older()
    p1.say()
    var p2 *Person = &Person{"leleyue",22}
    p2.older()
    p2.say()
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值