Docker環境のgRPC/goでハローワールド

# はじめに
goのお勉強しはじめた。gRPCのお勉強しはじめた。まず、これを試してみた。
思ったより、つまづいたので記録を残しておく。
[Quick start – gRPC](https://grpc.io/docs/languages/go/quickstart/)

goもgRPCもよくわかってない。

環境は、このdockerイメージを使った。名前的に、欲しいの入ってそうやったので。
[grpc/go - Docker Hub](https://hub.docker.com/r/grpc/go)

# Docker
こんな感じで立ち上げた。Dockerよくわからん 。

```
docker pull grpc/go
docker run --name grpc-go -it grpc/go /bin/bash 
```

# Quick Start
Quick Startにそって順番に実行していく。

下記コマンドを実行すると、

```
$ go run greeter_server/main.go
```

こんな感じのエラーが出る。

```
cannot find package "golang.org/x/net/http2"
```
とか

```
undefined: "github.com/golang/protobuf/proto".ProtoPackageIsVersion4
```

必要そうなのを入れたり、下記コマンドで入れ直したりした。

```
go get golang.org/x/sys/unix
go get golang.org/x/net/http2
go get google.golang.org/genproto/googleapis/rpc/status
go get -u github.com/golang/protobuf/proto
```

最後のやつはコピペもとを真似して`-u`をつけたけど、よくわかってない。
updateっぽいけど。

[go - The Go Programming Language](https://golang.org/cmd/go/#hdr-Download_and_install_packages_and_dependencies)
> The -u flag instructs get to update modules providing dependencies of packages named on the command line to use newer minor or patch releases when available. Continuing the previous example, 'go get -u A' will use the latest A with B v1.3.1 (not B v1.2.3). If B requires module C, but C does not provide any packages needed to build packages in A (not including tests), then C will not be updated.

上記エラーが出た時に、下記コマンドうったりして、消して入れ直したりしてたから、バージョンとかがよくわからなくなった。
そのうち、わかるようになりたい。`rm`したけど、そういえばバイナリファイルは消してない。どうなったんやろう？上書きされたんかな？

```
rm -rf /go/src/github.com/golang/protobuf/proto
rm -rf /go/src/google.golang.org/grpc/
git clone https://github.com/grpc/grpc-go
```

エラー出た時、こことかを参考にした。
[Go Frequently Asked Questions  |  Protocol Buffers  |  Google Developers](https://developers.google.com/protocol-buffers/docs/reference/go/faq)


上記対応で、最初の、serverとclientの方は動いた。
その後、SayHelloAgainをすると、undefinedと言われた。

```bash
$ go run greeter_client/main.go 
# command-line-arguments
greeter_client/main.go:59:12: c.SayHelloAgain undefined (type helloworld.GreeterClient has no field or method SayHelloAgain)
```

`main.go`にある`pb "google.golang.org/grpc/examples/helloworld/helloworld"`が怪しかったので、パスを辿って見てみると、`/go/src/google.golang.org/grpc/examples/helloworld/helloworld`に`helloworld.proto`の古いやつがあった。

どうするのが良いのかよくわからんかったけど、修正後の`~/grpc-go/examples/helloworld/helloworld`を上記パスに上書きコピーした。
再度、serverとclientを実行すると期待通り動いた。
とりあえず、よかった。`hello world` できた。

# 環境
最終的に動いた時の環境はこんな感じ。
`go get`で入れたバージョンの確認方法がよくわからん 。
`GOPATH`とかは`docker pull`したイメージでデフォルトで入ってた。
`.bashrc`は空っぽでも動いてる。

```
# go env
GOARCH="amd64"
GOBIN=""
GOCACHE="/root/.cache/go-build"
GOEXE=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GOOS="linux"
GOPATH="/go"
GORACE=""
GOROOT="/usr/local/go"
GOTMPDIR=""
GOTOOLDIR="/usr/local/go/pkg/tool/linux_amd64"
GCCGO="gccgo"
CC="gcc"
CXX="g++"
CGO_ENABLED="1"
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build743505095=/tmp/go-build -gno-record-gcc-switches"
```

```
# go version
go version go1.10.4 linux/amd64
# protoc --version
libprotoc 3.6.0
```

# 最後に
ハローワールド的なことできた。よくわからんことだらけなので、ちょっとずつ調べながら学んでこう。