# 项目创建

### 新建项目目录
创建项目目录hello，然后进入hello目录
```shell
mkdir hello && cd hello
```
### goctl创建模板
使用goctl工具创建proto文件模板
```shell
goctl rpc template -o=hello.proto
```
### 编辑hello.proto
```go
syntax = "proto3";

package hello;

message HelloRequest {
  string name = 1;
}

message HelloReply {
  string message = 1;
}

service hello {
  rpc sayHello(HelloRequest) returns (HelloReply);
}
```
### gotcl生成rpc服务
指定hello.proto生成rpc服务
```shell
goctl rpc proto -src hello.proto -dir .
```
### 服务目录结构
结构如下：
```
├── etc
│   └── hello.yaml
├── hello
│   └── hello.pb.go
├── hello.go
├── hello.proto
├── helloclient
│   └── hello.go
└── internal
    ├── config
    │   └── config.go
    ├── logic
    │   └── sayhellologic.go
    ├── server
    │   └── helloserver.go
    └── svc
        └── servicecontext.go
```


## 常见问题解决(go mod工程)


- 错误一:
```golang
pb/xx.pb.go:220:7: undefined: grpc.ClientConnInterface
pb/xx.pb.go:224:11: undefined: grpc.SupportPackageIsVersion6
pb/xx.pb.go:234:5: undefined: grpc.ClientConnInterface
pb/xx.pb.go:237:24: undefined: grpc.ClientConnInterface
```

- 解决方法：请将`protoc-gen-go`版本降至v1.3.2及一下
- 错误二:
```golang

# go.etcd.io/etcd/clientv3/balancer/picker
../../../go/pkg/mod/go.etcd.io/etcd@v0.0.0-20200402134248-51bdeb39e698/clientv3/balancer/picker/err.go:25:9: cannot use &errPicker literal (type *errPicker) as type Picker in return argument:*errPicker does not implement Picker (wrong type for Pick method)
  have Pick(context.Context, balancer.PickInfo) (balancer.SubConn, func(balancer.DoneInfo), error)
  want Pick(balancer.PickInfo) (balancer.PickResult, error)
  ../../../go/pkg/mod/go.etcd.io/etcd@v0.0.0-20200402134248-51bdeb39e698/clientv3/balancer/picker/roundrobin_balanced.go:33:9: cannot use &rrBalanced literal (type *rrBalanced) as type Picker in return argument:
  *rrBalanced does not implement Picker (wrong type for Pick method)
  	have Pick(context.Context, balancer.PickInfo) (balancer.SubConn, func(balancer.DoneInfo), error)
  want Pick(balancer.PickInfo) (balancer.PickResult, error)
  #github.com/tal-tech/go-zero/zrpc/internal/balancer/p2c
  ../../../go/pkg/mod/github.com/tal-tech/go-zero@v1.0.12/zrpc/internal/balancer/p2c/p2c.go:41:32: not enough arguments in call to base.NewBalancerBuilder
  have (string, *p2cPickerBuilder)
want (string, base.PickerBuilder, base.Config)
../../../go/pkg/mod/github.com/tal-tech/go-zero@v1.0.12/zrpc/internal/balancer/p2c/p2c.go:58:9: cannot use &p2cPicker literal (type *p2cPicker) as type balancer.Picker in return argument:
  *p2cPicker does not implement balancer.Picker (wrong type for Pick method)
  	have Pick(context.Context, balancer.PickInfo) (balancer.SubConn, func(balancer.DoneInfo), error)
  	want Pick(balancer.PickInfo) (balancer.PickResult, error)
```

- 解决方法：
```golang
replace google.golang.org/grpc => google.golang.org/grpc v1.29.1
```

<Vssue title="项目创建" />

