如果我从不检查其状态,是否可以永久打开Go通道(从不关闭通道)?它会导致内存泄漏吗?以下代码可以吗?
func (requestCh chan<- Request) GetResponse(data RequestData) Response {
reply := make(chan Response)
requestCh <- Request{data: data, replyCh: reply}
return <-reply
}
Run Code Online (Sandbox Code Playgroud) 我没有找到使用interface{}类型的好资源.例如
package main
import "fmt"
func weirdFunc(i int) interface{} {
if i == 0 {
return "zero"
}
return i
}
func main() {
var i = 5
var w = weirdFunc(5)
// this example works!
if tmp, ok := w.(int); ok {
i += tmp
}
fmt.Println("i =", i)
}
Run Code Online (Sandbox Code Playgroud)
你知道使用Go的好介绍interface{}吗?
具体问题:
我正在尝试编写一些SIMD,主要用于学习目的.我知道Go可以链接汇编,但我无法让它正常工作.
这是我可以做的最小的例子(元素向量乘法):
vec_amd64.s(注意:实际文件下面有一个空白行,RET因为它会导致错误)
// func mul(v1, v2 Vec4) Vec4
TEXT .mul(SB),4,$0-48
MOVUPS v1+0(FP), X0
MOVUPS v2+16(FP), X1
MULPS X1, X0
// also tried ret+32 since I've seen some places do that
MOVUPS X0, toReturn+32(FP)
RET
Run Code Online (Sandbox Code Playgroud)
vec.go
package simd
type Vec4 [4]float32
func (v1 Vec4) Mul(v2 Vec4) Vec4 {
return Vec4{v1[0] * v2[0], v1[1] * v2[1], v1[2] * v2[2], v1[3] * v2[3]}
}
func mul(v1, v2 Vec4) Vec4
Run Code Online (Sandbox Code Playgroud)
simd_test.go
package simd
import (
"testing"
)
func TestMul(t *testing.T) …Run Code Online (Sandbox Code Playgroud) 你如何计时Go中的函数并以毫秒为单位返回其运行时间?
在我的Go包中有几个像map1_benchmark_test.go和的基准文件map2_benchmark_test.go.在每个*_benchmark_test.go文件中,都有不止一个基准函数,比如func BenchmarkMapTravel(b *testing.B)和func BenchmarkMapGet(b *testing.B).
问题是,我怎样才能测试一个基准函数?
我试图阅读一些手册,并且通过运行得不到基准go help test.
我意识到Go没有类,而是推动了结构的概念.
结构体是否具有任何类型的初始化函数,可以类似于类的__construct()函数调用?
例:
type Console struct {
X int
Y int
}
func (c *Console) init() {
c.X = "5"
}
// Here I want my init function to run
var console Console
// or here if I used
var console Console = new(Console)
Run Code Online (Sandbox Code Playgroud) 我正在运行我的CI工具上的vet,并开始收到错误:
composite literal uses unkeyed fields
Run Code Online (Sandbox Code Playgroud)
因为我在实例化
type A struct {
*B
}
Run Code Online (Sandbox Code Playgroud)
像这样:
A{b} // b is of type *B
Run Code Online (Sandbox Code Playgroud)
我不关心这个警告,并希望在我的兽医检查中禁用它.我该怎么做呢?
在Go中精确测量持续时间的正确方法是什么?大多数应用程序只使用标准时间包和以下方法:
var startTime = time.Now()
doSomeHardWork()
var duration = time.Since(startTime) // or: time.Now() - startTime
Run Code Online (Sandbox Code Playgroud)
但是,time.Now()返回当前系统时间,这会导致两个缺陷:
系统时间可以比实时更快或更慢地打勾.当操作系统将内部时钟与NTP时间服务器同步时(这可能每小时发生几次!),这种情况总会发生.
来自MSDN:
[时间服务]调整本地时钟速率,使其收敛到正确的时间.如果本地时钟和[准确时间样本]之间的时间差太大而无法通过调整本地时钟速率来校正,则时间服务将本地时钟设置为正确的时间.
如果系统时间更改(手动或由于DST),则可能会检测到无效持续时间并将其丢弃.但是,如果系统时钟速度比世界时间快10%,则几乎不可能检测到.这是预期的行为以及系统时钟的设计方式.
因此,大多数其他语言都提供了用于测量持续时间的专用API:
System.nanoTime(),System.currentTimeMillis()等同于time.Now()错误System.Diagnostics.StopwatchQueryPerformanceCounter和QueryPerformanceFrequencystd::chrono::steady_clock,或std::chrono::high_resolution_clock当它的is_steady构件是恒定trueperformance.now(),虽然使用new Date()是错误的在Go中精确测量执行时间的正确方法是什么?
我是C的新手,看着Go的源代码树,我发现了这个:
https://code.google.com/p/go/source/browse/src/pkg/runtime/race.c
void runtime?race·Read(int32 goid, void *addr, void *pc);
void runtime?race·Write(int32 goid, void *addr, void *pc);
void
runtime·raceinit(void)
{
// ...
}
Run Code Online (Sandbox Code Playgroud)
斜线和点(·)是什么意思?这是有效的C吗?