
【最終回】Go言語(Golang)入門~Twitterアプリ作成完了編~
2021.12.20
最終回~Go言語(Golang)入門~

(株)ライトコードの笹川(ささがわ)です!
引き続き、ツイートを猫語に変換する「にゃイッター」作っていきます!
簡単なTwitterアプリです。
詳しくは、前回の記事をご覧ください。
それでは、早速進めていきます!
前回の記事はこちら
猫語変換処理を実装
POSTで受け取った値を置換する処理で、「猫語変換」をします。
ReplaceAllを使うと一括置換が出来ます。
1 | strings.ReplaceAll(target, before, after) |
今回は、文字列 map の Key を、Value に変換するように実装します。
なぜ、文字列 map で管理するかと言うと、Go言語(Golang)が分からない人でも、どのように変換されるか解るようにしたかったからです。
簡単な仕組みのアプリですので、気軽にPR(プルリクエスト)や issue(イシュー)を作るなど、笹川以外の人にも開発してもらえたら面白いなと思っているので、このようにしております。
変換処理と対称
変換処理は、こんな感じですね!
1 2 3 | for key, value := range keyword { message = strings.ReplaceAll(message, key, value) } |
ちなみに変換対象は、こんな感じにしてます。(2019/11/21 現在)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | var keyword = map[string]string{ "oh": "オオン", "oh...": "オオオオオオン", "バキューン": "ニャオーン", "わおーん": "ニャオーン", "うま言う": "ちょw誰が上手いこと言えって言ったにゃww", "まだ": "まだにゃ", "した": "したにゃ", "った": "ったにゃ", "です": "ですにゃ", "よう": "ようにゃ", "ねこ": "にゃーん (=・ω・=)", "な": "にゃ", } |
一部おかしい変換があるのは、Twitter上で案を出してもらったりしたのを、そのまま採用したからです(笑)
140文字制限の対応
あと、Twitterには投稿する際に140文字の制限がありますので、そちらも忘れずに対応します。
1 2 3 4 5 | utf8Message := utf8string.NewString(message) size := utf8Message.RuneCount() if size > 120 { return c.JSON(http.StatusBadRequest, "string length over") } |
日本語はマルチバイトなので、 len(target) では正しく取れませんので注意してください。
文末が 「にゃ」 で終わっていたら 「にゃん」 になるようにします。
1 2 3 | if strings.HasSuffix(message, "にゃ") { message += "ん" } |
最後にハッシュタグを付けます。
1 | message += "\n#にゃイッター" |
全体
全体としては、こんな感じになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | package nyaitter import ( "net/http" "strings" "github.com/labstack/echo" "golang.org/x/exp/utf8string" ) var keyword = map[string]string{ "oh": "オオン", "oh...": "オオオオオオン", "バキューン": "ニャオーン", "わおーん": "ニャオーン", "うま言う": "ちょw誰が上手いこと言えって言ったにゃww", "まだ": "まだにゃ", "した": "したにゃ", "った": "ったにゃ", "です": "ですにゃ", "よう": "ようにゃ", "ねこ": "にゃーん (=・ω・=)", "な": "にゃ", } // ReplaceMessge 文字列置換 func ReplaceMessge(c echo.Context) error { message := c.FormValue("message") utf8Message := utf8string.NewString(message) size := utf8Message.RuneCount() if size > 120 { return c.JSON(http.StatusBadRequest, "string length over") } for key, value := range keyword { message = strings.ReplaceAll(message, key, value) } if strings.HasSuffix(message, "にゃ") { message += "ん" } message += "\n#にゃイッター" if utf8string.NewString(message).RuneCount() >= 140 { return c.JSON(http.StatusBadRequest, "string length over") } return c.JSON(http.StatusOK, message) } |
echoインスタンス側への実装に、下記を追加したら完了です。
1 | e.POST("/replace", nyaitter.ReplaceMessge) |
これで、下記のようにリクエストをすると、変換された文字列が返却されます。
1 | curl --request POST --url http://localhost:3022/post --data message=これで変換できたかな |
おそらくレスポンスは、下記の感じになったはずです。
1 | "これで変換できたかにゃん\n#にゃイッター" |
これで、猫語変換の実装は完了です!
Go言語(Golang)側の実装は、残すところ後「1つ」です。
HTMLテンプレートの実装
実際のUIの部分は、HTML と CSS(Bootstrap) と JS で構築します。
echoの設定
Go言語(Golang)側の実装は、echo の設定をまず行います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | package server import ( "html/template" "io" "github.com/labstack/echo" "github.com/noriyuki-sasagawa/nyaitter_api/nyaitter" "github.com/noriyuki-sasagawa/nyaitter_api/page" "github.com/noriyuki-sasagawa/nyaitter_api/twitter" ) // RunAPIServer APIサーバー実行 func RunAPIServer() { t := &Template{ templates: template.Must(template.ParseGlob("./public/views/*.html")), } e := echo.New() e.Static("/css", "public/views/css") e.Static("/js", "public/views/js") e.File("/header.png", "public/views/header.png") e.Renderer = t e.GET("/", page.Index) e.GET("/tweet", page.Tweet) e.GET("/auth", twitter.AuthTwitter) e.GET("/callback", twitter.Callback) e.POST("/post", twitter.PostTwitterAPI) e.POST("/replace", nyaitter.ReplaceMessge) // サーバーを開始 go func() { if err := e.Start(":3022"); err != nil { e.Logger.Info("shutting down the server") } }() } // Render テンプレートレンダリング func (t *Template) Render(w io.Writer, name string, data interface{}, c echo.Context) error { return t.templates.ExecuteTemplate(w, name, data) } // Template テンプレート type Template struct { templates *template.Template } |
今までの実装の部分も載っていますが、大事なのはここの部分です。
1 2 3 | e.Static("/css", "public/views/css") e.Static("/js", "public/views/js") e.File("/header.png", "public/views/header.png") |
CSS と JS を読み込むための設定と、ヘッダー画像として使っている画像の絶対パスをここで設定しています
この設定を忘れると、HTMLファイル上では問題なく表示できるのに、Go言語(Golang)上では表示が崩れてしまいます。
HTMLのルーティング
HTMLのルーティングは、下記のように実装してます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | package page import ( "net/http" session "github.com/ipfans/echo-session" "github.com/labstack/echo" ) // Index index.html func Index(c echo.Context) error { return c.Render(http.StatusOK, "index.html", nil) } // Tweet tweet.html func Tweet(c echo.Context) error { return c.Render(http.StatusOK, "tweet.html", nil) } |
それぞれのルートで、それぞれの HTML を読み込むだけです。
これでGo言語(Golang)側の実装は、ほとんど終わりになります。
HTML(フロント)側の実装
今回は、Go言語(Golang)の記事なので、HTML側の実装の詳細は割愛させていただきます。
基本的な流れ
【1】
index.htmlでTwitterログイン機能がある ./auth へアクセスさせるようなボタンを用意します。
【2】
Twitterログインが完了したら ./callbackへ戻ってきますので、そのままtweet.htmlを表示します。
【3】
tweet.htmlでは、textareaで入力してもらった値を、Ajaxで ./replace に対してリクエストして、戻ってきた値をもう一つのプレビュー用の textara に表示します。
【4】
入力後にツイートする用のボタンをタップするとツイートされ、ボタンの下にツイートのリンクが表示されます。
にゃイッター完成!
そして、完成したアプリはこちらになります。
にゃイッターのソースは、以下のリポジトリで確認してください。
【リポジトリ】
https://github.com/noriyuki-sasagawa/nyaitter
連載を振り返ってみて
Go言語(Golnag)入門として、様々な実装を試してきましたが、いかがでしたでしょうか?
この15回の合間に笹川の個人アプリのAPIも全て、JavaからGo言語(Golang)へのリプレースが完了しました。
もう、すっかりGo言語(Golang)の人となってしまいました(笑)
笹川の感想としては、書きやすさや環境構築の手間などを考えれば、今後のAPI開発もGo言語(Golang)を続けていきたいなぁと思っています。
あと、注意していただきたいのは、他の言語でも同じようなことは十二分にできます。
そのため、絶対的にGo言語(Golang)が優れているわけではないという事です。
ご自身の技術力やチームやプロダクトの状態を考慮し、適切な技術選定をしていただくのが大前提です。
この入門記事は、Go言語(Golang)の習得を始めてみたり、困ったときに読んでいただければ幸いです。
皆様のお力になれれば、そんな嬉しいことはございません…!
長い間、お付き合いいただきありがとうございました!!
また、別の記事でお会いしましょう!
過去の記事で取り扱ったサンプル実装について
なお、過去の記事で取り扱ったサンプル実装は、全て以下のリポジトリにて管理しています。
【リポジトリ】
https://github.com/noriyuki-sasagawa/go_example/
オススメのGo入門本
こちらの記事もオススメ!
第1回の記事はこちら
書いた人はこんな人

- 新潟生まれ新潟育ち本業はモバイルアプリエンジニア。
日々、猫(犬)エンジニアとして活躍中!
IT技術9月 20, 2023開発効率を少しだけ上げるGithubActionsの便利な使い方
IT技術4月 7, 2023【ISUCON部】ライトコードISUCON部 始動!
IT技術4月 18, 2022【Android】Webでよくみる入力Boxを手作り
IT技術1月 19, 2022【Android】SeekbarでスイッチなUIを作る