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

我有一个代码片段:


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个版本进行了一些测试,发现经过的时间很接近。


那么我应该使用哪一个呢?为什么我应该使用互斥或互斥指针?它们是否存在性能差异?


德玛西亚99
浏览 122回答 2
2回答

qq_笑_17

这与使用值或指针相同。int*intvar p *int您必须首先初始化它,例如使用内置:new()p = new(int)分配给指向值:*p = 3fmt.Println(*p)指针切片也是如此:您首先必须初始化它,例如使用内置:new()book.Categories = new([]Category)并且您使用以下命令取消引用指针:**book.Categories = append(*book.Categories, Category{&nbsp; &nbsp; Id:&nbsp; &nbsp;10,&nbsp; &nbsp; Name: "Vanaraj",})在Go Playground上尝试一下。请注意,切片是已包含指向支持数组的指针的切片标头。因此,使用指向切片的指针是非常罕见的,通常是不必要的,只会使事情复杂化。

慕后森

func main() {var book Bookbook.Id = 1book.Name = "Vanaraj"book.Categories = new([]Category)for i := 0; i < 10; i++ {&nbsp; &nbsp; *book.Categories = append(*book.Categories, Category{&nbsp; &nbsp; &nbsp; &nbsp; Id:&nbsp; &nbsp;10,&nbsp; &nbsp; &nbsp; &nbsp; Name: "Vanaraj",&nbsp; &nbsp; })}fmt.Println(book)}欧普特 :{1 Vanaraj 0xc00000c030}并打印您可以使用的类别fmt.Println(book.Categories)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go