{"id":13412550,"url":"https://github.com/ktr0731/evans","last_synced_at":"2025-05-13T23:04:30.716Z","repository":{"id":38896984,"uuid":"97361468","full_name":"ktr0731/evans","owner":"ktr0731","description":"Evans: more expressive universal gRPC client","archived":false,"fork":false,"pushed_at":"2023-12-26T08:27:59.000Z","size":49768,"stargazers_count":4384,"open_issues_count":36,"forks_count":189,"subscribers_count":29,"default_branch":"master","last_synced_at":"2025-04-30T10:37:55.831Z","etag":null,"topics":["cli","completion","golang","grpc","grpc-client","protocol-buffers","repl-mode","rpc"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ktr0731.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null},"funding":{"github":["ktr0731"],"custom":"https://paypal.me/ktr0731"}},"created_at":"2017-07-16T05:10:41.000Z","updated_at":"2025-04-28T04:29:52.000Z","dependencies_parsed_at":"2022-08-09T06:31:30.391Z","dependency_job_id":"77e8c684-fe5c-46b0-bbe4-34c38951e1fa","html_url":"https://github.com/ktr0731/evans","commit_stats":{"total_commits":621,"total_committers":33,"mean_commits":"18.818181818181817","dds":0.6650563607085347,"last_synced_commit":"87fb3ddbbfdebb779e2dbe18050c098b46b9e887"},"previous_names":[],"tags_count":90,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ktr0731%2Fevans","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ktr0731%2Fevans/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ktr0731%2Fevans/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ktr0731%2Fevans/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ktr0731","download_url":"https://codeload.github.com/ktr0731/evans/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254040519,"owners_count":22004559,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cli","completion","golang","grpc","grpc-client","protocol-buffers","repl-mode","rpc"],"created_at":"2024-07-30T20:01:25.981Z","updated_at":"2025-05-13T23:04:30.696Z","avatar_url":"https://github.com/ktr0731.png","language":"Go","readme":"![Evans](https://user-images.githubusercontent.com/12953836/53423552-e5ca8800-3a24-11e9-9927-fe7f3d5f867a.png)\n\n--- \n\n[![GitHub Actions](https://github.com/ktr0731/evans/workflows/main/badge.svg)](https://github.com/ktr0731/evans/actions)\n[![codecov](https://codecov.io/gh/ktr0731/evans/branch/master/graph/badge.svg)](https://codecov.io/gh/ktr0731/evans)\n[![PkgGoDev](https://pkg.go.dev/badge/github.com/ktr0731/evans)](https://pkg.go.dev/github.com/ktr0731/evans)\n\n## Motivation\nEvans has been created to use easier than other existing gRPC clients.  \nIf you want to keep your product quality, you must use CI with gRPC testing, should not do use manual testing.  \nEvans will complete your other use cases just like:  \n\n- Manually gRPC API inspection\n- To automate some tasks by scripting\n\nThe above use cases are corresponding to Evans's two modes, REPL mode, and CLI mode.  \n\n## REPL mode\n![Evans](./evans1.gif)  \nREPL mode is the solution for first use case.  \nYou can use it without thinking like the package name, service name, RPC name, command usage, and so on because REPL mode has powerful completion!  \n\n## CLI mode\n![Evans](./evans2.gif)  \n\nCLI mode is a stateless mode just like [grpc-ecosystem/polyglot](https://github.com/grpc-ecosystem/polyglot).  \nIt sends one request per one command as its name suggests.  \nSo it is based on UNIX philosophy.  \n\nFor example, read inputs from `stdin`, the command will be a filter command.  \nOn the other hand, the command result will be outputted to `stdout` by JSON formatted.  \nSo, you can format it by any commands like `jq`. Also, if you want to use the same command (e.g. use same JSON inputs), you can use `--file` (`-f`) option.  \n\n## Table of Contents\n- [Installation](#installation)\n   - [From GitHub Releases](#from-github-releases)\n   - [macOS](#macos)\n   - [Docker image](#docker-image)\n   - [[Not-recommended] go install](#not-recommended-go-install)\n- [Usage (REPL)](#usage-repl)\n   - [Basic usage](#basic-usage)\n   - [Repeated fields](#repeated-fields)\n   - [Enum fields](#enum-fields)\n   - [Bytes type fields](#bytes-type-fields)\n   - [Client streaming RPC](#client-streaming-rpc)\n   - [Server streaming RPC](#server-streaming-rpc)\n   - [Bidirectional streaming RPC](#bidirectional-streaming-rpc)\n   - [Skip the rest of the fields](#skip-the-rest-of-the-fields)\n   - [Enriched response](#enriched-response)\n   - [Repeat the previous call](#repeat-the-previous-call)\n- [Usage (CLI)](#usage-cli)\n   - [Basic usage](#basic-usage-1)\n   - [Repeated fields](#repeated-fields-1)\n   - [Enum fields](#enum-fields-1)\n   - [Bytes type fields](#bytes-type-fields-1)\n   - [Client streaming RPC](#client-streaming-rpc-1)\n   - [Server streaming RPC](#server-streaming-rpc-1)\n   - [Bidirectional streaming RPC](#bidirectional-streaming-rpc-1)\n   - [Enriched response](#enriched-response-1)\n- [Other features](#other-features)\n   - [gRPC-Web](#grpc-web)\n- [Supported IDL (interface definition language)](#supported-idl-interface-definition-language)\n- [Supported Codec](#supported-codec)\n- [Supported Compressor](#supported-compressor)\n- [See Also](#see-also)\n\n\n## Installation\nHighly recommended methods are GitHub Releases or Homebrew because these can be updated automatically by the built-in feature in Evans.  \n\n### From GitHub Releases\nPlease see [GitHub Releases](https://github.com/ktr0731/evans/releases).  \nAvailable binaries are:\n- macOS\n- Linux\n- Windows\n\n### macOS\n``` sh\nbrew tap ktr0731/evans\nbrew install evans\n```\n\n### Docker image\nYou can use our docker image to run Evans - please see [container registry](https://github.com/ktr0731/evans/pkgs/container/evans).\nFor example, if you want to connect to the server on host `example.com` on port `50051` using proto file in `./proto/files/file-name.proto`  (default working directory is `/mount`):\n```sh\n$ docker run --rm -v \"$(pwd):/mount:ro\" \\\n    ghcr.io/ktr0731/evans:latest \\\n      --path ./proto/files \\\n      --proto file-name.proto \\\n      --host example.com \\\n      --port 50051 \\\n      repl\n```\n\n### **[Not-recommended]** go install\n\nGo v1.20 or later is required.  \n\n``` sh\ngo install github.com/ktr0731/evans@latest\n```\n\n## Usage (REPL)\n### Basic usage\nEvans consists of some commands in REPL mode.  \n\nThe proto file which read in the demonstration and its implementation are available at [ktr0731/grpc-test](https://github.com/ktr0731/grpc-test).  \n`grpc-test`'s details can see `grpc-test --help`.\n\nEnter to REPL.\n``` sh\ncd grpc-test\nevans --proto api/api.proto repl\n```\n\nIf your server is enabling [gRPC reflection](https://github.com/grpc/grpc/blob/master/doc/server-reflection.md), you can launch Evans with only `-r` (`--reflection`) option.\n``` sh\nevans -r repl\n```\n\nAlso if the server requires secure TLS connections, you can launch Evans with the `-t` (`--tls`) option.\n``` sh\nevans --tls --host example.com -r repl\n```\n\nTo show package names of proto files REPL read:  \n```\n\u003e show package\n+---------+\n| PACKAGE |\n+---------+\n| api     |\n+---------+\n```\n\nTo show the summary of services or messages:\n```\n\u003e package api\n\u003e show service\n+---------+----------------------+-----------------------------+----------------+\n| SERVICE |         RPC          |         REQUESTTYPE         |  RESPONSETYPE  |\n+---------+----------------------+-----------------------------+----------------+\n| Example | Unary                | SimpleRequest               | SimpleResponse |\n|         | UnaryMessage         | UnaryMessageRequest         | SimpleResponse |\n|         | UnaryRepeated        | UnaryRepeatedRequest        | SimpleResponse |\n|         | UnaryRepeatedMessage | UnaryRepeatedMessageRequest | SimpleResponse |\n|         | UnaryRepeatedEnum    | UnaryRepeatedEnumRequest    | SimpleResponse |\n|         | UnarySelf            | UnarySelfRequest            | SimpleResponse |\n|         | UnaryMap             | UnaryMapRequest             | SimpleResponse |\n|         | UnaryMapMessage      | UnaryMapMessageRequest      | SimpleResponse |\n|         | UnaryOneof           | UnaryOneofRequest           | SimpleResponse |\n|         | UnaryEnum            | UnaryEnumRequest            | SimpleResponse |\n|         | UnaryBytes           | UnaryBytesRequest           | SimpleResponse |\n|         | ClientStreaming      | SimpleRequest               | SimpleResponse |\n|         | ServerStreaming      | SimpleRequest               | SimpleResponse |\n|         | BidiStreaming        | SimpleRequest               | SimpleResponse |\n+---------+----------------------+-----------------------------+----------------+\n\n\u003e show message\n+-----------------------------+\n|           MESSAGE           |\n+-----------------------------+\n| SimpleRequest               |\n| SimpleResponse              |\n| Name                        |\n| UnaryMessageRequest         |\n| UnaryRepeatedRequest        |\n| UnaryRepeatedMessageRequest |\n| UnaryRepeatedEnumRequest    |\n| UnarySelfRequest            |\n| Person                      |\n| UnaryMapRequest             |\n| UnaryMapMessageRequest      |\n| UnaryOneofRequest           |\n| UnaryEnumRequest            |\n| UnaryBytesRequest           |\n+-----------------------------+\n```\n\nTo show more description of a message:  \n```\n\u003e desc SimpleRequest\n+-------+-------------+\n| FIELD |    TYPE     |\n+-------+-------------+\n| name  | TYPE_STRING |\n+-------+-------------+\n```\n\nSet headers for each request:\n```\n\u003e header foo=bar\n```\n\nTo show headers:\n```\n\u003e show header\n+-------------+-------+\n|     KEY     |  VAL  |\n+-------------+-------+\n| foo         | bar   |\n| grpc-client | evans |\n+-------------+-------+\n```\n\nNote that if you want to set comma-included string to a header value, it is required to specify `--raw` option.\n\nTo remove the added header:\n```\n\u003e header foo\n\u003e show header\n+-------------+-------+\n|     KEY     |  VAL  |\n+-------------+-------+\n| grpc-client | evans |\n+-------------+-------+\n```\n\nCall a RPC:  \n```\n\u003e service Example\n\u003e call Unary\nname (TYPE_STRING) =\u003e ktr\n{\n  \"message\": \"hello, ktr\"\n}\n\n```\n\nEvans constructs a gRPC request interactively and sends the request to a gRPC server.  \nFinally, Evans prints the JSON formatted result.  \n\n### Repeated fields\n`repeated` is an array-like data structure.  \nYou can input some values and finish with \u003ckbd\u003eCTRL-D\u003c/kbd\u003e  \n```\n\u003e call UnaryRepeated\n\u003crepeated\u003e name (TYPE_STRING) =\u003e foo\n\u003crepeated\u003e name (TYPE_STRING) =\u003e bar\n\u003crepeated\u003e name (TYPE_STRING) =\u003e baz\n\u003crepeated\u003e name (TYPE_STRING) =\u003e\n{\n  \"message\": \"hello, foo, bar, baz\"\n}\n```\n\n### Enum fields\nYou can select one from the proposed selections.  \nWhen \u003ckbd\u003eCTRL-C\u003c/kbd\u003e is entered, default value 0 will be used.  \nWhen \u003ckbd\u003eCTRL-D\u003c/kbd\u003e is entered, inputting will be aborted.\n\n```\n\u003e call UnaryEnum\n? UnaryEnumRequest  [Use arrows to move, type to filter]\n\u003e Male\n  Female\n{\n  \"message\": \"M\"\n}\n```\n\n### Bytes type fields\nYou can pass bytes as a base64-encoded string.\n\n```\n\u003e call UnaryBytes\ndata (TYPE_BYTES) =\u003e SGVsbG8gV29ybGQh\n{\n  \"message\": \"received: (bytes) 48 65 6c 6c 6f 20 57 6f 72 6c 64 21, (string) Hello World!\"\n}\n```\n\n⚠️  Warning: Previously, bytes were passed as a (quoted) byte literal or Unicode\nliteral string.\n\nWhile evans currenty still attempts to fall back to that encoding if decoding\nas base64 fails, it's discouraged, and might be dropped.\n\nPlease either encode bytes as base64, or pass `--bytes-as-quoted-literals`\nexplicitly:\n\n```\n\u003e call UnaryBytes --bytes-as-quoted-literals\ndata (TYPE_BYTES) =\u003e \\x46\\x6f\\x6f\n{\n  \"message\": \"received: (bytes) 46 6f 6f, (string) Foo\"\n}\n\n\u003e call UnaryBytes --bytes-as-quoted-literals\ndata (TYPE_BYTES) =\u003e \\u65e5\\u672c\\u8a9e\n{\n  \"message\": \"received: (bytes) e6 97 a5 e6 9c ac e8 aa 9e, (string) 日本語\"\n}\n```\n\nYou can also add the flag `--bytes-as-base64` to explicitly disable the\nfallback behaviour.\n\nOr add the flag `--bytes-from-file` to read bytes from the provided relative path\n```\n\u003e call UnaryBytes --bytes-from-file\ndata (TYPE_BYTES) =\u003e ../relative/path/to/file\n```\n\n### Client streaming RPC\nClient streaming RPC accepts some requests and then returns only one response.  \nFinish request inputting with \u003ckbd\u003eCTRL-D\u003c/kbd\u003e\n\n```\n\u003e call ClientStreaming\nname (TYPE_STRING) =\u003e ktr\nname (TYPE_STRING) =\u003e ktr\nname (TYPE_STRING) =\u003e ktr\nname (TYPE_STRING) =\u003e\n{\n  \"message\": \"ktr, you greet 3 times.\"\n}\n```\n\n### Server streaming RPC\nServer streaming RPC accepts only one request and then returns some responses.\nEach response is represented as another JSON formatted output.\n```\nname (TYPE_STRING) =\u003e ktr\n{\n  \"message\": \"hello ktr, I greet 0 times.\"\n}\n\n{\n  \"message\": \"hello ktr, I greet 1 times.\"\n}\n```\n\n### Bidirectional streaming RPC\nBidirectional streaming RPC accepts some requests and returns some responses corresponding to each request.\nFinish request inputting with \u003ckbd\u003eCTRL-D\u003c/kbd\u003e\n\n```\n\u003e call BidiStreaming\nname (TYPE_STRING) =\u003e foo\n{\n  \"message\": \"hello foo, I greet 0 times.\"\n}\n\n{\n  \"message\": \"hello foo, I greet 1 times.\"\n}\n\n{\n  \"message\": \"hello foo, I greet 2 times.\"\n}\n\nname (TYPE_STRING) =\u003e bar\n{\n  \"message\": \"hello bar, I greet 0 times.\"\n}\n\nname (TYPE_STRING) =\u003e\n```\n\n### Skip the rest of the fields\nEvans recognizes \u003ckbd\u003eCTRL-C\u003c/kbd\u003e as a special key that skips the rest of the fields in the current message type.\nFor example, we assume that we are inputting `Request` described in the following message:\n\n``` proto\nmessage FullName {\n  string first_name = 1;\n  string last_name = 2;\n}\n\nmessage Request {\n  string nickname = 1;\n  FullName full_name = 2;\n}\n```\n\nIf we enter \u003ckbd\u003eCTRL-C\u003c/kbd\u003e at the following moment, `full_name` field will be skipped.\n\n```\nnickname (TYPE_STRING) =\u003e\n```\n\nThe actual request value is just like this.\n\n``` json\n{}\n```\n\nIf we enter \u003ckbd\u003eCTRL-C\u003c/kbd\u003e at the following moment, `last_name` field will be skipped.\n\n```\nnickname (TYPE_STRING) =\u003e myamori\nfull_name::first_name (TYPE_STRING) =\u003e aoi\nfull_name::last_name (TYPE_STRING) =\u003e\n```\n\nThe actual request value is just like this.\n\n``` json\n{\n  \"nickname\": \"myamori\",\n  \"fullName\": {\n    \"firstName\": \"aoi\"\n  }\n}\n```\n\nBy default, Evans digs down each message field automatically.  \nFor example, we assume that we are inputting `Request` described in the following message:\n\n``` proto\nmessage FullName {\n  string first_name = 1;\n  string last_name = 2;\n}\n\nmessage Request {\n  FullName full_name = 1;\n}\n```\n\nIn this case, REPL prompts `full_name.first_name` automatically. To skip `full_name` itself, we can use `--dig-manually` option.\nIt asks whether dig down a message field when the prompt encountered it.\n\n### Enriched response\nTo display more enriched response, you can use `--enrich` option.\n\n```\n\u003e call --enrich Unary\nname (TYPE_STRING) =\u003e ktr\ncontent-type: application/grpc\nheader_key1: header_val1\nheader_key2: header_val2\n\n{\n  \"message\": \"hello, ktr\"\n}\n\ntrailer_key1: trailer_val1\ntrailer_key2: trailer_val2\n\ncode: OK\nnumber: 0\nmessage: \"\"\n```\n\n### Repeat the previous call\nWith `--repeat` option, you can repeat the previous call with the same input.  \nNote that Client/Bidirectional streaming RPC is not supported.\n\n```\n\u003e call Unary\nname (TYPE_STRING) =\u003e ktr\n{\n  \"message\": \"hello, ktr\"\n}\n\n\u003e call --repeat Unary\nname (TYPE_STRING) =\u003e ktr\n{\n  \"message\": \"hello, ktr\"\n}\n```\n\n## Usage (CLI)\n### Basic usage\nCLI mode also has some commands.  \n\n`list` command provides gRPC service inspection against to the gRPC server.\n\n``` sh\n$ evans -r cli list\napi.Example\ngrpc.reflection.v1alpha.ServerReflection\n```\n\nIf an service name is specified, it displays methods belonging to the service.\n\n``` sh\n$ evans -r cli list api.Example\napi.Example.Unary\napi.Example.UnaryBytes\napi.Example.UnaryEnum\n...\n```\n\n`desc` command describes the passed symbol (service, method, message, and so on).\n\n``` sh\napi.Example:\nservice Example {\n  rpc Unary ( .api.SimpleRequest ) returns ( .api.SimpleResponse );\n  rpc UnaryBytes ( .api.UnaryBytesRequest ) returns ( .api.SimpleResponse );\n  rpc UnaryEnum ( .api.UnaryEnumRequest ) returns ( .api.SimpleResponse );\n  ...\n}\n```\n\n`call` command invokes a method.\nYou can input requests from `stdin` or files.  \n\nUse `--file` (`-f`) to specify a file.\n``` sh\n$ cat request.json\n{\n  \"name\": \"ktr\"\n}\n\n$ evans --proto api/api.proto cli call --file request.json api.Example.Unary\n{\n  \"message\": \"hello, ktr\"\n}\n```\n\nIf gRPC reflection is enabled, `--reflection` (`-r`) is available instead of specifying proto files.\n\n``` sh\n$ evans -r cli call --file request.json api.Example.Unary\n{\n  \"message\": \"hello, ktr\"\n}\n```\n\nUse `stdin`.\n``` sh\n$ echo '{ \"name\": \"ktr\" }' | evans cli call api.Example.Unary\n{\n  \"message\": \"hello, ktr\"\n}\n```\n\nIf `.evans.toml` is exist in Git project root, you can denote default values.  \n\n``` toml\n[default]\nprotoFile = [\"api/api.proto\"]\npackage = \"api\"\nservice = \"Example\"\n```\n\nThen, the command will be more clear.  \n\n``` sh\n$ echo '{ \"name\": \"ktr\" }' | evans cli call Unary\n{\n  \"message\": \"hello, ktr\"\n}\n```\n\n### Repeated fields\n``` sh\n$ echo '{ \"name\": [\"foo\", \"bar\"] }' | evans -r cli call api.Example.UnaryRepeated\n{\n  \"message\": \"hello, foo, bar\"\n}\n```\n\n### Enum fields\n``` sh\n$ echo '{ \"choice\": 0 }' | evans -r cli call api.Example.UnaryEnum\n{\n  \"message\": \"1\"\n}\n```\n\n### Bytes type fields\nYou need to encode bytes by Base64.  \nThis constraint is come from Go's standard package [encoding/json](https://golang.org/pkg/encoding/json/#Marshal)  \n``` sh\n$ echo 'Foo' | base64\nRm9vCg==\n\n$ echo '{\"data\": \"Rm9vCg==\"}' | evans -r cli call api.Example.UnaryBytes\n```\n\n### Client streaming RPC\n``` sh\n$ echo '{ \"name\": \"ktr\" } { \"name\": \"ktr\" }' | evans -r cli call api.Example.ClientStreaming\n{\n  \"message\": \"ktr, you greet 2 times.\"\n}\n```\n\n### Server streaming RPC\n``` sh\n$ echo '{ \"name\": \"ktr\" }' | evans -r cli call api.Example.ServerStreaming\n{\n  \"message\": \"hello ktr, I greet 0 times.\"\n}\n\n{\n  \"message\": \"hello ktr, I greet 1 times.\"\n}\n\n{\n  \"message\": \"hello ktr, I greet 2 times.\"\n}\n```\n\n### Bidirectional streaming RPC\n``` sh\n$ echo '{ \"name\": \"foo\" } { \"name\": \"bar\" }' | evans -r cli call api.Example.BidiStreaming\n{\n  \"message\": \"hello foo, I greet 0 times.\"\n}\n\n{\n  \"message\": \"hello foo, I greet 1 times.\"\n}\n\n{\n  \"message\": \"hello foo, I greet 2 times.\"\n}\n\n{\n  \"message\": \"hello foo, I greet 3 times.\"\n}\n\n{\n  \"message\": \"hello bar, I greet 0 times.\"\n}\n```\n\n### Enriched response\nTo display more enriched response, you can use `--enrich` option.\n\n``` \n$ echo '{\"name\": \"ktr\"}' | evans -r cli call --enrich api.Example.Unary                                                                                     ~/.ghq/src/github.com/ktr0731/grpc-test master\ncontent-type: application/grpc\nheader_key1: header_val1\nheader_key2: header_val2\n\n{\n  \"message\": \"hello, ktr\"\n}\n\ntrailer_key1: trailer_val1\ntrailer_key2: trailer_val2\n\ncode: OK\nnumber: 0\nmessage: \"\"\n```\n\nJSON output is also available with `--out json` option.\n\n## Other features\n### gRPC-Web\nEvans also support gRPC-Web protocol.  \nTested gRPC-Web implementations are:\n- [improbable-eng/grpc-web](https://github.com/improbable-eng/grpc-web)\n\nAt the moment TLS is not supported for gRPC-Web.\n\n## Supported IDL (interface definition language)\n- [Protocol Buffers 3](https://developers.google.com/protocol-buffers/)  \n\n## Supported Codec\n- [Protocol Buffers 3](https://developers.google.com/protocol-buffers/)  \n\n## Supported Compressor\n- [GZIP](https://godoc.org/google.golang.org/grpc/encoding/gzip)  \n\n## See Also\nEvans (DJ YOSHITAKA)  \n[![Evans](https://user-images.githubusercontent.com/12953836/47862601-da7d9c00-de38-11e8-80be-9fc981903f6c.png)](https://itunes.apple.com/jp/album/jubeat-original-soundtrack/id325295989)\n","funding_links":["https://github.com/sponsors/ktr0731","https://paypal.me/ktr0731"],"categories":["CLI","Go","Distributed Systems","Tools","分布式系统","Specialized API Clients (GraphQL, gRPC, WebSocket)","Dev Techs"],"sub_categories":["Search and Analytic Databases","CLI","检索及分析资料库","65. [evans](https://evans.syfm.me/)"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fktr0731%2Fevans","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fktr0731%2Fevans","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fktr0731%2Fevans/lists"}