6

我很难在http://play.golang.org/的 go playground 中找到可以导入哪些包的列表。我试图为ebnf使用(显然是实验性的)包。然而,即使是一个简短的程序也不会从中golang.org导入(第 4 行的导入中断):

package main

import "fmt"
import "golang.org/x/exp/ebnf"

const g = `
Production  = name "=" [ Expression ] "." .
Expression  = Alternative { "|" Alternative } .
Alternative = Term { Term } .
Term        = name | token [ "…" token ] | Group | Option | Repetition .
Group       = "(" Expression ")" .
Option      = "[" Expression "]" .
Repetition  = "{" Expression "}" .`

func main() {
    fmt.Println(g)
}

是否有任何地方说明只有golang.org/src/中的基础包会导入(如果是这样的话)?

我真的很想玩这个实验包,甚至像currency在操场上那样的非实验补充库。

4

3 回答 3

6

Playground 上的About按钮给出了一些提示:

Playground 可以使用大部分标准库,但有一些例外。

标准库是指标准库的包,它们列在“”页面的“标准库”部分下。“其他”部分下列出的包不符合条件(这是您尝试过的 - 包属于“其他”类别下列出的实验性和已弃用的包)。golang.org/x/exp/ebnf

如果您想了解有关 Playground 实现的更多信息,请阅读以下链接:

围棋博客:围棋操场内部

这是一个详尽的游乐场测试,用于导入所有标准库包以显示它们至少可以导入,但这并不意味着可以合理地使用它们中的所有东西(甚至任何东西)。标准库中唯一出现编译错误的包是runtime/cgo; 出于显而易见的原因,不包含没有可构建 Go 源文件的“包”(因为如果文件夹不包含至少一个可构建的 Go 源文件,则它不是包)

这是Playground Link自己尝试一下。

package main

import (
    _ "archive/tar"
    _ "archive/zip"

    _ "bufio"
    _ "bytes"

    _ "compress/bzip2"
    _ "compress/flate"
    _ "compress/gzip"
    _ "compress/lzw"
    _ "compress/zlib"

    _ "container/heap"
    _ "container/list"
    _ "container/ring"

    _ "crypto"
    _ "crypto/aes"
    _ "crypto/cipher"
    _ "crypto/des"
    _ "crypto/dsa"
    _ "crypto/ecdsa"
    _ "crypto/elliptic"
    _ "crypto/hmac"
    _ "crypto/md5"
    _ "crypto/rand"
    _ "crypto/rc4"
    _ "crypto/rsa"
    _ "crypto/sha1"
    _ "crypto/sha256"
    _ "crypto/sha512"
    _ "crypto/subtle"
    _ "crypto/tls"
    _ "crypto/x509"
    _ "crypto/x509/pkix"

    _ "database/sql"
    _ "database/sql/driver"

    _ "debug/dwarf"
    _ "debug/elf"
    _ "debug/gosym"
    _ "debug/macho"
    _ "debug/pe"
    _ "debug/plan9obj"

    _ "encoding"
    _ "encoding/ascii85"
    _ "encoding/asn1"
    _ "encoding/base32"
    _ "encoding/base64"
    _ "encoding/binary"
    _ "encoding/csv"
    _ "encoding/gob"
    _ "encoding/hex"
    _ "encoding/json"
    _ "encoding/pem"
    _ "encoding/xml"

    _ "errors"
    _ "expvar"
    _ "flag"
    _ "fmt"

    _ "go/ast"
    _ "go/build"
    _ "go/constant"
    _ "go/doc"
    _ "go/format"
    _ "go/importer"
    _ "go/parser"
    _ "go/printer"
    _ "go/scanner"
    _ "go/token"
    _ "go/types"

    _ "hash"
    _ "hash/adler32"
    _ "hash/crc32"
    _ "hash/crc64"
    _ "hash/fnv"

    _ "html"
    _ "html/template"

    _ "image"
    _ "image/color"
    _ "image/color/palette"
    _ "image/draw"
    _ "image/gif"
    _ "image/jpeg"
    _ "image/png"

    _ "index/suffixarray"

    _ "io"
    _ "io/ioutil"

    _ "log"
    _ "log/syslog"

    _ "math"
    _ "math/big"
    _ "math/cmplx"
    _ "math/rand"

    _ "mime"
    _ "mime/multipart"
    _ "mime/quotedprintable"

    _ "net"
    _ "net/http"
    _ "net/http/cgi"
    _ "net/http/cookiejar"
    _ "net/http/fcgi"
    _ "net/http/httptest"
    _ "net/http/httputil"
    _ "net/http/pprof"
    _ "net/mail"
    _ "net/rpc"
    _ "net/rpc/jsonrpc"
    _ "net/smtp"
    _ "net/textproto"
    _ "net/url"

    _ "os"
    _ "os/exec"
    _ "os/signal"
    _ "os/user"

    _ "path"
    _ "path/filepath"

    _ "reflect"
    _ "regexp"
    _ "regexp/syntax"

    _ "runtime"
    // _ "runtime/cgo"  // ERROR: missing Go type information
                        // for global symbol: .dynsym size 60
    _ "runtime/debug"
    _ "runtime/pprof"
    _ "runtime/race"
    _ "runtime/trace"

    _ "sort"
    _ "strconv"
    _ "strings"
    _ "sync"
    _ "sync/atomic"
    _ "syscall"

    _ "testing"
    _ "testing/iotest"
    _ "testing/quick"

    _ "text/scanner"
    _ "text/tabwriter"
    _ "text/template"
    _ "text/template/parse"

    _ "time"
    _ "unicode"
    _ "unicode/utf16"
    _ "unicode/utf8"
    _ "unsafe"
)

func main() {
    println("ok")
}
于 2016-04-04T18:35:57.943 回答
1

它似乎取决于启动游乐场的环境。源代码中的相关代码似乎是compileAndRunfunc,尤其是第88行:

cmd.Env = []string{"GOOS=nacl", "GOARCH=amd64p32", "GOPATH=" + os.Getenv("GOPATH")}

从环境中获取 GOPATH。

除此之外,playground 源没有任何明确的可导入包的白名单(或黑名单)。

需要注意的是compileAndRunfunc 没有go get包的代码可能是关键,因此 GOPATH 中已有的任何内容都是可用的。

仔细阅读 Makefile 和 Dockerfile 并没有揭示规范http://play.golang.org站点中采取的具体部署步骤,因此我们只需要依赖 Markus W Mahlberg 指出的文档即可;即“标准库的一个子集”。

此外,您可以部署自己版本的 go playground,并为其提供您选择的任何 GOPATH 环境。

于 2016-04-04T18:02:59.547 回答
1

我很难在http://play.golang.org/的 go playground 中找到可以导入哪些包的列表。

找到一份准确的名单比现在更难(2019 年 5 月 16 日)

现在#golang 游乐场支持多个文件:示例

德米特里舒拉廖夫补充道

这意味着您还可以拥有多个模块!文件现在也go.mod被格式化:示例

package main

import (
    "fmt"

    "gopher.example/bar"
    "play.ground/foo"
)

func main() {
    fmt.Println(foo.Bar)
    fmt.Println()
    fmt.Println(bar.Baz)
    fmt.Println()
    fmt.Println("And go.mod files get formatted too. Try pressing the Format button!")
}
-- go.mod --

  module      "play.ground"

   replace (

       "gopher.example/bar"    => ./bar
 )

-- foo/foo.go --
package foo

const Bar = "The Go playground now has support for multiple files!"
-- bar/go.mod --
module gopher.example/bar
-- bar/bar.go --
package bar

const Baz = "Which means you can have multiple modules too!"
于 2019-05-16T04:40:06.677 回答