{"record":{"id":"4d68b91d910cc2ef","repo":"micro/go-micro","slug":"subscriber-v-v-has-wrong-number-of-outs-v-requ","errorCode":null,"errorMessage":"subscriber %v.%v has wrong number of outs: %v require signature %s","messagePattern":"subscriber (.+?)\\.(.+?) has wrong number of outs: (.+?) require signature (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"server/grpc/subscriber.go","lineNumber":156,"sourceCode":"\t\thdlr := reflect.ValueOf(sub.Subscriber())\n\t\tname := reflect.Indirect(hdlr).Type().Name()\n\n\t\tfor m := 0; m < typ.NumMethod(); m++ {\n\t\t\tmethod := typ.Method(m)\n\n\t\t\tswitch method.Type.NumIn() {\n\t\t\tcase 3:\n\t\t\t\targType = method.Type.In(2)\n\t\t\tdefault:\n\t\t\t\treturn fmt.Errorf(\"subscriber %v.%v takes wrong number of args: %v required signature %s\",\n\t\t\t\t\tname, method.Name, method.Type.NumIn(), subSig)\n\t\t\t}\n\n\t\t\tif !isExportedOrBuiltinType(argType) {\n\t\t\t\treturn fmt.Errorf(\"%v argument type not exported: %v\", name, argType)\n\t\t\t}\n\t\t\tif method.Type.NumOut() != 1 {\n\t\t\t\treturn fmt.Errorf(\n\t\t\t\t\t\"subscriber %v.%v has wrong number of outs: %v require signature %s\",\n\t\t\t\t\tname, method.Name, method.Type.NumOut(), subSig)\n\t\t\t}\n\t\t\tif returnType := method.Type.Out(0); returnType != typeOfError {\n\t\t\t\treturn fmt.Errorf(\"subscriber %v.%v returns %v not error\", name, method.Name, returnType.String())\n\t\t\t}\n\t\t}\n\t}\n\n\treturn nil\n}\n\nfunc (g *grpcServer) createSubHandler(sb *subscriber, opts server.Options) broker.Handler {\n\treturn func(p broker.Event) (err error) {\n\t\tdefer func() {\n\t\t\tif r := recover(); r != nil {\n\t\t\t\tg.opts.Logger.Log(logger.ErrorLevel, \"panic recovered: \", r)\n\t\t\t\tg.opts.Logger.Log(logger.ErrorLevel, string(debug.Stack()))","sourceCodeStart":138,"sourceCodeEnd":174,"githubUrl":"https://github.com/micro/go-micro/blob/24529f140421a11a33b6999ab7944f2021cfd69c/server/grpc/subscriber.go#L138-L174","documentation":"A valid gRPC subscriber handler must return exactly one value of type error, matching the signature `func(ctx context.Context, msg T) error`. validateSubscriber rejects any method whose number of return values is not exactly 1, reporting the actual count via this error.","triggerScenarios":"Registering a subscriber whose method returns zero values (`func (h *h) Handle(evt *Event)`), two values (`(result, error)`), or more than one output.","commonSituations":"Copying a request/reply service handler style that returns `(resp, error)`; refactoring handlers to also return a value; forgetting the error return entirely.","solutions":["Change the handler to return exactly one value of type error: `func (h *h) Handle(ctx context.Context, evt *Event) error`","If you need to convey results, encode them into the message or use a published response topic instead of extra return values"],"exampleFix":"// before\nfunc (h *handler) Handle(ctx context.Context, e *Event) (string, error) { ... }\n// after\nfunc (h *handler) Handle(ctx context.Context, e *Event) error { ... }","handlingStrategy":"validation","validationCode":"func validHandlerOuts(fn interface{}) bool {\n\treturn reflect.TypeOf(fn).NumOut() == 1\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Follow the canonical subscriber signature: func(ctx context.Context, msg *T) error","Never add extra return values to subscriber handlers; return data via messages or topics","Validate all handlers at startup by registering them immediately rather than lazily"],"tags":["grpc","subscriber","signature","go"],"backgroundTag":"subscriber-signature-mismatch","analyzedSha":"24529f140421a11a33b6999ab7944f2021cfd69c","analyzedAt":"2026-09-01T02:52:24.923Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T05:18:18.240Z"}