为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用 * 指针将数据追加到数组结构中

如何使用 * 指针将数据追加到数组结构中

Go
德玛西亚99 2022-09-05 10:07:22
我有一个代码片段:type calculation struct{    sum int    mutex sync.Mutex}func dosomething(c *calculation , wg *sync.WaitGroup) {    c.mutex.Lock()    c.sum++    c.mutex.Unlock()    wg.Done()}func main() {    t := time.Now()    c := new(calculation)    wg := new(sync.WaitGroup)    for i:=0; i<10000000; i++{        wg.Add(1)        go dosomething(c, wg)    }    wg.Wait()    fmt.Println(c.sum)    fmt.Println(time.Since(t))}但我发现使用互斥指针也有效:type calculation struct{    sum int    mutex *sync.Mutex}func dosomething(c *calculation , wg *sync.WaitGroup) {    c.mutex.Lock()    c.sum++    c.mutex.Unlock()    wg.Done()}func main() {    t := time.Now()    c := &calculation{0, new(sync.Mutex)}    wg := new(sync.WaitGroup)    for i:=0; i<10000000; i++{        wg.Add(1)        go dosomething(c, wg)    }    wg.Wait()    fmt.Println(c.sum)    fmt.Println(time.Since(t))}我对这2个版本进行了一些测试,发现经过的时间很接近。那么我应该使用哪一个呢?为什么我应该使用互斥或互斥指针?它们是否存在性能差异?
查看完整描述

2 回答

?
qq_笑_17

TA贡献1818条经验 获得超7个赞

这与使用值或指针相同。int*int


var p *int

您必须首先初始化它,例如使用内置:new()


p = new(int)

分配给指向值:


*p = 3

fmt.Println(*p)

指针切片也是如此:您首先必须初始化它,例如使用内置:new()


book.Categories = new([]Category)

并且您使用以下命令取消引用指针:*


*book.Categories = append(*book.Categories, Category{

    Id:   10,

    Name: "Vanaraj",

})

在Go Playground上尝试一下。


请注意,切片是已包含指向支持数组的指针的切片标头。因此,使用指向切片的指针是非常罕见的,通常是不必要的,只会使事情复杂化。


查看完整回答
反对 回复 2022-09-05
?
慕后森

TA贡献1802条经验 获得超5个赞

func main() {


var book Book


book.Id = 1

book.Name = "Vanaraj"

book.Categories = new([]Category)


for i := 0; i < 10; i++ {

    *book.Categories = append(*book.Categories, Category{

        Id:   10,

        Name: "Vanaraj",

    })

}


fmt.Println(book)}

欧普特 :{1 Vanaraj 0xc00000c030}


并打印您可以使用的类别fmt.Println(book.Categories)


查看完整回答
反对 回复 2022-09-05
  • 2 回答
  • 0 关注
  • 121 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号