Gin入門 Go プログラミング 入門

Gin入門① スタートアップ ~ Go言語フレームワーク ~


[box class="blue_box" title="☑本記事の内容"]

  • Ginについて
  • Ginのスタートアップ
  • API実行方法

[/box]

[box class="glay_box" title="Contents"]

  1. 事前準備
    1. Ginとは
    2. 環境
    3. 使用アプリ
  2. 開発
    1. ディレクトリ構成
    2. ソース
  3. 実行
    1. プログラム実行
    2. API実行

[/box]

事前準備

[box class="yellow_box" title="✔事前準備の目次"]

  • Ginとは
  • 環境
  • 使用アプリ

[/box]

Ginとは

[box class="green_box"]

  • Go言語のwebフレームワーク
  • パフォーマンスが優れている

[/box]
Go言語のwebフレームワークの中でも1番人気。

最大40倍速の高性能なパフォーマンスを誇る。

環境

[box class="green_box"]

  • Go 1.17
  • go modを使用してリポジトリを管理

[/box]
今回はGo 1.17を使用して開発を行っていく。

Goの環境構築に関しては下記参照。
[kanren postid="1522" ]

go modを使用してリポジトリを管理する。

$ go mod init <フォルダ名>
(例) $ go mod init gin-start

go modの初期化が完了したらGinをインストールする。

$ go get -u github.com/gin-gonic/gin

使用アプリ

[box class="green_box"]

  • Talend API Tester

[/box]
APIを実行するにはcurlコマンドやPostmanも使用することができるが、今回はTalend API
Tester
を使用。

Talend API TesterはGoogle Chromeの拡張機能でインストールが容易なため使用。

開発

開発
[box class="yellow_box" title="✔開発の目次"]

  • ディレクトリ構成
  • ソース

[/box]

ディレクトリ構成

gin-started
├─go.mod
├─go.sum
├─main.go
├─controller
│ └─user_controller.go
├─model
│ └─user.go
└─service
  └─user_service.go

ソース

  • main.go
package main

import (
	"gin-start/controller"
	"gin-start/service"

	"github.com/gin-gonic/gin"
)

var (
	userService    service.UserService       = service.New()
	userController controller.UserController = controller.New(userService)
)

func main() {

	router := gin.Default()

	router.GET("/user", func(ctx *gin.Context) {
		ctx.JSON(200, userController.FindAll())
	})

	router.POST("/user", func(ctx *gin.Context) {
		ctx.JSON(200, userController.Save(ctx))
	})

	router.Run("localhost:8080")

}
  • model.go
package model

type Users struct {
	Id   int    `json:"id"`
	Name string `json:"name"`
}
  • user_service.go
package service

import "gin-start/model"

type UserService interface {
	Save(model.Users) model.Users
	FindAll() []model.Users
}
type userService struct {
	users []model.Users
}

func New() UserService {
	return &userService{}
}

func (service *userService) Save(user model.Users) model.Users {
	service.users = append(service.users, user)
	return user
}

func (service *userService) FindAll() []model.Users {
	return service.users
}

  • user_controller.go
package controller

import (
	"gin-start/model"
	"gin-start/service"

	"github.com/gin-gonic/gin"
)

type UserController interface {
	FindAll() []model.Users
	Save(ctx *gin.Context) model.Users
}

type controller struct {
	service service.UserService
}

func New(service service.UserService) UserController {
	return &controller{
		service: service,
	}
}

func (c *controller) FindAll() []model.Users {
	return c.service.FindAll()
}

func (c *controller) Save(ctx *gin.Context) model.Users {
	var user model.Users
	ctx.BindJSON(&user)
	c.service.Save(user)
	return user
}			

実行

[box class="yellow_box" title="✔実行の目次"]

  • プログラム実行
  • API実行

[/box]

プログラム実行

[box class="green_box"]

  • main.goを実行

[/box]

$ go run main.go
(結果)
[GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached.

[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
	- using env:   export GIN_MODE=release
	- using code:  gin.SetMode(gin.ReleaseMode)

[GIN-debug] GET    /user                     --> main.main.func1 (3 handlers)
[GIN-debug] POST   /user                     --> main.main.func2 (3 handlers)
[GIN-debug] [WARNING] You trusted all proxies, this is NOT safe. We recommend you to set a value.
Please check https://pkg.go.dev/github.com/gin-gonic/gin#readme-don-t-trust-all-proxies for details.
[GIN-debug] Listening and serving HTTP on localhost:8080

API実行

[box class="green_box"]

  • Talend API TesterでAPIを実行する

[/box]

POST

実行

GET

実行

Log

[GIN] 2022/01/30 - 18:35:16 | 200 |      1.7439ms |       127.0.0.1 | POST     "/user"
[GIN] 2022/01/30 - 18:36:14 | 200 |            0s |       127.0.0.1 | GET      "/user"


-Gin入門, Go, プログラミング, 入門