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

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

The Zen of Go

:::note info
この記事はAndrew Gerrand氏の[Go and the Zen of Python](https://go.dev/talks/2012/zen.slide#1)を訳したものです。
:::

## “Beautiful is better than ugly.”

Goは、C言語を彷彿とさせる軽量で規則的な構文を持っている
しかし、美しいか醜いかは、個人に依存する

## “Simple is better than complex.”

メソッドはただの関数であり、特別な場所は無い
thisやselfなどのキーワードはなく、レシーバは他の関数引数と同じようなものである

“`go
type Vector struct {
X, Y float64
}

func (v Vector) Abs() float64 {
return math.Sqrt(v.X*v.X + v.Y*v.Y)
}
“`

## “Simple is better than complex.”

メソッドはクラスがなくても任意の名前付き型で宣言できる

元記事を表示

プログラミングについて管理者がとりあえず知っておきたい内容 Go言語編

# 業務で利用しないのに何日もかけて勉強するのはちょっとしんどい!

「1日」ならできる!

# たった1日で基本が身に付く!Go言語  清水 美樹[著]

以下は本のホント触りの部分。詳しくは本を参照ください!

・Google社が開発したプログラミング言語。
・「構造体」「ポインタ」等、C言語を感じさせるが、C言語より簡単
・コンパイラを用いてOS上で直接動く実行プログラムを作成する。

|言語|説明|
|—-|—-|
|C/C++|WEBアプリから周辺機器のドライバまで幅広い用途。コンパイラ必要。|
|Java|オブジェクト指向言語。C言語の書き方に近い部分あり。ライブラリや開発ツール豊富。実行環境をインストールした上でコンパイラで中間言語に変換する。|
|C#|Microsoftの.NETフレームワークを実行環境とするオブジェクト指向言語。コンパイラ必要。Microsoft Visual Studioが主要な開発ツール。|
|Python|最近ではAIと共に再注目されている。|
|JacaScript|HTML5との組み合わせでWEBページの記述で使用される言

元記事を表示

Go 1.21.0からruntime/coverage.WriteCountersDirで-covermode=atomicエラー

GoのバージョンをGo 1.21.0に上げた所、
scenarigoを利用して起動しているE2Eテストにて、
カバレッジを出力するAPIにて、下記エラーが出るようになった。

“`go
func (h *Handler) Record(gc *gin.Context) {
err := coverage.WriteCountersDir(“./_coverage”)
if err != nil {
panic(err)
}
}
“`

“`zsh
2023/12/18 18:36:24 http: panic serving 127.0.0.1:52164: WriteCountersDir invoked for program built with -covermode=set (please use -covermode=atomic)
goroutine 3046 [running]:
net/http.(*conn).serve.func1()
“`

## 原因

Go 1.21.0から、atomic mode必須に変更されている。

### Go 1.2

元記事を表示

Echo(Go)のMiddlewareを理解する (Recover,CORS)

# はじめに
こんにちは。TuneCoreJapanでバックエンドエンジニアをしています @masafumi330 です。
この記事は[Wano Group Advent Calendar2023](https://qiita.com/advent-calendar/2023/wano-group) 最終日の記事です。もう一度言いますよ。最終日の記事です!

今回は、弊社バックエンドアプリケーションの開発でも使用しているGo、 そのフレームワーク**Echo**について、その**Middleware**の機能にフォーカスを絞り、
– Middlewareとは何なのか?
– Middlewareによってどのような課題を解決できるのか?
– 実際にどのようにMiddlewareの機能を使うのか?
をまとめていきたいと思います。

https://echo.labstack.com/

# 調査の経緯
まずは今回、EchoのMiddleware機能を調査してみるにあたった経緯を話そうと思います。

Wanoに入社して2年間、私はバックエンドチームにてGoを用いたアプリケーション開発を行ってき

元記事を表示

【Go言語】ジェネリクス

**ジェネリクス**は、関数や構造体に型パラメーターを追加することで、より柔軟なコードの記述を可能する。
しかし、ジェネリクスの概念はメソッドの記法とは異なる点がいくつかある。

ジェネリクスの基本
* ジェネリクスを使うと、関数や構造体に追加の型パラメーターを設定できる
* 型パラメーターは関数名や構造体名の後ろに配置され、角括弧`[]`で囲む
* さまざまな型に対して同じ関数や構造体を使い回せるようになる。

### 構造体でジェネリクス
“`go
package main

import “fmt”

// ジェネリックな構造体
type Pair[T1, T2 any] struct {
First T1
Second T2
}

func main() {
// ジェネリックな構造体の使用例
pair1 := Pair{1, “one”}
pair2 := Pair{“two”, 2}

fmt.Printf(“Pair 1: First=%v, Second=%v\n”, pair1.First, pair1.Second

元記事を表示

GoのORM決定版 Genをはじめよう

# はじめに
こんにちは、muff1225です。

2023年も終わりに近づいてきましたね〜
今年もGoたくさん書いて、たくさんリリースできましたか?

私は長らくGoのORMの書き味に悩んでいましたが、今年ようやく一つの答えに辿りつきました。

この記事ではgormの[Gen](https://gorm.io/ja_JP/gen/)の開発者体験が最高だった、ということで感謝の意味を込めてgormの[Gen](https://gorm.io/ja_JP/gen/)を紹介します。

# GoのORM
## 歴史
みなさんはGoのプロジェクトでどんなORMを使ってますか?
GoはORMを使う派 / 使わない派でくっきり分かれている印象です。
これはGoの思想として、標準パッケージを使うことがよしとされている文化的な背景や、まだ他言語に比べ歴史が浅いという背景があり、現時点でデファクトスタンダードなアプローチはありません。
とはいえGoにもORMパッケージはたくさんあり、Active Recordのようなフルパッケージのものであったり、シンプルなクリエを書くための軽量ORMであったりとさまざ

元記事を表示

GoでREST APIを実装し、クリーンアーキテクチャを整理してみた

今年の2月からLaravelで開発を行っています。そんな中、一番詰まったのは

**「責務を分けて実装」**

でした。クリーンアーキテクチャってやつです。
正直今でも感覚的にしかわかっていない点がありますが、今年のまとめとしてクリーンアーキテクチャの復習をするつもりで趣味で触っているGoを使ってREST APIを実装してみました。(gRPCじゃないのかよって突っ込まれそう)

年の瀬に、一番苦手だったことを記事にして恥を晒して年越しします。
アドベントカレンダーのトリがそんなんですみません。
どこかに飛んでいきたい・・・・鳥だけに。

## クリーンアーキテクチャ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3287130/91fa8c71-8353-400d-0698-07e4fbcbe774.png)

>[クリーンアーキテクチャ(The Clean Architecture翻訳)](https://blog.tai2.net/the_clean_architecture.ht

元記事を表示

【Go言語】エラーに自分で情報を追加する方法

## pkg/errorsについて

`pkg/errors` は、エラーハンドリングを強化するために使うパッケージです。今回はこれを使います。

Go1.13からは標準の `errors` パッケージというのが標準パッケージに追加されたのですが、`errors`は未だにいろんなところで見かけるので、今回は `pkg/errors` を使います。

移行についても紹介します。

### go getする

“`bash
go get github.com/pkg/errors
“`

### errors.Wrapを使ってエラーに情報を追加する

`errors.Wrap` は、エラーに情報を追加するための関数です。

以下のようにerrにエラーが入っているときに、`errors.Wrap` を使うとエラーに情報を追加することができます。
以下のように関数がエラーを返すときにWrapで情報を追加してあげることができます。

“`go
package main

import (
“fmt”
“io/ioutil”

“github.com/pkg/errors”
)

f

元記事を表示

Goのベンチマークをとる

# ベンチマーク
Goには標準関数でベンチマークを計測するものがあるので、試してみます。
ベンチマーク対象はフィボナッチ数列を計算する関数です。

## フィボナッチ数列の計算

“`go:main.go
package main

func Fibonacci(n int) int {
if n <= 1 { return n } return Fibonacci(n-1) + Fibonacci(n-2) } ``` ## ベンチマーク関数の作成 ```go:main_test.go package main import "testing" func BenchmarkFibonacci(b *testing.B) { for i := 0; i < b.N; i++ { Fibonacci(10) } } ``` 特徴は`*testing.B`型を渡していること、関数名の接頭辞が`Benchmark`であることです。 ## ベンチマーク実行 ```bash $ go test -bench=BenchmarkFibonacci ``` ###

元記事を表示

aws-sdk-go-v2にifaceパッケージがないので自動生成する

## 記事の要約
– aws-sdk-go-v2では存在しないiface (interface) を自動で生成したい
– ifacemakerというOSSを使って生成する
– 生成したinterfaceをmockgenと連携する

## 経緯
aws-sdk-go-v1には`${AWS_SERVICE_NAME}iface`というパッケージ名でAWSの各サービス用interfaceが定義されていた。
S3を例に上げると[s3iface](https://github.com/aws/aws-sdk-go/blob/8d5e4144167bcd8d6bd98383d285025145099382/service/s3/s3iface/interface.go)があたる。

aws-sdk-go-v1では、この`${AWS_SERVICE_NAME}iface`パッケージを使うことでmockgenやStruct Embeddingを組み合わせることでテスト用のmockファイルを簡単に生成できた。

しかしaws-sdk-go-v2になり、とあるversion以降はifaceパッケージが無く

元記事を表示

Go言語でのブラックジャックの作り方

# Go言語でのブラックジャックの作り方
作成手順は

1. 全体構造の設計、タスク出し
2. 必要な構造体、関数の作成
3. main関数の作成

である。今回はGoの文法などの基礎知識は前提として話を進める。

# 全体構造の設計、タスク出し
今回作るブラックジャックのルールやゲームの内容を決め、必要なタスクを書き出す。

**ルール、ゲーム内容**
* AからKまでの13枚の数字が書かれたカードが4色ある、52枚のカードを使用する。
* 実行開始時、ディーラーとプレイヤー全員に2枚ずつカードが配られる。
* プレイヤーは自分のカードの合計値が21に近づくよう、カードを追加するか、追加しないかを決める。
* カードの合計値が21を超えてしまった時点で、その場で負けが確定する。
* ディーラーはカードの合計値が17を超えるまでカードを追加する。
* 双方が21を超えなかった場合は手の大きさを比較し21に近い方を勝利とする。

* 各カードの点数は以下のように決定する。
* 2から9までは、書かれている数の通りの点数
* 10,J,Q,Kは10点
*

元記事を表示

【Go言語】echoのAPIをテストする [contextを使う]

## テスト用にプログラムを用意する

### APIを作成する

[【Go言語】echoのAPIをテストする [サーバーを起動させてテスト]](https://qiita.com/marurusan/items/6579810c3356e0ecedb3)、[【Go言語】echoのAPIをテストする [ハンドラー単体のテスト]](https://qiita.com/marurusan/items/21bccbe24a02852a43b4)をもとに少し改変します。
`go
package main

import “github.com/labstack/echo/v4”

func InitServer() *echo.Echo {
e := echo.New()

e.GET(“/”, func(c echo.Context) error {
return c.String(200, “Hello, World!”)
})

return e
}

func main() {
e := InitServer()
e.Logger.Fatal(e.Start(“:808

元記事を表示

Golangのフレームワーク

はじめまして、グッドパッチでサーバーサイドエンジニアをやってる荒木です。

この記事は [Goodpatch Advent Calendar 2023](https://qiita.com/advent-calendar/2023/goodpatch) の 24日目の記事になります。

## はじめに
現在golangで開発に使ってるフレームワークはginですが、そろそろ切り替えも検討したいので調べてみました。

## 対象になるフレームワーク
Webアプリ開発に利用できるもので、スターの多いものをピックアップしています。

### gin-gonic/gin (⭐️73.2k)

私も業務で利用していますが、一番最初に候補に上がるかと思います。
利用していてポイントとなる部分。
– 高速:他のフレームワークはginよりベンチマークが高かったりしますが、実用性として十分な速度です。
– ミドルウェアサポート:ミドルウェアを使うことで認証系とかはシンプルに作りやすいです。
– JSONバリデーション:普通に利用できます、フィールドが空の場合などの扱いもgoと同様。
– ドキ

元記事を表示

Golangの新しいORM「Bun」を触ってみた

# はじめに

本記事は [フューチャー Advent Calendar 2023](https://qiita.com/advent-calendar/2023/future) 24日目の記事です。(クリスマスイブですね。)
今回はGolangのORM「Bun」を触ってみたのでその、個人的に気になっていた点である、データの挿入周りついて記事にしたいと思います。

## Bunとは
BunはGo言語用のSQLファーストのORM(Object-Relational Mapping)ライブラリで、PostgreSQL、MySQL(MariaDBを含む)、MSSQL、SQLiteなどのデータベースシステムに対応しています​。
以下公式サイトです。

https://bun.uptrace.dev/

[Why Not …?](https://bun.uptrace.dev/guide/#why-not) の章や公式サイトからも [GORM](https://gorm.io/docs/index.html) と比較していることが多いです。
「Bun」は「gorm」と比較してBunは、余計な

元記事を表示

Golangのバージョンを確認するコマンド

## Goのバージョンを確認するコマンド
“`
go version
“`

元記事を表示

チーム開発参加の記録【2023-10~2024-03】(7) slogでErrorレベルのログをSlackに飛ばしてみた

# 本シリーズのリンク

– [チーム開発参加の記録【2023-10~2024-03】(1) Go言語用ORM「Bun」をDBファーストで使う試み(SQLite使用)](https://qiita.com/kanedaq/items/97ca682602b626d5d717)
– [チーム開発参加の記録【2023-10~2024-03】(2) Go言語からTursoを使ってみた](https://qiita.com/kanedaq/items/0c81946306d2412df555)
– [チーム開発参加の記録【2023-10~2024-03】(3) slogを使ってリクエスト・レスポンス情報をログ出力してみた](https://qiita.com/kanedaq/items/3914de42cb111c8817bc)
– [チーム開発参加の記録【2023-10~2024-03】(4) Go言語用ORM「Bun」をDBファーストで使う試み(PostgreSQL使用)](https://qiita.com/kanedaq/items/ec9bd42fefc755559df6)
– [チ

元記事を表示

1万ダウンロードのバスアプリを運営している話

:::note info
この記事は[watnow アドベントカレンダー](https://qiita.com/advent-calendar/2023#participating_calendar)の24日目の記事です
:::

# はじめに
busdes!という立命館大学びわこ・くさつキャンパス、衣笠キャンパス向けのバス時刻表アプリbudes!を運営している、立命館大学B4のマーシーです。 [watnow](http://www.watnow.jp/) という学生IT団体に所属しています。

busdes!のiOSアプリのダウンロード数は約1万です。このアプリは、Backend,iOS,Androidで構成されていますが、自分はBackendの開発をしただけで,iOS,Androidに関しては先輩方や友達が開発したものを使用しています。

[びわこ・くさつキャンパス向けのアプリ](https://ritsumeikanunivpress.com/07/11/4430/)は今のバージョンになってから既に3年以上が経過しています。

私は、昨年このアプリの運営を卒業された先輩から引き継

元記事を表示

gRPCでGoのボイラーテンプレートが生成されるディレクトリについて

下記の公式ドキュメントを参考にprotoファイルからボイラーテンプレートを自動生成しようとしましたが、オプションの意味が分かりづらく思ったようなディレクトリに作成されませんでした。
https://grpc.io/docs/languages/go/basics/#generating-client-and-server-code

結論から言うと以下です。

| オプション | 意味 |
| —- | —- |
| –go_out= | `*.pb.go`ファイルが作成される起点となるディレクトリ |
| –go_opt=paths= | `source_relative`を指定すると`–go_out`で指定した`直下に`*.pb.go`ファイルがさ生成される |
| –go-grpc_out= | `*_grpc.pb.go`ファイルが作成される起点となるディレクトリ |
| –go-grpc_opt=paths= | `source_relative`を指定すると`–go-grpc_out`で指定した`直下に`*_grpc.pb.go`ファイルがさ生成される

元記事を表示

チーム開発参加の記録【2023-10~2024-03】(6) Go言語用ORM「Bun」で複数のクエリーをまとめてDBサーバーで実行

# 本シリーズのリンク

– [チーム開発参加の記録【2023-10~2024-03】(1) Go言語用ORM「Bun」をDBファーストで使う試み(SQLite使用)](https://qiita.com/kanedaq/items/97ca682602b626d5d717)
– [チーム開発参加の記録【2023-10~2024-03】(2) Go言語からTursoを使ってみた](https://qiita.com/kanedaq/items/0c81946306d2412df555)
– [チーム開発参加の記録【2023-10~2024-03】(3) slogを使ってリクエスト・レスポンス情報をログ出力してみた](https://qiita.com/kanedaq/items/3914de42cb111c8817bc)
– [チーム開発参加の記録【2023-10~2024-03】(4) Go言語用ORM「Bun」をDBファーストで使う試み(PostgreSQL使用)](https://qiita.com/kanedaq/items/ec9bd42fefc755559df6)
– [チ

元記事を表示

面談で変顔バレないようにGoogle Vision APIとGoCV使ってみた

# はじめに

こんにちは!プラットフォームエンジニア・バックエンドエンジニアビクトルです。

本記事はHRBrain Advent Calendar 2023の24日目の記事です。

https://qiita.com/advent-calendar/2023/hrbrain

明日クリスマスですね!🎄🤶

ところで。。。あなた!面接中で、緊張して、自分の表情が気になっていますか?

それとも面接官で、候補者がどんな顔をしているのか確認したいですか?

多分変な質問ですが、時々自分も気になっている。

まず、注意することを発表したいと思います。

:::note warn
このアプリケーションはコンセプトのPoCです。
:::

この間 ChatGPTとWebSocketsでダイエット相談アプリを作りました。

https://qiita.com/ervitis/items/4432a32ca4770c89ac35

今回GoCVとGoogle Vision APIでwebアプリを作成しましょう。

https://github.com/hybridgroup/gocv

https

元記事を表示

OTHERカテゴリの最新記事