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

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

GoのGormライブラリアップデートについて

始めました!株式会社メタップスホールディングスのジュリアンです!

今回の紹介はGo言語のGormライブラリの2件の違いを説明させてください。

## Gorm ライブラリの紹介

デベロッパーフレンドリーを目指した、Go言語のORMライブラリです。DBと連携出来て、mysql、postgreなどのクエリが出来るようになります。

Gormのバージョン1からv1.9.16まではgithub.com/jinzhu/gormに保存されており、あなたのコードからインポートするにはそのパスを使う.

Goの慣例では、新しいパッケージ・バージョンが後方互換性を失った場合、インポート・パスを変更する必要がある。そこで、バージョン2をリリースする際、チームはgithubの新しい組織( `https://github.com/go-gorm/gorm` )にレポを移動することにした。この新しいバージョンは、gorm.io/gormを使ってあなたのコードにインポートされる.

“`go
import (

“gorm.io/gorm”
)
“`

(goのエコシステムのクセの

元記事を表示

Go言語とwireで始める依存性注入

# はじめに
もう年末ですね!皆さんいかがお過ごしでしょうか?
自分は人生の中で最も濃かった一年だったかもしれません笑

というわけで今回[IDEAのアドベントカレンダー](https://qiita.com/advent-calendar/2023/idea)の初日を担当します!
物事は最初が肝心と言いますが,なぜそんな大役を自分が担っているのでしょうか…?
これが**メリー苦しみます**というやつでしょうか…

というわけで記念すべき初日の記事は自分の方から**Go言語のwireというライブラリの紹介**をしたいと思います!!
クリーンアーキテクチャやオニオンアーキテクチャと言ったようにさまざまなアーキテクチャで実装を行うときに必ずと言っていいほど,DIを用いて開発を行います

そんなDIをを簡単にしてくれるGo言語が持つDIコンテナのライブラリ,それがwireです!!
丁寧に解説するので少し長くなってしまうかもしれませんが,ご了承ください…

# 事前知識
今回扱うwireというライブラリはいわゆるDIコンテナと呼ばれるものにあたります,そのためまずはサラッとDI周り

元記事を表示

GoでAST使ってコード自動生成するぞ!

[CastingONE Advent Calendar 2023](https://qiita.com/advent-calendar/2023/casting-one) 17日目の記事です。

## はじめに
実装を進めていると、ふと「なんか毎回同じようなこと書いているな」って思うことありません??
僕は結構あります!「repositoryのinterfaceで実装書く時、毎回traceの処理書いてるな〜」とか。
結構書き忘れもあるので、interfaceを元にこの辺りの処理全部生成できたら嬉しいと毎回思ってます笑

ということで、今回はASTを使ってうまくコード生成する方法を紹介します!
ASTとはなんぞやというところから実装まで紹介するので、ぜひ最後まで読んでいってください〜

ちなみに、本書の実装は[こちらのリポジトリ](https://github.com/hiroaki-u/ast-playground)で公開しているので、詳しくみたいという方は参考にしてください!

## ASTとは??
AST(Abstract Syntax Tree)はソースコードの構造を、ツリー構

元記事を表示

チーム開発参加の記録【2023-10~2024-03】(3) slogを使ってリクエスト・レスポンス情報をログ出力してみた

# 本シリーズのリンク

– [チーム開発参加の記録【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を使ってリクエスト・レスポンス情報をログ出力してみた

# 本記事で行うこと

[前回(6月~8月)のチーム開発](https://qiita.com/kanedaq/items/7c4c91def6590dc94d06)では、ログ出力はWebフレームワークのデフォルトをそのまま使用しました。
今回は「前回より品質を上げていこう」ということで、ログの出力先や中身に手を加えることにしました。
Go公式の新しいロガー「[slog](h

元記事を表示

Goのポインタ基礎知識まとめ

これは、「[Happiness Chain Advent Calendar 2023](https://adventar.org/calendars/9414)」の 17 日目の記事です。

# はじめに

現在、Happiness Chain で Go の学習をしています。
その際、Go の「ポインタ」が自分としてはあまり馴染みがなく、使っていてもいまいちしっくりとこなかったり、使いどころがわからなかったりしているので、知識の整理をしていきたいと思います!

# ポインタとは

ポインタとは、値型に分類されるデータ構造のメモリ上の「アドレス」と「型」の情報のことです。

たとえば、`a`という変数宣言をした際に、その変数用にメモリの領域を確保します。
このとき、その確保した場所を示すのが「アドレス」です。
「`0xc0000120d0`」というような値として表示されます。

“`golang:main.go
package main

import “fmt”

func main() {
p := 3
ip := &p
fmt.Printf(“type=%T, addres

元記事を表示

【Go】ポインタっていつ使うん?

## はじめに

こんにちは、なかじです!

今回は、ポインタの疑問です!

『Goにポインタていつ使うの?』と思ってしまい、調査しましたので、記事にします〜

## ❓ ポインタとは何か?

https://gihyo.jp/book/2022/978-4-297-12519-6

この技術書の説明が自分的にわかりやすかった

> プログラムが動作するためにはメモリ上に保存したデータを読み書きすることが欠かせません。
あるデータを読むためには、そのデータが書き込まれている場所とどこまで書かれているかという範囲を知る必要があります。
ポインタはメモリ上のアドレス位置を格納した変数であり、変数を型とともに利用することでデータが保存されている範囲も知ることができます。
つまりポインタによって、メモリ上のどのアドレスを起点にどれだけの大きさのメモリを読み取るかということがわかります。
ポインタ型の変数から実体を取得する操作(デリファレンス)や逆に実体からその参照を取得する操作は、メモリ上に書かれているデータ自体を取得したいのか、データが書かれている範囲の先頭アドレスを取得したいかによって使い

元記事を表示

Go言語で作ったゲームをWebで公開してみた

以前から個人的に気になっていたGo言語製のゲームエンジン[Ebitengine](https://ebitengine.org/ja/)をプライベートで触ってみました。
その際に、ebitengineで作ったゲームを静的ページとしてWebにデプロイできることを知ったので、今回試して見ました。

## Ebitengine
Go言語で作られたオープンソースなゲームエンジンです。
Go言語でゲーム開発が可能です。

https://ebitengine.org/ja/

2Dゲーム開発に用いられることが多いようで、商用ゲームを含む[色々なゲーム](https://ebitengine.org/ja/showcase.html)の開発に用いられているそうです。

## 簡単なゲームを作成
今回試しに、以下のような簡単なゲームを作ってデプロイしてみました。

running_gopher.gif[Golang] slogを使ってDatadogにログを送ってみる

## 本記事でやること
– [Datadog-Agent](https://docs.datadoghq.com/ja/agent/)のDockerコンテナを起動する
– ログ収集対象のアプリケーションのDockerコンテナを起動する
– [slog](https://go.dev/blog/slog)を用いてDataDogにログを送る
– トレースをDataDogに送る
– ログにトレースIDを付与する

今回実装したコードはこちらのレポジトリで公開しております。

https://github.com/kurakura967/go-slog-datadog

## 対象読者
– (難しいことは一旦置いておいて)Datadogを触ってみたい方
– slogを使ってみたい方

## 使用言語
– Go言語 1.21.0

## 背景
[log/slog](https://pkg.go.dev/log/slog@go1.21.5)(以下slog)はGo1.21から標準ライブラリに含まれるようになった構造化ロギングパッケージです。
構造化ログギングには3rdパーティライブラリを利用するケ

元記事を表示

Windows11でGoCVを使えるようにする

Windows11環境でGoCVの環境構築を行う際、結構ハマったのでメモ。

# 環境
– Windown 11 Home (Parallels Desktop 19 for mac Pro Edition)

# 手順

ほとんど下記の記事を基に環境構築を行いました(ありがとうございます)。下記の記事の内容に加え、個人的にハマったところを記載していきます。

https://qiita.com/pisa-kun/items/b5ccc2b17cf509d7bed5

1. Goのインストール
1. MinGW-64のインストール
1. CMakeのインストール
1. GoCVのダウンロード
1. OpenCVのビルド
1. GoCVのサンプルコードの実行

## Goのインストール

これは下記の記事を参考にどうぞ。GoSDKをインストールします

https://qiita.com/suke_masa/items/0c45c92934b9a2807ddb

## MinGW-64のインストール

**現時点で入手可能な最新版**をダウンロード&解凍し、配置、パスの設定を行う。

元記事を表示

たった10分で始める!Lambda コンテナを活用したアプリ開発

## はじめに
こちらは AWS for Games Advent Calendar 2023 18 日目の記事となります。

迅速なアイデアの実装と検証は、あらゆるソフトウェア開発において重要です。このブログでは、AWS Lambda コンテナを使った Go アプリケーションの開発を、シンプルで効率的な方法で紹介します。目標は最小限のツールを駆使し、10分以内にアプリケーション開発、デプロイすることです。

ブログに記載しているすべてのソースコードはこちらから入手することができます。
https://github.com/axot/lambda-container-deploy

## Goal
今回は、新たにデプロイの仕組みを開発し、ゴールは以下となります。

– **迅速なデプロイメント**: コンテナのイメージの作成や、環境構築、デプロイをただ一つのコマンドで実現します
– **最小限の依存関係**: AWS 経験のすくないエンジニアでも簡単に使えるように、依存関係は bash と aws-cli のみにします
– **カスタマイズ性**: 今後開発が進んでいるうちに設定変更、

元記事を表示

redisとgo-cacheで多層キャッシュを実現する

# 多層キャッシュ
 キャシュとしてRedisサーバーを別で建てることが多いと思いますが、今回は多層キャッシュとしてキャッシュのキャッシュを作成し、Redisサーバーへのアクセスを節約してみようと思います。
インメモリキャッシュは`go-cache`を使用します。

https://qiita.com/shuyaeer/items/a96aeb29c95933f5e2d9

## 実装方針
インメモリキャッシュに存在すれば、利用。
存在しなければ、redisサーバーから取得し、インメモリキャッシュを作成します。

## Redisサーバーの起動
redisの立ち上げに関しては以前こちらで説明してあります。

https://qiita.com/shuyaeer/items/93bac4a42083c5517773

“`yml
version: ‘3’
services:
golang:
build: .
tty: true
volumes:
– ./:/app/
redis:
image: “redis:lates

元記事を表示

4行の変更でRedisの負荷を1/3改善した話

## はじめに

現在とある金融系Webメディアを運営する会社で、主にバックエンドの開発を担当しており、フロントエンド、インフラに関する業務も担当しています。

今回は、先輩エンジニアが4行の変更でRedisの負荷を1/3に削減することに成功した実例をもとに記述して行きます。

– 先輩エンジニア(通称 [ichigozero](https://github.com/ichigozero))は、vimmer, hacker, rustが得意なエンジニアです。(共通の趣味(おうちKubernetes)について語り合うのが日課です。笑)

## サービスの概要

金融に関する記事を掲載するWebメディアを運用しています。

## 背景

現在運用しているメディアでは約100万記事掲載しており、直近一年で約50万記事と急激に増加し、Redisのパフォーマンスが劣化する課題がありました。

RedisのCPU使用率が高負荷状態になると、インスタンスを増やすことで一時的な対応を行っていました。

そこで根本的なアプローチをし、改善を行うとなったのが背景です。

*別アプローチも行っており、大幅な

元記事を表示

[Golang]Interfaceの使い方と利点

個人開発レベルでは気にならないが実際に特にGolangを使ったWeb開発のプロジェクトに入ると絶対と言っても良いほどinterfaceを使うことになる。

おそらく採用するどのアーキテクチャーでも必須になる。

## この記事の対象者
– GolangのWeb開発に入りたい
– interfaceの使い方やメリットがわからない
– ユニットテストの書き方がわからない
– 拡張性のあるコードを掛けるようになりたい

## Interfaceの説明

interfaceは宣言するstructに紐づいた関数がすべてinterface内で定義され且、それらの関数の引数と返り値が一致しているのかをチェックする型です。(特定のメソッドシグネチャが含まれているのか)

使う時にはinterfaceを変数として宣言をし、structを代入したときにチェックが行われる。

**注意:** structとinterfaceは1:1ではない場合があります。

### 2つの関数をMyTypeに紐づけ呼び出す

下のコードでは2つの関数をinterfaceに定義をし、structとinterfaceに定義した

元記事を表示

【Go言語】Goらしい命名規則

## Goらしい命名とは
公式見解によると、基本的に[**Effective Go**](https://go.dev/doc/effective_go)に基づいて命名すること

### 変数名の命名

* `_`(アンダースコア)を使用せず、**MixedCaps**とする。例えば、`max_length`ではなく`maxLength`
* 他パッケージから参照できる変数は最初の文字を**大文字**(MaxLength)、参照できない変数は**小文字から**始める(maxLength)。
* 頭字語は大文字または小文字を統一。例: `URL`か`url`など。
* エラー型の変数名にはErrorを接尾語として付ける。例: `MarshalerError`。
* ローカル変数はスコープが限定されているため、短い名前が好まれる。例: `req`、`i`。

### パッケージの命名

* パッケージ名は簡潔で内容を想像しやすい名前が適切。例: `bytes`、`http`。
* 一般的な名前(`util`、`common`)は避け、内容を明確に示す名前にする。
* パッケージ名は**小文

元記事を表示

AWS Amazon Rekognition機能と実装

# Amazon Rekognitionの概要と機能

Amazon Rekognitionは、画像やビデオの分析、顔認識、オブジェクト検出、シーン分析などのコンピュータビジョン機能を提供する、Amazon Web Services(AWS)のツールです。Rekognitionを使用することで、様々なアプリケーションの開発やサービスの拡張に活用できます。

## 機能

### 1. 顔認識
顔認識機能は、画像やビデオ内の顔を検出し、分析するための強力なツールです。以下の操作が可能です。

– 顔検出: 画像やビデオから顔を検出します。
– 顔比較: 2つの画像の顔を比較し、一致度を判定します。
– 顔検索: 既知の顔データベースに対して、顔を検索します。

### 2. ラベル検出
ラベル検出機能は、画像やビデオ内のオブジェクトやシーンを識別するための機能です。主な機能は以下の通りです。

– 一般的なオブジェクトおよびシーンの検出: 100以上の一般的なオブジェクトとシーンを識別します。
– カスタムラベルの検出: ユーザーが指定したカスタムラベルを検出します。

### 3. テ

元記事を表示

GolangのTestでブレークポイントを貼りデバッグする(VSCode編)

## はじめに
表題通り、GolangのTestでブレークポイントを貼りデバッグします。

### 成果物
![go_test.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/82acd8bd-c61f-1dd6-c20f-0754e44433f8.gif)

### ソースコード

“`shell:ディレクトリ構成
~/go/src/go_test_delve$ tree
.
├── go.mod
├── main.go
└── main_test.go

1 directory, 3 files
“`

“`go:main.go(プロダクトコード)
package main

import “fmt”

func add(a, b int) int {
return a + b
}

func main() {
result := add(2, 3)
fmt.Println(“2 + 3 =”, result)
}
“`

“`go:main_test.

元記事を表示

Go + ドローンで最高の世界へ飛び立つ その2 操作&映像編

本記事は [オルトプラス Advent Calendar 2023](https://qiita.com/advent-calendar/2023/altplus2023) の12/16の記事です。

# はじめに
こんにちは!オルトプラスの中村です!
本記事は[Go + ドローンで最高の世界へ飛び立つ その1 導入編](https://qiita.com/ka_nakamu/private/8feb27cecd63bdc93124)の続編となります。
プログラミング対応のドローンに興味ある方や、Goに興味あって何かしら手を動かす目的が欲しかった方や、IT関係ないワクワクしたいおじさんみたいな方は是非その1からご覧いただけたら嬉しいです。

# 概要
Mac PCでDJI TelloのドローンをGoフレームワークGobotで操作していきます。
前回は導入からドローンの一連のアクションを命令形式で記述し、それを実行して飛ばしました。
今回は大きく分けて以下の2つをやっていきたいと思います。
– ドローンそれぞれのアクションをキーボードの入力から行えるようにする
– Telloのカメラを利

元記事を表示

Go x Google Calendar API x Copilot 、簡易なチーム日程調整を作ってみる

この記事は [Wano Group Advent Calendar 2023](https://qiita.com/advent-calendar/2023/wano-group) の16日目の記事です。

## 概要

最近Copilotの使い方を学び始めました。
ちょうどチームメンバーの日程調整機能を作りたいので、Google Calendar APIとCopilotを使って作ってみました。

## 先ずはgolangでGoogle Calendar APIを使う

https://developers.google.com/calendar/api/quickstart/go?hl=ja

google提供のクイックスタートを通りにやっていくだけで、個別のカレンダー情報を取得できます。さらに、[calendar/v3/freeBusy](https://developers.google.com/calendar/api/v3/reference/freebusy/query?hl=ja) API は複数メンバーのカレンダーの予定時間情報を返します:

“`go

jst,

元記事を表示

VSCode×GoでGOROOT or GOPATHが見つからない大量エラーの解消。

こんにちは。

フロントエンドエンジニアでバックエンドも頑張りたいみつです:relaxed:

GoをVS Codeで書いているのですが、直接的な問題もなく見て見ぬふりをしていた下記のエラー。

“`
could not import XXX (cannot find package “XXX” in GOROOT or GOPATH)
“`

赤い線が多すぎてついに、VS Codeでエラータブでエラー数が10kに到達したのでそろそろやばいでしょ…という焦りと何が起きていたんだろうを記事にしたものです。

ちなみに、自分の場合は、Goのインストールも出来ているのと、ターミナルでGoを認識もしていたので、go.modファイルがあるディレクトリでワークスペースを開くだけでエラーの文言は消えました。

## 最近起きてた嫌なこと:frowning2:
terminalで`go version`コマンドを叩くと、Goを認識する。

ただ、エディタ画面や問題のタブにはBrokenImportの大量エラーが発生している。

[terminal画面]
![image.png](https:/

元記事を表示

TrivyのWebAssembly拡張機能、Modulesがすごい

## はじめに

この記事は、[Go 言語 Advent Calendar 2023 シリーズ2](https://qiita.com/advent-calendar/2023/go)の16日目の記事です。

こんにちは。[reo](https://twitter.com/_uhzz_) です。
今年も気づけばアドベントカレンダーの時期ですね。

社のカレンダーにも参加したので、こちらも宣伝させていただきます。

https://qiita.com/uh-zz/items/575232437f885cc4730a

今回はTrivyのWebAssembly拡張について紹介させていただきます。

## 前提

– 以下は詳しく触れません。
– WebAssembly の概要
– WebAssemblyランタイム(wazero)について
– Trivyの全体像について

掲載内容は私自身の見解であり、必ずしも所属する企業や組織の立場、戦略、意見を代表するものではありません。[^1]

## Trivy とは

公式の README にもあるとおり、コンテナイメージか

元記事を表示

OTHERカテゴリの最新記事