{"record":{"id":"72c91b26ace740bf","repo":"grpc/grpc-go","slug":"could-not-get-resolver-for-default-scheme-q","errorCode":null,"errorMessage":"could not get resolver for default scheme: %q","messagePattern":"could not get resolver for default scheme: %q","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"critical","filePath":"clientconn.go","lineNumber":1854,"sourceCode":"\t// We are here because the user's dial target did not contain a scheme or\n\t// specified an unregistered scheme. We should fallback to the default\n\t// scheme, except when a custom dialer is specified in which case, we should\n\t// always use passthrough scheme. For either case, we need to respect any overridden\n\t// global defaults set by the user.\n\tdefScheme := cc.dopts.defaultScheme\n\tif internal.UserSetDefaultScheme {\n\t\tdefScheme = resolver.GetDefaultScheme()\n\t}\n\n\tcanonicalTarget := defScheme + \":///\" + cc.target\n\n\tparsedTarget, err = parseTarget(canonicalTarget)\n\tif err != nil {\n\t\treturn err\n\t}\n\trb = cc.getResolver(parsedTarget.URL.Scheme)\n\tif rb == nil {\n\t\treturn fmt.Errorf(\"could not get resolver for default scheme: %q\", parsedTarget.URL.Scheme)\n\t}\n\tcc.parsedTarget = parsedTarget\n\tcc.resolverBuilder = rb\n\treturn nil\n}\n\n// parseTarget uses RFC 3986 semantics to parse the given target into a\n// resolver.Target struct containing url. Query params are stripped from the\n// endpoint.\nfunc parseTarget(target string) (resolver.Target, error) {\n\tu, err := url.Parse(target)\n\tif err != nil {\n\t\treturn resolver.Target{}, err\n\t}\n\n\treturn resolver.Target{URL: *u}, nil\n}\n","sourceCodeStart":1836,"sourceCodeEnd":1872,"githubUrl":"https://github.com/grpc/grpc-go/blob/0c51461d27177d997e14c642fe18c11668fc09a3/clientconn.go#L1836-L1872","documentation":"initParsedTargetAndResolverBuilder first tries the target's own scheme, then falls back to the default scheme (clientconn.go:1822-1858). If neither yields a registered resolver builder, NewClient/Dial fails with this error naming the unresolved scheme. This is a hard failure: without a resolver the channel cannot run.","triggerScenarios":"The target has no scheme and the default scheme's resolver is not registered, or the target's scheme is a typo/unregistered name. cc.getResolver(parsedTarget.URL.Scheme) returns nil at clientconn.go:1852.","commonSituations":"Using a custom resolver without importing its package (side-effect registration); typo in scheme (e.g., \"dnss:///\" instead of \"dns:///\"); NewClient with a bare host but the default scheme was changed and not registered; calling resolver.SetDefaultScheme after dial.","solutions":["Import the resolver package so its init() registers the builder (e.g., _ \"google.golang.org/grpc/resolver/dns\").","Use a correct built-in scheme (\"dns:///\", \"passthrough:///\") or a registered custom one.","If you call resolver.SetDefaultScheme, do it before any NewClient/Dial and ensure the scheme is registered."],"exampleFix":"// before\ncc, err := grpc.NewClient(\"customproto:///host\", grpc.WithTransportCredentials(insecure.NewCredentials()))\n// 'customproto' resolver not registered -> error\n// after\nimport _ \"example.com/mymodule/customresolver\" // registers \"customproto\"\ncc, err := grpc.NewClient(\"customproto:///host\", grpc.WithTransportCredentials(insecure.NewCredentials()))","handlingStrategy":"validation","validationCode":"func resolverRegistered(scheme string) bool {\n\treturn resolver.Get(scheme) != nil\n}","typeGuard":null,"tryCatchPattern":"cc, err := grpc.NewClient(target, opts...)\nif err != nil && strings.Contains(err.Error(), \"could not get resolver for default scheme\") {\n    // the target/default scheme is not registered; import the resolver package\n}","preventionTips":["Import resolver packages for any custom scheme before dialing (side-effect registration).","Use built-in schemes (dns, passthrough) for plain hostnames.","Call resolver.SetDefaultScheme only during init() and before any dial."],"tags":["go","grpc","dial","resolver","config","init"],"backgroundTag":null,"analyzedSha":"0c51461d27177d997e14c642fe18c11668fc09a3","analyzedAt":"2026-08-11T14:49:15.055Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}