Какие пакеты можно импортировать на игровой площадке?

У меня были проблемы с поиском списка пакетов, которые можно импортировать на игровой площадке go по адресу http://play.golang.org/. Я пытался использовать (очевидно экспериментальный) пакет для 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)
}

Где-то указано, что импортируются только базовые пакеты в https://golang.org/src/ (если это так)?

Я бы очень хотел поиграть с этим экспериментальным пакетом и даже с неэкспериментальными дополнительными библиотеками, такими как currency на игровой площадке.

2 ответа

Решение

Кнопка About на игровой площадке дает некоторую подсказку:

Детская площадка может использовать большую часть стандартной библиотеки, за некоторыми исключениями.

Под стандартной библиотекой подразумеваются пакеты стандартной библиотеки, которые перечислены на странице " Пакеты" в разделе " Стандартная библиотека ". Пакеты, перечисленные в разделе " Другое ", не соответствуют требованиям (то, что вы пробовали - пакет golang.org/x/exp/ebnfподпадает под экспериментальные и устаревшие пакеты, перечисленные в категории "Другие ").

Ссылка, которую необходимо прочитать, если вы хотите узнать больше о реализации Playground:

The Go Blog: на игровой площадке Go

Вот исчерпывающий игровой тест для импорта всех пакетов стандартных библиотек, чтобы показать, что они, по крайней мере, могут быть импортированы, но это не значит, что все (или даже что-либо) может быть разумно использовано из них. Единственный пакет из стандартной библиотеки, который выдает ошибку компиляцииruntime/cgo; "пакеты" без сборочного исходного файла Go не включаются по понятным причинам (поскольку папка не является пакетом, если она не содержит хотя бы один сборочный исходный файл Go).

Вот ссылка на игровую площадку, чтобы попробовать сами.

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")
}

Мне не удалось найти список пакетов, которые можно импортировать на игровую площадку go на http://play.golang.org/.

Найти точный список будет тем труднее, чем вам сейчас (16 мая 2019 г.)

А теперь игровая площадка #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!"

Похоже, это зависит от среды, в которой запущена игровая площадка. Соответствующий код в источнике, кажется, compileAndRun func, особенно строка 88:

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

Который получает ГОПАТ из окружающей среды.

Кроме этого, источник игровой площадки не имеет явного белого (или черного) списка импортируемых пакетов.

Это, вероятно, ключ к сведению, что compileAndRun у Func нет кода для go get пакеты, так что все, что уже есть в GOPATH, это то, что доступно.

Изучение Makefile и Dockerfile не раскрывает конкретные шаги по развертыванию, предпринятые на каноническом сайте http://play.golang.org/, поэтому мы просто должны полагаться на документацию, на которую указал Маркус В. Малберг; то есть "подмножество stdlib".

Кроме того, вы можете развернуть собственную версию игровой площадки go и предоставить ей любую среду GOPATH, которую вы выберете.

Другие вопросы по тегам