Go
PHPを書いている時、軽度なエラーをどのように処理するか悩むときがあります。 Goを書いているときはとりあえずerrorをreturnすることが多いのですが、この理由も正直理解していませんでした。 上記に関して、最近ペアプロをして学びがあったのでメモ程度に…
マルチステージビルドとは マルチステージビルドとは、Dockerイメージをビルドする際に複数のコンテナ、ステージを使用する手法です。基本的に最初のステージでビルドや依存関係の解決を行い、最終のステージではコンテナに実行ファイルとその他実行に必要な…
テスト用にプログラムを用意する APIを作成する 今回のテストではAPIで呼び出される関数を直接実行することでテストを行います。そのため、APIのハンドラとなる部分を外に出して置きます。 Helloという関数で切り出しました。 package main import "github.c…
テストによってはサーバーを起動させることなくハンドラーの単体テストを行いたいことがあります。そういった場合にはリクエストを直接ハンドラーに流してあげることで結果を得ることができます。 テスト用にプログラムを用意する APIを作成する 前回の記事…
今回はそのテストの中でもサーバーを起動させてテストする方法について書きます テスト用にプログラムを用意する サーバーの初期化部分を切り分ける まず、APIのコードは初期状態であれば以下のようになっていると思います。 しかしこのままではテストができ…
開発をする上でテストを使って検証することは重要です。今回はそのテストをgithub actionsを使って自動で行うことに挑戦したので備忘録を残します。 ファイルを準備する まずは今回テストする関数を用意します。 今回は簡単な例として、足し算を行うAdd関数…
構造体の埋め込みについて 例えば人を定義するとき、その構造体の中に「住所」という情報を混ぜることになったとします。このとき、以下のように構造体の中で構造体を利用することになります。これを構造体の埋め込みと言います。 package main import "fmt"…
TL;DR 必須チェックを行う場合は構造体の変数をポインタ型にすることで0や空文字を使ってもバリデーションエラーを返さないようにできます。 type Human struct { Name *string `validate:"required"` Age *int `validate:"required"` } 遭遇した問題 Goで構…
タイトルの通りです。初めてゴルーチンを勉強したときにハマっけど以外に回答を見つけられなかったのでメモします。 ある日、以下のようなコードを書いたときにsub関数の中が全く実行されずに困っていました。 実際にはこんな簡単ではなく少し複雑なコードだ…
ファクトリー関数とは まずGoでは構造体からインスタンスを生成するとき、以下の3つの方法があります。 // 1. 構造体の宣言 type Person struct { FirstName string LastName string Age int } // newで作成 p := new(Person) // var変数宣言で作成 var p Pe…
Goにはimplementsがない 他の言語であればインターフェースを実装するときはimplementsなどのように明示して実装します。 phpであればこのようにインターフェスを実装するときはimplementsを使います。
「docker create」 をGo言語で 「Go client for the Docker Engine API」パッケージを使用します。 https://pkg.go.dev/github.com/docker/docker/client 以下のコードを実行するとdocker create httpdと同様の動作を行えます package main import ( "contex…
はじめに こんにちは、まるすけです 6/8に開催されたGo Conference 2024に一般参加者として参加してきました。 gocon.jp 参加経緯 最近趣味でGoを使うことがあり、少し詳しくなりたい、Go界隈の人とお近づきになりたいという経緯からです。 ここ最近でGo関連…
MySQLをデプロイ Goのアプリをデプロイ イメージの作成 pushしたイメージからPodを作成する 注意 この記事で用いているソースコードの大半はchatGPT(GPT-4)を用いて生成されています。あくまでサンプルと思って読んでください。 MySQLをデプロイ 以下のyaml…
viperを使っていたときに遭遇した事象です。 以下のように func LoadConfig(filename string) (*viper.Viper, error) { v := viper.New() // filename = "config.yaml" v.SetConfigName(filename) v.AddConfigPath(".") v.AutomaticEnv() if err := v.ReadIn…