【Go Lang】WebFrameWork使ってみた2 beego

# はじめに
Go lang WebFrameWorkを使ってみるの二つ目。
人気ライブラリの1~3位を使ってみることにする。

[【Go Lang】WebFrameWork使ってみた1 Gin](https://qiita.com/y_nomura_CR/items/9858f2c1e4e1b4d2d2d3)
[【Go Lang】WebFrameWork使ってみた2 beego](https://qiita.com/y_nomura_CR/items/1029d6cd1e24d61831f1)
[【Go Lang】WebFrameWork使ってみた3 iris](https://qiita.com/y_nomura_CR/items/d24f243d7b34522626d5)

- Gin
- beego←今回はコレ
- iris

# 公式サイトとか
公式サイト（日本語ないです）：https://beego.me/
github:https://github.com/gin-gonic/gin
ライセンス:apache 2.0

bee'go'なんだなあ・・・

# 人気
- star数:25,835
- qiitaの記事数：28（https://qiita.com/tags/beego）
- google検索結果：約 305,000 件（検索ワード"go lang beego"）

ginとだいぶ差を付けられてる感じ。
qiitaの記事少ないなあ。

# 学習しやすさ
日本語ドキュメントは・・・ない！
しかし公式のquick startは超シンプル。

```
$ go get github.com/beego/beego/v2@v2.0.0

package main

import "github.com/beego/beego/v2/server/web"

func main() {
    web.Run()
}
```

これで動くらしい。

# 特徴
- MVCモデル
- 自動テスト機能
- RESTfulサポート

javaとか.netを触ってた人には理解が速そう。


# 実装
前回覚えたGOMODULEを使ってbeegoをインストールする。

```
$ mkdir beego&& cd beego
$ go mod init beego
$ go get -u github.com/beego/bee
$ go get -u github.com/astaxie/beego
```

#### bee new

createコマンドで新規プロジェクトを作成する。

```
$ bee new beego-project
```

#### bee new
```
$ cd beego-project
$ bee run
```

http://localhost:8080/
にアクセスするとページが表示される。
うーん簡単。

![WS000003 (2).JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546752/0020641d-55af-4ea6-be4a-201c910b133f.jpeg)

これで完了！・・・ではなくて
これに対して前回のGinで作成したvueとファイルアップロードの処理を実装する。

まずrouterにuploadへのルーティングを追加。

```go:routers/router.go
package routers

import (
	"beego-project/controllers"
	"github.com/astaxie/beego"
)

func init() {
    beego.Router("/", &controllers.MainController{})
    beego.Router("/upload", &controllers.UploadController{})
}
```

追加したルーティングに対応するコントローラを追加。
imagesフォルダも追加。

```go:controllers/upload.go
package controllers

import (
	"io"
	"log"
	"net/http"
	"os"

	"github.com/astaxie/beego"
)

type UploadController struct {
	beego.Controller
}

func (c *UploadController) Post() {
	file, header, err := c.GetFile("image")
	if err != nil {
		c.Ctx.Output.SetStatus(http.StatusBadRequest)
		return
	}
	fileName := header.Filename
	dir, _ := os.Getwd()
	out, err := os.Create(dir + "\\images\\" + fileName)
	if err != nil {
		log.Fatal(err)
	}
	defer out.Close()
	_, err = io.Copy(out, file)
	if err != nil {
		log.Fatal(err)
	}
	c.Data["json"] = `{
		"status": "ok",
	}`
	c.Ctx.Output.SetStatus(http.StatusOK)
	c.ServeJSON()
}
```

vueはginで作成したコンポーネント、パッケージをコピーしてきてインストール&ビルド。
※ビルド後フォルダはstaticに変更する必要あり

```
$ npm instrall
$ npm run dev
```

最後にテンプレートファイルにappのIDとvueのJSの読み込みを追加。

```html:views/index.tpl
<!DOCTYPE html>

<html>
<head>
  <title>Beego</title>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  <!-- icon 省略 -->
  <style type="text/css">
  <!-- css 省略 -->
  </style>
</head>

<body>
  <header>
    <h1 class="logo">Welcome to Beego</h1>
    <div class="description">
      Beego is a simple & powerful Go web framework which is inspired by tornado and sinatra.
    </div>
  </header>
  <div id="app"></div>
  <footer>
    <div class="author">
      Official website:
      <a href="http://{{.Website}}">{{.Website}}</a> /
      Contact me:
      <a class="email" href="mailto:{{.Email}}">{{.Email}}</a>
    </div>
  </footer>
  <div class="backdrop"></div>
  <script src="/static/js/app.js"></script>
  <script src="/static/js/reload.min.js"></script>
</body>
</html>
```

後はbee run。

# まとめ
GET、POSTを簡単に実装できた。
vueもGinで用意したものがあったので実装時間は5分くらい？
Ginであった疑問

> 実際の開発でもmain.goで全てのルーティングをやるのだろうか？
> 今までのjavaとかの感覚だとページごとにファイルが分かれててほしくなるが。

はMVCであるbeegoでは問題解決していると感じた。
共通的な処理はrouterに書けばいいのかな？
個人的にはGinより理解はしやすかった。
だけどちょっとした疑問をググった時に日本語情報が少ない。ちょっとこれは辛い。
次はiris。