{"record":{"id":"66d7707125a9c996","repo":"golang/go","slug":"pattern-q-does-not-specify-a-single-package","errorCode":null,"errorMessage":"pattern %q does not specify a single package","messagePattern":"pattern %q does not specify a single package","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"src/cmd/go/internal/doc/doc.go","lineNumber":621,"sourceCode":"\t\t} else {\n\t\t\tnonInternal = append(nonInternal, m)\n\t\t}\n\t}\n\tif !deferInternal {\n\t\treturn matches\n\t}\n\tif len(nonInternal) == 0 {\n\t\treturn internal\n\t}\n\t// If the last non-internal match is returned, later retries should\n\t// not fall through to internal-only matches for the same package path.\n\tnonInternal[len(nonInternal)-1].nextOffset = dirs.offset\n\treturn append(nonInternal, internal...)\n}\n\nfunc loadPackage(ctx context.Context, loader *modload.Loader, pattern string) (*load.Package, error) {\n\tif !search.NewMatch(pattern).IsLiteral() {\n\t\treturn nil, fmt.Errorf(\"pattern %q does not specify a single package\", pattern)\n\t}\n\n\tpkgOpts := load.PackageOpts{\n\t\tIgnoreImports:      true,\n\t\tSuppressBuildInfo:  true,\n\t\tSuppressEmbedFiles: true,\n\t}\n\tpkgs := load.PackagesAndErrors(loader, ctx, pkgOpts, []string{pattern})\n\n\tif len(pkgs) != 1 {\n\t\treturn nil, fmt.Errorf(\"path %q matched multiple packages\", pattern)\n\t}\n\n\tp := pkgs[0]\n\tif p.Error != nil {\n\t\treturn nil, p.Error\n\t}\n\treturn p, nil","sourceCodeStart":603,"sourceCodeEnd":639,"githubUrl":"https://github.com/golang/go/blob/b6b368adc57c96c3151d224d172029f233ead2c3/src/cmd/go/internal/doc/doc.go#L603-L639","documentation":"Returned by loadPackage when the supplied pattern is not a literal package path (search.NewMatch(pattern).IsLiteral() is false). go doc needs exactly one concrete package to render, so wildcards like ./..., std, or 'all' are rejected before any loading happens.","triggerScenarios":"Running `go doc ./...`, `go doc std`, `go doc all`, or any pattern containing wildcards/meta-syntax accepted by the broader go list matcher.","commonSituations":"Habit of using ./... from build/test commands; passing package-list patterns to doc by mistake; copy-pasting a pattern from a go test invocation.","solutions":["Pass a single literal import path or relative path (e.g. `go doc ./mypkg` or `go doc fmt`).","If you want to browse many packages, use pkgsite (`go doc -http`).","Expand the pattern externally and loop if you truly need many."],"exampleFix":"# before\n$ go doc ./...\n# -> pattern \"./...\" does not specify a single package\n\n# after\n$ go doc ./mypkg\n# or browse interactively\n$ go doc -http","handlingStrategy":"validation","validationCode":"if !search.NewMatch(pattern).IsLiteral() {\n    return fmt.Errorf(\"%q is a wildcard; pass a single literal package path\", pattern)\n}","typeGuard":"func isLiteralPackage(p string) bool {\n    return search.NewMatch(p).IsLiteral()\n}","tryCatchPattern":null,"preventionTips":["Pass a single import path or relative dir to `go doc`.","Use `go doc -http` to browse many packages.","Reserve ./... for build/test, not doc."],"tags":["doc","pattern","package","user-input"],"backgroundTag":null,"analyzedSha":"b6b368adc57c96c3151d224d172029f233ead2c3","analyzedAt":"2026-08-12T00:22:02.250Z","schemaVersion":2},"datasetVersion":"2026-08-13T09:17:06.757Z"}