- 1. GoでJSONレスポンスに含めたくないデータがあるときの対処法
- 2. Goのインターフェイスの使い方
- 3. Go言語によるPDFからテーブル情報を抽出するCLIアプリの制作で詰まったこと
- 4. learn-go-with-tests ポインタとエラー
- 5. Goのテストの後処理におけるdeferとt.Cleanupの差
- 6. Go言語でのEchoハンドラテストとContextのモック方法
- 7. Go の Scanner で CSV インポートファイルを読み込む際の改行コードの扱いについて
- 8. 結局doneチャネルパターンって何だったのさ?
- 9. GolangのORM「ent」でクエリビルダーを使い回したらハマった話
- 10. #github.com/go-playground/universal-translatorのエラーの解決
- 11. learn-go-with-tests 構造体、メソッド、インターフェース
- 12. Windowsに入れたVSCodeでコーディングして、DockerでGoを動かす方法
- 13. 関数のカリー化 is 何
- 14. learn-go-with-tests 整数〜配列とスライス
- 15. 【Golang】Go の最新リリース・バージョンの確認・取得【cURL】
- 16. GoのLinterさん【calculated cyclomatic complexity】は自分のコード力が低いってこと?
- 17. AWS Lambda関数をGolangで実装し、Github Actionsで構築自動化してみた
- 18. earn-go-with-tests Goをインストールする〜Hello, World
- 19. Goの空のインターフェースであらゆる型を代入できるのってなんで?
- 20. UTアカマイTシャツのGo言語コードを解読してみた
GoでJSONレスポンスに含めたくないデータがあるときの対処法
ユーザーデータをJSONで返すとして、その中にパスワードなどの返す必要のないデータが含まれていたときに、簡単に除外する方法がある。
たとえば、User構造体にパスワードが含まれていて、それをJSONレスポンスに含めたくない場合は、構造体のJSONタグに`json:”-“`と書くと除外してくれる。
“`go
package mainimport (
“encoding/json”
“net/http”
)type User struct {
ID int `json:”id”`
Name string `json:”name”`
Age int `json:”age”`
Email string `json:”email”`
Password string `json:”-“`
}func main() {
user := User{
ID: 1,
Name: “Test Test”,
Age: 25,
Email: “test@example.com”,
Goのインターフェイスの使い方
何らかの方法で通知をしたい場合を例に挙げる
1. インターフェイスSenderを宣言し、実装すべきメソッドを定義する
1. 送りたい手段の具体的な構造体を定義する(ここではSlackとメール)
1. その構造体にインターフェイスのメソッドを実装する
1. 使用する“`go
package maintype Sender interface {
Send(msg string) error
}type Slack struct {}
func (s *Slack) Send(msg string) error {
// Slackにメッセージを送信する処理
return nil
}type Mail struct {}
func (m *Mail) Send(msg string) error {
// メールを送信する処理
return nil
}func main() {
var sender Sendersender = &Mail{}
err := sender.Send(“Hello, Mail!”)
if err !=
Go言語によるPDFからテーブル情報を抽出するCLIアプリの制作で詰まったこと
:::note info
この記事は制作途中です.
随時コードブロックなどを追加して見やすくしていきます.
:::# 概要
大学の奨学金一覧のPDFをスクレイピングで取り込んで,それを適切に処理して欲しいデータだけを抽出したいという思いでCLIアプリの制作を始めたが,色々詰まったので備忘録として残しておきます.
成果物(途中) -> https://github.com/Acu4git/pdfxtractor# 当初の構想
* Go言語のみで実装したい(個人的に重要)
* 奨学金一覧のPDFが掲載されている場所は固定されており,PDFファイル名は決まったフォーマットに従っているため,スクレイピングライブラリと正規表現を用いることで取得できそう
* PDFからの表データの抽出は,PDFからテキストを抽出できるライブラリがあればいけそう
* ついでにCSV変換が出来れば嬉しい
* 後は構造体にマッピングして,処理を加えればいけそうスクレイピングは問題なく成功し,GoのPDFライブラリによるCSV変換も無事できたため,幸先が良い...かのように思えた
# 突如PDFライブラリが
learn-go-with-tests ポインタとエラー
# ポインタとエラー
ここでは、Bitcoinを預金するWallet構造体を作成しましょう。## 最初にテストを書く
以下のようにテストを書き実行します。
当然`./wallet_test.go:7:12: undefined: Wallet`で失敗します。
“`wallet_test.go
package bitcoinimport “testing”
func TestWallet(t *testing.T){
wallet := Wallet{}
wallet.Deposit(10)got := wallet.Balance()
want := 10if got != want {
t.Errorf(“got %d want %d”, got , want)
}
}
“`## テストを実行するための最小限のコードを記述し、失敗したテスト出力を確認します
コンパイラはWalletが何であるかを知らないので、それを伝えましょう。`type Wallet struct { }`
これで財布ができました。もう一度テストを実行してください。
`
Goのテストの後処理におけるdeferとt.Cleanupの差
単体テストにおいて前処理と後処理をする場合が多い。
例えばDBのデータを作成/削除する、一時ファイルを作成/削除するなどテスト対象の関数やメソッドの責務のみに集中するためには、テストの前処理と後処理を行う必要がある。
Goのテストにおいての前処理と後処理にはTestMain関数を用いる。
一方で各テスト関数において前処理と後処理を行う方法として、`defer`と`t.Cleanup`がある。
この挙動の差をサンプルコードを用いて確認する。
## deferとt.Cleanupの違い
`defer`は関数の終了時に実行される処理を登録する。
一方で`t.Cleanup`はテスト関数の後処理を登録する関数で、テスト関数が終了するときに登録した関数が実行される。
## サンプルのテストコード
さて問題です。
次のようなテストコードが実行されるとどのように表示されるか。
“`go
package main_testimport (
“fmt”
“testing”
)func TestMain(m *testing.M) {
fmt.Println(“bef
Go言語でのEchoハンドラテストとContextのモック方法
以下では、UserHandler構造体のGetUserメソッドをテストする方法について説明します。特に、echo.Contextをどのようにしてモックするかに焦点を当てます。
UserHandler構造体とそのGetUserメソッドは以下のように定義されています。
“`go
コードをコピーする
type UserHandler struct {
userService service.UserServiceInterface
}func (h *UserHandler) GetUser(c echo.Context) error {
use, err := h.userService.GetUser()
if (err != nil) {
c.String(http.StatusInternalServerError, “error”)
return err
}u := &user.User{
Name: use,
}
c.JSON(http.StatusOK, u)
return nil
}
“`このメソッドをテストするために、`c`と
Go の Scanner で CSV インポートファイルを読み込む際の改行コードの扱いについて
## 問題
Go の Scanner の挙動の違いにより、CSV インポート時のカウントにズレが生じました。例えば **CSV ファイルの中身が「`A \n B`」** のように 1 行の中に改行コードを含む場合。
改行コードも含めて 1 行と見なしたいケースを想定します。下記①の場合ですと、改行コードで分割されて 2 行、
②の場合だと改行コードも含めて 1 行でカウントされます。今回は②の挙動を期待していたのに、①の処理がなされていたために、想定するカウントとズレが発生した、という問題についてです。
## ①.`bufio.NewScanner`における`Scan`メソッドの挙動
### 処理
“`
scanner := bufio.NewScanner(csv)
num := 0
for scanner.Scan() {
num++
}
fmt.Println(num)
“`### 出力結果
“`
2
“`### 説明
– [func NewScanner(r io.Reader) *Scanner](https://pkg.go.dev/b
結局doneチャネルパターンって何だったのさ?
# 1. はじめに
Goのゴルーチン(Goroutine)はだいたいわかったはずなのに、doneチャネルパターンがよくわからない……。(´・ω・`)
数学の問題の解説文がわからなかったときの感覚と似ている……。
こういう時は確か、前提知識となる部分がどこかで抜け落ちているから、理解を阻む壁にぶつかっているのだと思う。
φ(・ω・ )フムフム……(参考書の読み直し中)
あぁ……、そっかぁ~~
(;´д`)=3となったので、その過程や、どうdoneチャネルパターンを理解したかを忘備録がてら共有してみようと思い、この記事を書きました。
# 目次
– [1. はじめに](#1-はじめに)
– [2. doneチャネルパターンとは](#2-doneチャネルパターンとは)
– [3. selectの応用](#3-selectの応用)
– [3-1. キャンセレーション関数](#3-1-キャンセレーション関数)
– [3-2. タイムアウト](#3-2-タイムアウト)
– [3-3. caseの無効化](#3-3-caseの無効化)
– [4.
GolangのORM「ent」でクエリビルダーを使い回したらハマった話
Golangに「ent」というORMがあります。
もともとはFacebookが開発したパッケージで型安全でありクエリ用の関数を自動生成してくれたりと大変使い勝手の良いORMです。そんな「ent」ですが、クエリビルダーの仕様を誤解していて半日ほどハマってしまいました。
下記のようなコードがあったとします。
“`go
query := client.Query()
if limit > 0{
query.Limit(limit)
}ids := []int{1,2,3,4,5}
for _, id := range ids {
query.Where(user.IdIn(id)).All(ctx)
}
“`このコードではAll()メソッドの実行を契機にDBへクエリが投げられるのですが、実はWhere()で設定した条件はイテレーションを跨いで保持されます。
entパッケージで定義されているクエリビルダーは内部に検索条件を保持するスライスを持っている構造体で、All()などでクエリを実行しても検索条件をクリアしません。
なので変数として定義したクエリビルダー
#github.com/go-playground/universal-translatorのエラーの解決
# エラー
#github.com/go-playground/universal-translator
C:\Users\user\go\pkg\mod\github.com\go-playground\universal-translator@v0.18.1\import_export.go:221:12: undefined: ErrMissingLocale
C:\Users\user\go\pkg\mod\github.com\go-playground\universal-translator@v0.18.1\import_export.go:244:12: undefined: ErrBadPluralDefinition
C:\Users\user\go\pkg\mod\github.com\go-playground\universal-translator@v0.18.1\translator.go:101:11: undefined: ErrConflictingTranslation
C:\Users\user\go\pkg\mod\github.com\go
learn-go-with-tests 構造体、メソッド、インターフェース
# 構造体、メソッド、インターフェース
高さと幅を指定して長方形の周囲を計算するために、いくつかのジオメトリコードが必要だとします。 Perimeter(width float64, height float64)関数を記述できます。 ここで、 float64は 123.45のような浮動小数点数用です。## 最初にテストを書く
まずはいつも通りテストを最初に記述します。
`%f`はfloat64用で、`.2`は小数点以下2桁を出力することを意味します。
“`shapes_test.go
package structsimport “testing”
func TestPeriMeter(t *testing.T){
got := PeriMeter(10.0, 10.0)
want := 40.0if got != want {
t.Errorf(“got %.2f want %.2f”, got , want)
}
}
“`
次に関数を作成します。
“`
package structsfunc PeriMeter(Height, width flo
Windowsに入れたVSCodeでコーディングして、DockerでGoを動かす方法
## はじめに
以下の教材に取り組む際、Windowsでcurlコマンドを実行しようとするとオプションを変える必要があったりとストレスを感じ、Dockerで開発環境を作成しました。その際の設定を簡単に記録しておきます。
https://techbookfest.org/product/jXDAEU1dR53kbZkgtDm9zx?productVariantID=dvjtgpjw8VDTXNqKaanTVi
## 環境
– Windows10
– Docker Desktop:26.1.1## ディレクトリ構成
“`shell-session
project
├ src
│ ├ Dockerfile
│ ├ go.mod
│ └ main.go
└ compose.yaml
“`## 各ファイル
### Dockerfile
最低限の構成です。将来的にデータベースを入れるのでイメージはGoではなくUbuntuにしています。
主に使いたいのはcurl, gitで、確認用にvim, tree, lsofを入れています。
“`Dockerfile:Docker
関数のカリー化 is 何
関数を引数に取る関数を定義することができる関数を高階関数と呼び、Go, JavaScript, Python などのプログラミング言語では高階関数をサポートしています。
この機能を使うことで、関数を引数に取る関数を定義することができます。また、関数を返す関数を定義することもできます。
何を言っているかわかりづらくなってきたのでGoで具体的な例を見てみましょう。
## 高階関数
“`go
func highOrderFunc(f func(int) int) func(int) int {
return f
}
“`この関数のように関数を引数に取ることや、関数を返すことができます。
## カリー化
カリー化とは、関数を部分適用することで新しい関数を作ることです。
もう少し詳細に説明すると複数の引数を取る関数を、一つの引数を取る関数の連続で表現することです。
`f(x, y)` という関数をカリー化すると、`f(x)(y)` という形になります。
この状態をGoで表現してみましょう。
“`go
func curriedAdd(x int) func(int)
learn-go-with-tests 整数〜配列とスライス
# 整数
`integers`というディレクトリを作成し、その中に`adder_test.go`を作成します。
TDDなのでまずはテストから書いていきます。
“`adder_test.go
package integersimport “testing”
func TestAdder(t *testing.T) {
sum := Add(2, 2)
want := 4if sum != want {
t.Errorf(“want ‘%d’ but got ‘%d'”, want, sum)
}
}
“`
これで実行すると、関数を作成していないので当然ながら失敗します。
“`
./adder_test.go:6:9: undefined: Add
“`これだと、そもそもテストを実行できないので、テストを実行するための最小限のコードを記述し、あえて失敗したテスト出力を確認します。
`adder.go`をテストファイルと同じ階層に作成し、関数を作成します。
“`adder.go
package integersfunc Add(x, y int) i
【Golang】Go の最新リリース・バージョンの確認・取得【cURL】
> Go(以下 Golang)のリリースされている最新のバージョンを cURL で取得したい。
ぶっちゃけ [https://go.dev/dl/](https://go.dev/dl/) を覗きに行けばいいのですが、golang 本体の更新をパッケージマネージャでなく俺様スクリプトで行っているため、**バージョン情報を取得できるエンドポイントが欲しかった**のです。
[`golang 最新リリースバージョン 確認 curl` でググって](https://www.google.com/search?q=golang+%E6%9C%80%E6%96%B0%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%B9%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3+%E7%A2%BA%E8%AA%8D+curl)もピンポイントでヒットしなかったり、`https://go.dev/VERSION?m=text` を使った方法ばかりだったので、自分のググラビリティとして。
#
GoのLinterさん【calculated cyclomatic complexity】は自分のコード力が低いってこと?
こんにちは。
株式会社HRBrainでバックエンドエンジニアをしているみつです!Goで実装をしていてLinterに`calculated cyclomatic complexity`と怒られ、しょんぼりしながら記事を書いています:frowning2:
`//nolint:`したい気持ちを一旦抑えて、「cyclomatic complexity(循環的複雑度)」について調べてCIと戦いたいと思います。
## cyclomatic complexity(循環的複雑度)とは?
そもそも**循環的複雑度というのは、リファクタリングが必要なコードを特定するためのコード品質指標**。**独立な経路の数を数値化するもの**で、関数のソースコードにおける複雑さを計測する指標です。
> サイクロマティック複雑度は、リファクタリングが必要なコードを特定するために使用できるコード品質指標である。関数のソースコードを通る直線的に独立したパスの数を測定する。[DeepL訳]
> Cyclomatic complexity is a code quality metric which can be
AWS Lambda関数をGolangで実装し、Github Actionsで構築自動化してみた
## 1. はじめに
この記事では、AWS Lambda関数をGolangで実装し、その更新を手動および自動化する方法について解説します。特に、GitHub Actionsを用いた構築自動化の手法に焦点を当てます。## 2. AWS Lambdaとは
AWS Lambdaは、イベント駆動型のサーバーレスコンピューティングサービスです。ユーザーはインフラストラクチャを管理することなくコードを実行できます。
https://aws.amazon.com/jp/lambda/## 3. GolangでのLambda関数実装
### 3.1 Golangの環境構築
※他記事を参考にしてください。### 3.2 簡単なLambda関数の作成
今回、Lambdaはコンテナイメージで実装しています。コンテナイメージにする利点や具体的な実装詳細については[エムスリーさんのテックブログ](https://www.m3tech.blog/entry/2023/08/31/110000)を参考にしました。
以下は要点です:
– GolangでのLambda関数作成手順
– AWS Lambd
earn-go-with-tests Goをインストールする〜Hello, World
# はじめに
Goを学習していて以下のサイトに出会い、学習していますが一通りgoの文法を理解できた方にとてもおすすめです。https://andmorefine.gitbook.io/learn-go-with-tests/go-fundamentals/install-go
# Goをインストールする
モジュールは、依存関係管理、バージョン選択、再現性のあるビルドに関連する問題を解決することを目的としており、ユーザは GOPATH の外で Go コードを実行することもできます。
が指定されていない場合、go mod initはディレクトリ構造からモジュールのパスを推測しようとしますが、引数を与えることでそれを上書きすることもできます。
“`
mkdir my-project
cd my-project
go mod init
“``modulepath`とは、Goプログラミング言語におけるモジュールシステムでモジュールを一意に識別するための文字列です。モジュールパスは、そのモジュールがどこにホストされているかを示すUR
Goの空のインターフェースであらゆる型を代入できるのってなんで?
Goの空のインターフェースは、どんな型でも受け取ることができるため、あらゆる型を代入できます。
“`go
package mainimport “fmt”
func main() {
var anyVal interface{}
anyVal = 1
fmt.Println(anyVal) // 1anyVal = “string”
fmt.Println(anyVal) // stringanyVal = []int{1, 2, 3}
fmt.Println(anyVal) // [1 2 3]anyVal = map[string]int{“key”: 1}
fmt.Println(anyVal) // map[key:1]
}
“`これがなぜできるのかを知ったときになるほどと思ったため説明していきます。
## インターフェース
そもそもインターフェースとはなんでしょうか?
[こちらの記事](https://qiita.com/tsukasaI/items/7b6516adc
UTアカマイTシャツのGo言語コードを解読してみた
# はじめに
都知事選である。祭りである。
Qiitaに生息するIT関係者、エンジニア界隈として最も注目されているのは安野貴博候補であろう。安野たかひろ(東京都知事候補)公式ホームページ
https://takahiroanno.com
その安野候補がよく着用している服はUNIQLOのアカマイ・テクノロジーズ社コラボUT。
https://www.uniqlo.com/jp/ja/products/E459561-000/00?colorDisplayCode=09&sizeDisplayCode=004
>アカマイ・テクノロジーズ
>
>クラウドカンパニー / 1998年に設立されたAkamai Technologies, Inc.は、オンラインライフの力となり、守るクラウドカンパニーです。世界の先進企業が Akamai を選び、安全なデジタル体験を構築して提供することで、Akamai は、毎日、世界中の人々の生活、仕事、娯楽をサポートしています。超分散型のエッジおよびクラウドプラットフォームである Akamai Connected Cloud は、アプリと体験をユーザー