vitessio/vitess · error
expected a pointer type for %s, got %v
Error message
expected a pointer type for %s, got %v
What it means
extractLocalPointerType expects an *types.Var to be a pointer to a named type (the codegen templates take proto pointers like *vtctldatapb.X). This error means the variable's type is not a pointer at all, so the generator cannot emit the pointer-based wrapper code.
Source
Thrown at go/vt/vtctl/vtctldclient/codegen/main.go:418
}
argNamed, ok := arg.(*types.Named)
if !ok {
return "", nil, fmt.Errorf("expected a named type for type argument %d of %s, got %v", i, named.Obj().Name(), arg)
}
localImport := rewriteProtoImports(argNamed.Obj().Pkg())
args = append(args, prefix+localImport+"."+argNamed.Obj().Name())
argImports = append(argImports, typeArgImport{localImport: localImport, pkgPath: argNamed.Obj().Pkg().Path()})
}
return "[" + strings.Join(args, ", ") + "]", argImports, nil
}
func extractLocalPointerType(v *types.Var) (name string, localImport string, pkgPath string, err error) {
ptr, ok := v.Type().(*types.Pointer)
if !ok {
return "", "", "", fmt.Errorf("expected a pointer type for %s, got %v", v.Name(), v.Type())
}
typ, ok := ptr.Elem().(*types.Named)
if !ok {
return "", "", "", fmt.Errorf("expected an underlying named type for %s, got %v", v.Name(), ptr.Elem())
}
name = typ.Obj().Name()
localImport = rewriteProtoImports(typ.Obj().Pkg())
pkgPath = typ.Obj().Pkg().Path()
return name, localImport, pkgPath, nil
}
func extractRecvType(v *types.Var) (name string, localImport string, pkgPath string, err error) {
named, ok := v.Type().(*types.Named)
if !ok {
return "", "", "", fmt.Errorf("expected a named type for %s, got %v", v.Name(), v.Type())View on GitHub (pinned to 01a25a7d17)
Solutions
- Change the parameter to a pointer type (*pkg.Type)
- Follow Vitess conventions: proto messages are passed as pointers
- If value types are intentional, adapt the codegen tool
Example fix
// before func (s *Server) Get(req vtctldatapb.GetRequest) error // after func (s *Server) Get(req *vtctldatapb.GetRequest) error
Defensive patterns
Strategy: type-guard
Validate before calling
// Verify params are pointers before codegen
for i := 0; i < sig.Params().Len(); i++ {
if _, ok := sig.Params().At(i).Type().(*types.Pointer); !ok {
return fmt.Errorf("param %d is not a pointer", i)
}
} Type guard
func isPointerToNamed(v *types.Var) bool {
p, ok := v.Type().(*types.Pointer)
if !ok { return false }
_, ok = p.Elem().(*types.Named)
return ok
} Prevention
- Follow the Vitess convention: proto messages always passed as pointers
- Review interface diffs for accidental value-type params before running codegen
When it happens
Trigger: A method parameter or receiver variable on the processed interface has a value (non-pointer) type — e.g. takes vtctldatapb.Request by value or a plain struct.
Common situations: Changing a proto-style API from pointer receivers/params to value semantics then running codegen; a new method added with value-type params; called from main for arguments or from extractRecvType for receiver vars.
Related errors
- expected an underlying named type for %s, got %v
- symbol %s was not an interface but %T
- expected a named type for %s, got %v
- expected a named type for type argument %d of %s, got %v
- package '%s' does not contain 'ast_format.go'
AI-assisted analysis of vitessio/vitess@01a25a7d17 (2026-09-01).
Data as JSON: /api/errors/4cdc638e2ba6ce83.
Report an issue: GitHub.