小编pet*_*rSO的帖子

是否可以打开频道?

如果我从不检查其状态,是否可以永久打开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)

channel go

142
推荐指数
5
解决办法
3万
查看次数

如何确定接口{}值的"真实"类型?

我没有找到使用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{}吗?

具体问题:

  • 我如何获得"真实"类型的w?
  • 有没有办法得到一个类型的字符串表示?
  • 有没有办法使用类型的字符串表示来转换值?

types type-conversion go

105
推荐指数
6
解决办法
9万
查看次数

去<<和>>运算符

可能有人请向我解释的使用<<>>进去吗?我想它与其他一些语言类似.

go bitwise-operators

96
推荐指数
8
解决办法
5万
查看次数

Go没有链接我的程序集:未定义的外部函数

我正在尝试编写一些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)

assembly go

82
推荐指数
1
解决办法
2219
查看次数

36
推荐指数
4
解决办法
2万
查看次数

如何只测试一个基准函数?

在我的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.

benchmarking unit-testing go

30
推荐指数
2
解决办法
2万
查看次数

结构的init函数

我意识到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)

class go construct

27
推荐指数
2
解决办法
2万
查看次数

禁用针对"复合文字使用无键字段"的兽医检查

我正在运行我的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)

我不关心这个警告,并希望在我的兽医检查中禁用它.我该怎么做呢?

warnings go suppress-warnings

23
推荐指数
4
解决办法
2万
查看次数

正确测量Go中的持续时间

在Go中精确测量持续时间的正确方法是什么?大多数应用程序只使用标准时间包和以下方法:

var startTime = time.Now()
doSomeHardWork()
var duration = time.Since(startTime) // or: time.Now() - startTime
Run Code Online (Sandbox Code Playgroud)

但是,time.Now()返回当前系统时间,这会导致两个缺陷:

  1. 如果在测量期间更改了系统时间(例如由于时区更改(DST)或闰秒),则生成的持续时间也是错误的.
  2. 系统时间可以比实时更快或更慢地打勾.当操作系统将内部时钟与NTP时间服务器同步时(这可能每小时发生几次!),这种情况总会发生.

    来自MSDN:

    [时间服务]调整本地时钟速率,使其收敛到正确的时间.如果本地时钟和[准确时间样本]之间的时间差太大而无法通过调整本地时钟速率来校正,则时间服务将本地时钟设置为正确的时间.

如果系统时间更改(手动或由于DST),则可能会检测到无效持续时间并将其丢弃.但是,如果系统时钟速度比世界时间快10%,则几乎不可能检测到.这是预期的行为以及系统时钟的设计方式.

因此,大多数其他语言都提供了用于测量持续时间的专用API:

在Go中精确测量执行时间的正确方法是什么?

time go

23
推荐指数
3
解决办法
6198
查看次数

函数名称和原型中的斜线和点?

我是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吗?

c notation go

18
推荐指数
3
解决办法
2340
查看次数