Go

Goのビルドでduplicate symbolエラーが発生する時

Go

次のようにエラーが発生してハマったので備忘録です。 /usr/local/Cellar/go/1.17.2/libexec/pkg/tool/darwin_amd64/link: running clang failed: exit status 1 duplicate symbol '_Device_MakeLibrary' in: /var/folders/75/q516bd996r18sn7nj_3_05xm0000g…

GoでCLIツールを作ってinstallする

Go

GoでCLIを自作してinstallするまでの一連の流れを紹介します。 ツールを作る 例えば、次のようなechoコマンドと同じような動作をするmyechoを作成します。 package main import ( "flag" "fmt" ) func main() { flag.Parse() args := flag.Args() cmd := "" …

mapの値を更新したい場合

Go

Goでmapの値を更新したい場合 次のようにmapへ直接更新することはできない type Sample struct { state bool } var samples = map[string]Sample{ "hoge": {true}, "fuga": {false}, } fmt.Println(samples["hoge"].state) // getはできる samples["hoge"].s…

コマンドラインにオプションを付ける

Go

自作のコマンドラインツールで、オプションon/offで動作を変えたい。 flag packageを使う。 次のように-optを付けるだけで動作を変えたい場合はboolを使うことになる。 mytool -opt func main() { opt := flag.Bool("opt", false, "オプションの説明") // デ…

コマンドラインでディレクトリを受け取る

Go

自作のコマンドラインツールでディレクトリを受け取って、 絶対パス、相対パスどちらも同じように扱いたい。 そんな場合はfilepath.Absを使って絶対パスに置き換えてしまうのが良さそう。 filepath.Absは絶対パスを渡しても問題なく動作する。 path1, _ := f…

ginでHTTP RequestのPathParameterを受け取る

Go

Path Parameterの後ろに階層がある場合 次のようなAPIを定義する GET /user/:name/profile GET /uesr/:name/history これをginで実装する方法は公式ページにも紹介されている。 r.GET("/user/:name/*action", func(c *gin.Context) { name := c.Param("name"…

HTTP Requestのパラメータ

Go

HTTP Requestのパラメータは以下の3種類がある。 パスパラメータ クエリパラメータ リクエストボディパラメータ パスパラメータ(Path Parameter) 単一のパラメータ 基本的な書き方は次の通り 設計書 /item/{pathparameter} /item/:pathparameter 呼び出し方…

CORSを解決してローカル環境で2つのサービスを動かしたい

ブラウザのWebページから、別サーバのWebAPIを呼び出すという動作検証を両方ローカル環境でやりたい、というのが今回の趣旨です。 次のような2つのサービスを用意して、ローカル環境で動作させます。 サービス URL Webページ localhost:5000で起動。アクセ…

Go Modulesでローカルパッケージをインポートする

Go

まさに欲しい情報が書いてあるページを見つけました。 zenn.dev GitHubにアップするまではexampleというモジュール名を仮でつけておくことが多いのですが、 その場合だと次のように書けばapiパッケージをインポートできます。 package main import ( "exampl…

Go Modulesについて

Go

先日、Go Modulesの操作ミスが重なってリポジトリを1つ失うことになりました。悲しいことが2度と起きないようにGo Modulesの勉強をしました。 この記事はThe Go Blog using go module からピックアップした内容です。 モジュールを作成する モジュール名はg…

Goでゲームのロビー機能のようなモノを作る〜宿題の提出1

Go

はじめに Go2 Advent Calendar 2020 9日目の記事の宿題の提出です。 この記事では、ゲームのマッチングを行うロビー機能をGoで作って紹介しました。 記事の時点ではWebSocketを管理するhubをpoolに戻す処理が未対応で宿題となっていました。 今回はこの部分…

WebSocket通信しようとしてハマった話

Go

WebSocketで通信するミニゲームを作っていてハマったので備忘録に書いておこうと思います。 今回はバックエンドをGoで、フロントをjavascriptで実装しています。 ファイル構成はこんな感じ。 src ├── static │ └── connect4.html ├── client.go ├── hub.go └…