小编mdw*_*ott的帖子

如何可靠地检测Go中的os/platform

这是我目前使用的,我认为完成工作,但必须有一个更好的方法:

func isWindows() bool {
    return os.PathSeparator == '\\' && os.PathListSeparator == ';'
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,在我的情况下,我需要知道的是如何检测窗口,但我想知道检测任何平台/操作系统的方法.

玩:

http://play.golang.org/p/r4lYWDJDxL

operating-system go

66
推荐指数
3
解决办法
4万
查看次数

什么输入会导致golang的json.Marshal返回错误?

来自文档:

JSON不能表示循环数据结构,Marshal不能处理它们.将循环结构传递给Marshal将导致无限递归.

我遇到过这种情况,导致运行时恐慌.

我想知道的是,是否有人可以提供一个工作程序来演示非恐慌情况,其中json.Marshal返回非零错误.最佳答案显然包括使用的输入.

json marshalling go

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

如何在运行时发现所有包类型?

据我所知(参见此处此处),反射包中没有类型发现机制,期望您已经拥有要检查的类型或值的实例.

有没有其他方法可以在run go包中发现所有导出的类型(特别是结构)?

这是我希望的(但它不存在):

import "time"
import "fmt"

func main() {
    var types []reflect.Type
    types = reflect.DiscoverTypes(time)
    fmt.Println(types)
}
Run Code Online (Sandbox Code Playgroud)

最终目标是能够发现满足特定条件的包的所有结构,然后能够实例化这些结构的新实例.

顺便说一句,标识类型的注册函数不是我的用例的有效方法.


无论你认为这是一个好主意,这就是我想要这种能力的原因(因为我知道你会问):

我编写了一个代码生成实用程序,它可以加载源文件并构建一个AST来扫描嵌入指定类型的类型.该实用程序的输出是基于发现的类型的一组go测试函数.我调用此实用程序go generate来创建测试函数然后运行go test以执行生成的测试函数.每次测试更改(或添加新类型)时,我必须在重新运行之前重新运行go generate go test.这就是注册功能不是有效选项的原因.我想避免这go generate一步,但这需要我的实用程序成为一个由正在运行的包导入的库.init()对于嵌入了预期库类型的类型,库代码需要以某种方式扫描正在运行的命名空间.

reflection go

15
推荐指数
2
解决办法
5302
查看次数

为什么不能解析所提供格式所代表的时间?

考虑这个例子:

package main

import (
    "fmt"
    "time"
)

func main() {
    fmt.Println(time.Parse(time.RFC3339, time.RFC3339))
}
Run Code Online (Sandbox Code Playgroud)

输出是:

0001-01-01 00:00:00 +0000 UTC parsing time "2006-01-02T15:04:05Z07:00": extra text: 07:00
Run Code Online (Sandbox Code Playgroud)

为什么time.Parse()不能将布局作为值处理?这里缺少什么?


更新:切断时区值(但不是从区域划分时间的'Z')修复它:

fmt.Println(time.Parse(time.RFC3339, "2015-09-15T11:50:00Z"))
Run Code Online (Sandbox Code Playgroud)

为什么time.Parse()在使用time.RFC3339作为布局字符串时不能处理时区信息?

http://play.golang.org/p/p3fHfJNHVK


更新: JimB的回答让我从RFC3339读取,我发现这些例子进一步澄清:

以下是Internet日期/时间格式的一些示例.

1985-04-12T23:20:50.52Z

这代表1985年4月12日23日在UTC后的20分50秒.

1996-12-19T16:39:57-08:00

这代表1996年12月19日16小时后39分57秒,与UTC(太平洋标准时间)相差-08:00.请注意,这相当于1996-12-20T00:39:57Z UTC.

time parsing go

13
推荐指数
2
解决办法
3159
查看次数

nil slice作为接口传递时不是零!为什么?(golang)

看到这个游乐场:http://play.golang.org/p/nWHmlw1W01

package main

import "fmt"

func main() {
    var i []int = nil
    yes(i) // output: true
    no(i)  // output: false
}

func yes(thing []int) {
    fmt.Println(thing == nil)
}

func no(thing interface{}) {
    fmt.Println(thing == nil)
}
Run Code Online (Sandbox Code Playgroud)

为什么两个函数之间的输出差异?

null go

9
推荐指数
1
解决办法
1419
查看次数

在go模块文件(go.mod)中使用“ go”版本指令的含义是什么

给定以下go.mod文件:

module foo

go 1.12

require (
    github.com/bar/baz v1.0.0
    github.com/rat/cat v1.0.0
)
Run Code Online (Sandbox Code Playgroud)

什么是go 1.12说明什么?是否阻止foo针对其他任何版本的Go 编译模块?还是仅仅是foo建议的/必需的Go版本的指示器?这是我们每当发布新版本的go(每6个月)时就应更新的指令吗?

go go-modules

7
推荐指数
1
解决办法
58
查看次数

如何获得延迟函数的引用?

本文指出:"defer语句将函数调用推送到列表中." 我想知道我是否可以从程序中的其他位置访问该列表中的元素然后调用它们?我可以多次调用它们吗?我假设我有一个延迟行为的函数的引用(如果这有帮助).

所以,这是我想要做的一个简短的例子:

func main {
    doStuff = func() {
        // open database connections
        // write temporary files
        // etc...

        defer func() {
            // close database connections
            // delete temporary files
            // etc...
        }()
    }

    AwesomeApplication(doStuff)
}

func AwesomeApplication(doStuff func()) {
    // Now, can I get a reference to the defer function within `doStuff`?
    // No, I can't just define the defer function somewhere an pass it
    // with `doStuff`.  Think of this as a curiosity I want to …
Run Code Online (Sandbox Code Playgroud)

go

5
推荐指数
1
解决办法
159
查看次数

需要来自zip存档条目的io.ReaderAt(该条目是嵌套的.xlsx文件)

让我先说明这个问题,我已经知道excel 2007文件本身就是一个.zip文件,重命名为.xlsx.

好的,既然你知道这就是交易.我正在尝试从内存中的.zip存档中提取Excel 2007文件.我不能(而且,我真的不想)将整个存档提取到磁盘,然后从那里使用.xlsx文件.

问题是我们读取excel 2007文件的方法需要一个ReadAt方法(例如io.ReaderAt定义的方法).不幸的是,archive/zip包暴露了一个只提供io.ReadCloser的zip文件条目的接口.

有没有办法解决这种情况?再一次,我想在内存中完成所有操作,而不需要刷新到磁盘.

zip excel-2007 go

5
推荐指数
1
解决办法
1543
查看次数

Goconvey引起恐慌与詹金斯的常规

我有一套测试,使用GoConvey和Go 1.3.1在本地工作得很好.但是当我用Jenkins触发构建时,还有Go 1.3.1,我得到了Goconvey的恐慌,这与我在测试中使用的go例程有关.

测试可以在这里看到:

func TestListApplication(t *testing.T) {
    s := &Session{}
    s.Username = "foo"
    s.Password = "bar"
    ts := serveHTTP(t)
    defer ts.Close()
    s.Baseurl = ts.URL
    s.initialize()

    go func() {
        <-s.Comms.AppCount
    }()

    Convey("TestListApplication", t, func() {
        s.Comms.MainWaitGroup.Add(1)

        application := &Application{}
        err := json.Unmarshal(applicationJSON(), application)
        So(err, ShouldBeNil)

        revisions := &Revisions{}
        err = json.Unmarshal(revisionsJSON(), revisions)
        So(err, ShouldBeNil)

        var wg sync.WaitGroup
        wg.Add(1)
        go func() {
            defer wg.Done()
            line := <-s.Comms.Msg
            So(line, ShouldEqual, "3        admin       foo\n")
        }()
        s.listApplication(application, revisions)
        wg.Wait()
    })
}
Run Code Online (Sandbox Code Playgroud)

这里的错误:

86 assertions …
Run Code Online (Sandbox Code Playgroud)

tdd go jenkins goconvey

2
推荐指数
1
解决办法
1177
查看次数