Go言語(Golang)入門~最終回~

笹川先生
(株)ライトコードの笹川(ささがわ)です!
引き続き、ツイートを猫語に変換する「にゃイッター」作っていきます!
簡単なTwitterアプリです。
詳しくは、前回の記事をご覧ください。
それでは、早速進めていきます!
前回の記事はこちら
2019.12.12Go言語(Golang)入門~第14回目~ 笹川先生 (株)ライトコードの笹川(ささがわ)です! そろそろレベルも...
猫語変換処理を実装
POSTで受け取った値を置換する処理で、「猫語変換」をします。
ReplaceAllを使うと一括置換が出来ます。
| strings.ReplaceAll(target, before, after) |
今回は、文字列 map の Key を、Value に変換するように実装します。
なぜ、文字列 map で管理するかと言うと、Go言語(Golang)が分からない人でも、どのように変換されるか解るようにしたかったからです。
簡単な仕組みのアプリですので、気軽にPR(プルリクエスト)や issue(イシュー)を作るなど、笹川以外の人にも開発してもらえたら面白いなと思っているので、このようにしております。
変換処理と対称
変換処理は、こんな感じですね!
| for key, value := range keyword { message = strings.ReplaceAll(message, key, value) } |
ちなみに変換対象は、こんな感じにしてます。(2019/11/21 現在)
| var keyword = map[string]string{ "oh": "オオン", "oh...": "オオオオオオン", "バキューン": "ニャオーン", "わおーん": "ニャオーン", "うま言う": "ちょw誰が上手いこと言えって言ったにゃww", "まだ": "まだにゃ", "した": "したにゃ", "った": "ったにゃ", "です": "ですにゃ", "よう": "ようにゃ", "ねこ": "にゃーん (=・ω・=)", "な": "にゃ", } |
一部おかしい変換があるのは、Twitter上で案を出してもらったりしたのを、そのまま採用したからです(笑)
140文字制限の対応
あと、Twitterには投稿する際に140文字の制限がありますので、そちらも忘れずに対応します。
| utf8Message := utf8string.NewString(message) size := utf8Message.RuneCount() if size > 120 { return c.JSON(http.StatusBadRequest, "string length over") } |
日本語はマルチバイトなので、 len(target) では正しく取れませんので注意してください。
文末が 「にゃ」 で終わっていたら 「にゃん」 になるようにします。
| if strings.HasSuffix(message, "にゃ") { message += "ん" } |
最後にハッシュタグを付けます。
全体
全体としては、こんな感じになります。
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インスタンス側への実装に、下記を追加したら完了です。
| e.POST("/replace", nyaitter.ReplaceMessge) |
これで、下記のようにリクエストをすると、変換された文字列が返却されます。
| curl --request POST --url http://localhost:3022/post --data message=これで変換できたかな |
おそらくレスポンスは、下記の感じになったはずです。
これで、猫語変換の実装は完了です!
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 } |
今までの実装の部分も載っていますが、大事なのはここの部分です。
| 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/
関連記事
2019.09.13Go言語(Golang)を習得したい! 笹川先生 (株)ライトコードでモバイルアプリケーション開発をしている笹川(ささが...
2019.09.17Go言語(Golang)を習得したい!~第2回~
(株)ライトコードの笹川(ささがわ)です。 前回に引き続き、今回もGo言語(Gol...
2019.09.26Go言語(Golang)入門~第3回目~ 笹川先生 (株)ライトコードの笹川(ささがわ)です。 今回でGo言語(G...
2019.10.02Go言語(Golang)入門~第4回目~ 笹川先生 (株)ライトコードの笹川(ささがわ)です 今回も、Go言語(G...
2019.10.09Go言語(Golang)入門~第5回目~ 笹川先生 (株)ライトコードの笹川(ささがわ)です! 前回は、RESR ...
2019.10.17Go言語(Golang)入門~第6回目~ 笹川先生 (株)ライトコードの笹川(ささがわ)です! 先日、Twitte...
2019.10.23Go言語(Golang)入門~第7回目~ 笹川先生 (株)ライトコードの笹川(ささがわ)です! 今回は、前回に引き...
2019.10.30Go言語(Golang)入門~第8回目~ 笹川先生 (株)ライトコードの笹川(ささがわ)です! 前回は、Twitt...
2019.11.06Go言語(Golang)入門~第9回目~ 笹川先生 (株)ライトコードの笹川(ささがわ)です! 前回は、Goの環境...
2019.11.13Go言語(Golang)入門~第10回目~ 笹川先生 (株)ライトコードの笹川(ささがわ)です! 今回は、前回に引...
2019.11.20Go言語(Golang)入門~第11回目~ 笹川先生 (株)ライトコードの笹川(ささがわ)です! 今回は、Fire...
2019.11.27Go言語(Golang)入門~第12回目~ 笹川先生 (株)ライトコードの笹川(ささがわ)です! 今回は、データベ...
2019.12.04Go言語(Golang)入門~第13回目~ 笹川先生 (株)ライトコードの笹川(ささがわ)です! 今回は、前回に引...
2019.12.12Go言語(Golang)入門~第14回目~ 笹川先生 (株)ライトコードの笹川(ささがわ)です! そろそろレベルも...
ライトコードよりお知らせ

にゃんこ師匠

ミツオカ

にゃんこ師匠

ミツオカ

にゃんこ師匠

ミツオカ
お気軽にお問い合わせください!せっかくなので、別の記事もぜひ読んでいって下さいね! 一緒に働いてくれる仲間を募集しております!

ライトコードでは、仲間を募集しております!
当社のモットーは「好きなことを仕事にするエンジニア集団」「エンジニアによるエンジニアのための会社」。エンジニアであるあなたの「やってみたいこと」を全力で応援する会社です。
また、ライトコードは現在、急成長中!だからこそ、あなたにお任せしたいやりがいのあるお仕事は沢山あります。「コアメンバー」として活躍してくれる、あなたからのご応募をお待ちしております!
なお、ご応募の前に、「話しだけ聞いてみたい」「社内の雰囲気を知りたい」という方はこちらをご覧ください。
書いた人はこんな人
- 笹川 (社員)
- 新潟生まれ新潟育ち本業はモバイルアプリエンジニア。
日々、猫(犬)エンジニアとして活躍中!