Go関連のことを調べてみた

Go関連のことを調べてみた

結局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 structs

import “testing”

func TestPeriMeter(t *testing.T){
got := PeriMeter(10.0, 10.0)
want := 40.0

if got != want {
t.Errorf(“got %.2f want %.2f”, got , want)
}
}
“`
次に関数を作成します。
“`
package structs

func 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 integers

import “testing”

func TestAdder(t *testing.T) {
sum := Add(2, 2)
want := 4

if sum != want {
t.Errorf(“want ‘%d’ but got ‘%d'”, want, sum)
}
}
“`
これで実行すると、関数を作成していないので当然ながら失敗します。
“`
./adder_test.go:6:9: undefined: Add
“`

これだと、そもそもテストを実行できないので、テストを実行するための最小限のコードを記述し、あえて失敗したテスト出力を確認します。

`adder.go`をテストファイルと同じ階層に作成し、関数を作成します。
“`adder.go
package integers

func 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 main

import “fmt”

func main() {
var anyVal interface{}
anyVal = 1
fmt.Println(anyVal) // 1

anyVal = “string”
fmt.Println(anyVal) // string

anyVal = []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 は、アプリと体験をユーザー

元記事を表示

Go言語の特徴

# はじめに
ソフトウェア開発の世界には、多くのプログラミング言語があります。
Python、JavaScript、C、Ruby、最近ではRustやKotlinなど、それぞれ特徴があります。
様々なプログラミング言語に触れてきました。その中でも私が特に印象に残っているGo言語について解説したいと思います。
# Go言語とは
“**Go**”という名前にもあるようにGoogleが開発した言語です。
2009年に発表され、現在では様々なサービスに利用されています。[^1]
日本のサービスだと、メルカリやクックパッドなどがあります。
![スクリーンショット 2024-06-06 160725.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3809382/2075dcef-9ad5-e3ed-9f04-dfe5fde9b159.png)
# 特徴
特徴は大きく分けて3つほどあります。後ほど順に解説します。
* コンパイラ型
* 記述がシンプル
* 未使用の変数、モジュールはエラーになる

## コンパイラ型

元記事を表示

【個人開発】読みたい記事をストックするLINE Bot作ってみた

## はじめに

この度「あとで読むゼッタイ君」というLINE Botを個人で開発し、リリースしてみました。
その機能の紹介や技術的な話、感想等をつらつらと書いていきたいと思います。

ちなみに「あとで読むゼッタイ君」は、[こちらのリンク](https://lin.ee/WvHi3bx) or 以下のQRコードから友達追加が可能なので、ぜひ使って頂けると嬉しいです!

![あとで読むゼッタイ君.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526830/49daa827-b910-b19c-392c-eea1ffb375ca.png)

## どんなアプリ?

後で読みたいなーと思ったWebページを管理(登録・閲覧・削除)できるだけの超絶シンプルなLINE Botです。
具体的には、ユーザーが送ったメッセージ内容に応じて、以下の機能が利用できます。

– URLのみを送信すると、後で読みたい記事(WebページのURL)をブックマークとして登録できる
– 「読む」というメッセージを送信すると、ブックマー

元記事を表示

ドラ🔵もんで依存性の注入と依存性逆転の原則を理解する!!

# はじめに

依存性の注入(Dependency Injection, DI)は、習得するのは難しいですが、理解すると簡単にできるようになります。また、依存性の注入と間違えやすい概念として、SOLID原則の一つである依存性逆転の原則(Dependency Inversion Principle, DIP)があります。

今回は、依存性の注入と依存性逆転の原則という概念をドラ🔵もんで分かりやすく解説したいと思います。

ちなみにスライドもあります。(スライドにはコード例は載ってません)

# 依存性の注入(DI)

## DIをドラ🔵もんで解説する

の○太はドラ🔵もんに依存しています。ドラ🔵もんを他のロボットに変えるとの🟡太は死にます。生死がドラ🔵もんにかか

元記事を表示

【Golang入門】Gemini APIをGoで呼んでみた

OpenAIのAPIをコネコネやるのが流行っているようです。それに変な対抗意識を持って、あえてGeminiAPIを使ってGolangコネコネしてみました。3Gということ(勝手に私が言ってるだけです)でGCPにデプロイしようかなと思っていたりいなかったり。

そんな備忘録として書いておきます。

なお、実装についてはこちらを参考にしました。
とてもわかりやすいです。

またしっかりチュートリアルも用意されているため、このチュートリアルも参考にしても良いかと思います。

https://ai.google.dev/gemini-api/docs/get-started/tutorial?lang=go&hl=ja#set-up-api-key

## Geminiって?

一応Geminiについて軽く説明させていただきます。

Geminiとは、Googleの生成AIサービスです。Geminiは2023年12月に高性能AIモデルとして発表され、現在では以下の3つのモデルが存在します。

### Gem

元記事を表示

GitHub Actions で Go のテスト実行

CI の一環として、GitHub のデフォルトブランチに PR を作成した時と、マージをした時に UT を行う GitHub Actions を作成します。

### ファイル構成
“`
.github
  ├─ actions
  │ └─ go-ut
  | └─ action.yml
  └─ workflows
  └─ ci.yml
json
  ├─ go.mod
  ├─ go.sum
  ├─ pretty_print.go
  └─ pretty_print_test.go
.gitignore
“`
最終的にはリリースも GitHub Actions から行うため、UT の実行は action.yml に記載しています。
今回は、Go 言語の UT を対象にしており、json フォルダの下にコードおよび、テストコードが置かれています。

### Action
“` .github/actions/go-ut/action.yml
name: Go UT
description: Run go unit test

inputs:
g

元記事を表示

global-bundle.pemを使用しているのにfailed to verify certificate: x509: certificate signed by unknown authorityが出る

## TL;DR
使ってる`global-bundle.pem`が古かったです。
再度以下から取得しなおしたら解決しました。
https://truststore.pki.rds.amazonaws.com/global/global-bundle.pem

## 検証方法
RDSの認証機関に`rds-ca-rsa2048-g1`を使用しています。
そこで、`RDS Root 2019 CA`が含まれているかを確認します。
以下を実行して、何も出力されなければダメです。

### Javaのランタイムがこちら
“`console
keytool -printcert -v -file global-bundle.pem | grep -A2 “RDS Root 2019 CA”
“`

### Go langでやりたい方はこちら
“`go:main.go

package main

import (
“crypto/x509”
“encoding/pem”
“fmt”
“log”
“os”
“strings”
)

func main() {
pemData

元記事を表示

Go: ヘッダーを考慮した csv ファイルの読み込み

こちらのプログラムを[リートン](https://wrtn.jp/)で変換しました。
[Python3: ヘッダーを考慮した csv ファイルの読み込み](https://qiita.com/ekzemplaro/items/aabc6e3b9ac71e242d06)

## プログラム

“`go:csv_header.go
package main

import (
“encoding/csv”
“encoding/json”
“fmt”
“os”
)

func main() {
if len(os.Args) < 3 { fmt.Println("Usage: go run csv_to_json.go “)
return
}

inputCSVFile := os.Args[1]
outputJSONFile := os.Args[2]

// Open the CSV file
csvFile, err := os.Open(inputCSVFile)
if err !=

元記事を表示

OTHERカテゴリの最新記事