https://gqlgen.com/getting-started/
こちらに沿って、gqlgenでgraphQLサーバを立ててみます。
# リポジトリの作成
gh repo create amasok/sample-graphql
# ghqでgetしてくる
ghq get amasok/sample-graphql
# ディレクトリに移動
cd /Users/amasok/ghq/github.com/amasok/sample-graphql
# go modの初期化
go mod init github.com/amasok/sample-grahql
# gqlgenのインストール(1.17系だとこのコマンドじゃないと入らない)
go install github.com/99designs/gqlgen
# gqlgenのコマンドでスケルトン生成(GOPATHが通ってればこれでいけるはず)
gqlgen init
# スケルトンのライブラリなどインストール
go mod tidy↑これだけ。
この時点で以下のようなファイルが生成されます。
.
├── go.mod
├── go.sum
├── gqlgen.yml
├── graph
│ ├── generated
│ │ └── generated.go
│ ├── model
│ │ └── models_gen.go
│ ├── resolver.go
│ ├── schema.graphqls
│ └── schema.resolvers.go
└── server.go$ go run ./server.go
2021/11/17 21:03:31 connect to http://localhost:8080/ for GraphQL playground↑playgroudが立ち上がるので、ここからクエリを飛ばせる。

このままではクエリを投げても正しい値は返ってこないので下記ファイルのCreateTodoとTodosのメソッドを修正して固定値を返すようにします。
graph/schema.resolvers.go
func (r *mutationResolver) CreateTodo(ctx context.Context, input model.NewTodo) (*model.Todo, error) {
todo := &model.Todo{
Text: input.Text,
ID: fmt.Sprintf("T%d", rand.Int()), // import "math/rand"
User: &model.User{ID: input.UserID, Name: "user " + input.UserID},
}
r.todos = append(r.todos, todo)
return todo, nil
}
func (r *queryResolver) Todos(ctx context.Context) ([]*model.Todo, error) {
return r.todos, nil
}graph/resolver.go
type Resolver struct {
todos []*model.Todo
}修正したら再度 go run ./server.go

mutation createTodo {
createTodo(input: { text: "todo", userId: "1" }) {
user {
id
}
text
done
}
}
query findTodos {
todos {
text
done
user {
name
}
}
}なんと作成したデータを返してくれるようになります。
メモリ上にもっているだけなのでgraphQLサーバを再起動させればデータは消えますが、 作成や値が返ってくるところまでできました。
このあと、ディレクトリ構成やログ出力、認証認可や不揮発なデータ保存など本格的な実装に進みますが、今日はここまで。