package main import ( "context" "flag" "fmt" "log" "google.golang.org/grpc" "google.golang.org/grpc/credentials/insecure" "google.golang.org/grpc/encoding" pb "google.golang.org/grpc/examples/helloworld/helloworld" "google.golang.org/protobuf/types/known/emptypb" _ "google.golang.org/grpc/encoding/proto" ) const ( defaultName = "world" ) var ( addr = flag.String("addr", "localhost:50051", "the address to connect to") name = flag.String("name", defaultName, "Name to greet") ) func main() { flag.Parse() // Set up a connection to the server. conn, err := grpc.Dial(*addr, grpc.WithTransportCredentials(insecure.NewCredentials())) if err != nil { log.Fatalf("did not connect: %v", err) } defer conn.Close() req := &pb.HelloRequest{Name: *name} input, err := toEmpty(req) if err != nil { panic(err) } output := &emptypb.Empty{} if err := conn.Invoke(context.Background(), "/helloworld.Greeter/SayHello", input, output); err != nil { panic(err) } resp := &pb.HelloReply{} if err := fromEmpty(output, resp); err != nil { panic(err) } fmt.Println(resp.Message) fmt.Println("done") } func toEmpty(v any) (*emptypb.Empty, error) { data, err := encoding.GetCodec("proto").Marshal(v) if err != nil { return nil, err } result := &emptypb.Empty{} if err := encoding.GetCodec("proto").Unmarshal(data, result); err != nil { return nil, err } return result, nil } func fromEmpty(src *emptypb.Empty, dst any) error { data, err := encoding.GetCodec("proto").Marshal(src) if err != nil { return err } return encoding.GetCodec("proto").Unmarshal(data, dst) }