
# Go {/* #go */}

Bắt đầu với [hướng dẫn gRPC](/docs/vi/api/grpc) để lấy token API và tải `platform.proto`. Cài `protoc`, Go và [plugin protobuf Go](https://grpc.io/docs/languages/go/quickstart/).

Tạo mô-đun và cài bộ sinh mã:

```bash
go mod init example.com/reconstruct-client
```

```bash
go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
```

```bash
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest
```

Đưa plugin vào nơi `protoc` truy cập được, rồi tạo máy khách. Thay `example.com/reconstruct-client` trong cả mô-đun và lệnh nếu dùng đường dẫn khác:

```bash
export PATH="$(go env GOPATH)/bin:$PATH"
mkdir -p platformpb
protoc -I. platform.proto \
  --go_out=platformpb --go_opt=paths=source_relative \
  --go_opt=Mplatform.proto=example.com/reconstruct-client/platformpb \
  --go-grpc_out=platformpb --go-grpc_opt=paths=source_relative \
  --go-grpc_opt=Mplatform.proto=example.com/reconstruct-client/platformpb
```

Lưu `main.go` cạnh `platform.proto`:

```go
package main

import (
    "context"
    "fmt"
    "log"
    "os"
    "time"

    pb "example.com/reconstruct-client/platformpb"
    "google.golang.org/grpc"
    "google.golang.org/grpc/credentials"
    "google.golang.org/grpc/metadata"
)

func main() {
    token := os.Getenv("CR_RECONSTRUCT_API_TOKEN")
    if token == "" { log.Fatal("set CR_RECONSTRUCT_API_TOKEN") }

    conn, err := grpc.NewClient("reconstruct.dev:443",
        grpc.WithTransportCredentials(credentials.NewClientTLSFromCert(nil, "")))
    if err != nil { log.Fatal(err) }
    defer conn.Close()

    ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
    defer cancel()
    ctx = metadata.AppendToOutgoingContext(ctx, "authorization", "Bearer "+token)
    client := pb.NewPlatformServiceClient(conn)

    page, err := client.ListCatalogs(ctx, &pb.ListCatalogsRequest{PageSize: 10})
    if err != nil { log.Fatal(err) }
    for _, catalog := range page.GetCatalogs() {
        detail, err := client.GetCatalog(ctx, &pb.GetCatalogRequest{CatalogId: catalog.GetCatalogId()})
        if err != nil { log.Fatal(err) }
        fmt.Println(detail.GetCatalogId(), detail.GetDescription())
    }
}
```

Chạy `go mod tidy`, rồi `go run .`. Tệp được tạo là `platformpb/platform.pb.go` và `platformpb/platform_grpc.pb.go`.
