相关疑难解决方法(0)

我为什么要make()或new()?

引入文件奉献许多段落解释之间的区别new()make(),但在实践中,您可以创建本地范围内的物体并返回它们.

你为什么要使用(坦率地说是愚蠢的)配对器?

go

187
推荐指数
10
解决办法
6万
查看次数

golang new() 与结构体字面量的区别,尤其是在内存分配方面

说我有一个结构:

type foo struct {
}
Run Code Online (Sandbox Code Playgroud)

之间有什么区别吗

f := &foo{}
Run Code Online (Sandbox Code Playgroud)

f := new(foo)
Run Code Online (Sandbox Code Playgroud)

就它被编译成的机器代码而言,还是仅仅是语法上的差异?

一个更具体的问题:

至于structliteral( &foo{}),内存可以在栈中分配,也可以在堆中分配,取决于转义分析。

但是对于new(foo),我不太确定:

calloc()new()根据我的理解,在 c 中类似于在 golang 中。但calloc()总是在堆上分配。我想知道是否new()总是在堆中分配?

golang 规范(https://golang.org/ref/spec#Allocation)只提到:

内置函数 new 接受类型 T,在运行时为该类型的变量分配存储空间,并返回指向它的类型 *T 的值。变量按照初始值部分中的描述进行初始化。

它没有说明new()将在哪里分配内存。所以new()总是在堆上分配,还是也可以在堆栈中分配——与内存分配中的结构体完全相同?

go

7
推荐指数
0
解决办法
1908
查看次数

多个sync.WaitGroup的使用

我见过几个不同的例子sync.WaitGroup

实施例1

var wg sync.WaitGroup

wg.Add(1)
go doStuff(&wg)
wg.Wait()
Run Code Online (Sandbox Code Playgroud)

实施例2

wg := new(sync.WaitGroup)

wg.Add(1)
go doStuff(wg)
wg.Wait()
Run Code Online (Sandbox Code Playgroud)

区别实际上在于sync.WaitGroup初始化 方式varnew

如果使用该var选项,它必须作为&wg指向 goroutine 的指针传递,但如果我使用该new选项,我可以将其发送为wg

这两个例子有什么区别?上面这2个哪一个是正确的?在某些情况下,是否优先选择其中一种?

我正在编写一个创建多个 s 的程序,那么使用orsync.WaitGroup是否重要?newvar

concurrency pointers go

4
推荐指数
1
解决办法
4643
查看次数

是否有必要在 sync.Pool 新函数中返回指针类型?

我看到了问题它说sync.Pool应使用Github上用指针类型,例如:

var TPool = sync.Pool{
    New: func() interface{} {
       return new(T)
    },
}
Run Code Online (Sandbox Code Playgroud)

是否有意义?什么return T{}是更好的选择,为什么?

go

0
推荐指数
1
解决办法
686
查看次数

标签 统计

go ×4

concurrency ×1

pointers ×1