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

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

先日作ったGo言語用モジュールを ChatGPT でコードレビューしてもらいました

また、ベタなネタなんですが。
モノは前回のコレですね↓。

[IPv4 アドレスからその所属国のカントリーコードを検索するためのGo言語用モジュールを作ってみました](https://qiita.com/suka-test/items/576746d650f25f999f28)

## レビュー講評

レビューしてくれとお願いして、モジュールの本体のソースコード(コメント入れて700行ちょっと)を貼り付けたら、こんな答えが返ってきました。

![ChatGPT.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3872080/0e06851e-e57e-3229-6482-24de93c1ceb3.jpeg)

## 作者本人の感想

とりあえず、致命的な問題は指摘がなかったので一安心。
「ポジティブな点」も挙げてくれるのは、ちょっとうれしかったり(他愛のない)。
「改善提案」については、妥当なとこかなと思います。
特に1.〜5.は早めに修正しようと思ってます。
6.の「ユニットテストの実装」は、実装済みな

元記事を表示

【Go】validatorのタグでカスタムメッセージを設定する

# はじめに
バリデーションライブラリである`go-playground/validator`は非常に強力ですが、デフォルトのエラーメッセージをフィールドごとにカスタマイズしたい場合があります。そこで、今回はカスタムメッセージをタグで設定できるようにするライブラリ`cmvalidator`を作成したので紹介します。

https://github.com/go-playground/validator

# デフォルトのバリデーションメッセージの課題
通常、`go-playground/validator`を使用して構造体をバリデートする際には、次のようなデフォルトのエラーメッセージが生成されます。
“`go
package main

import (
“github.com/go-playground/validator/v10”
)

type User struct {
FirstName string `validate:”required”`
LastName string `validate:”required”`
Age

元記事を表示

撮った写真を良い感じに整理するツール

# はじめに

ミラーレスカメラを使う際、JPG+RAWみたいな形式で撮影している方は多いと思いますが、帰ってきてSDカードを開くとそこに広がるのは大量のファイル達。

同じ名前で拡張子だけ違うファイルが2つ生成されるし、表面上はいつ撮ったものなのかわからんし…

そこで、これらを良い感じに整理できるようなツールを作れないかということで、コードを書いてみました。

https://github.com/Soli0222/picture-arrange

この記事では、ツールの概要、コードの解説、リリースの自動化を紹介します。

# 概要

まずは、具体的に整理とはどのようなことをするのかを定義します。

例えば、このようなファイル群があるとします。
日付は撮影日とします。

“`
/photos
├── IMG_0001.JPG //2024-08-30
├── IMG_0001.DNG //2024-08-30
├── IMG_0002.JPG //2024-08-30
├── IMG_0002.DNG //2024-08-30
├── IM

元記事を表示

Windows Terminal Preview 1.22で画像表示できるSixel Gpraphicsが実装されたのでGo言語で試してみた。

# はじめに
 Sixelは、通常は文字しか表示できない「黒い画面」(=ターミナル=端末)で画像を表示するAnsi エスケープシーケンスの一種です。1982年(DEC社のLA50に搭載)から存在します。Microsoftからは長年無視されてきましたが、今回実装となりました。
 以下はニュースのネタ元です。

https://news.mynavi.jp/techplus/article/20240828-3013926/

https://forest.watch.impress.co.jp/docs/news/1619236.html

# Sixelの説明(他力本願)
 まずは以下リンクを御参考。Wikipediaは英語版なので要翻訳

https://en.wikipedia.org/wiki/Sixel

https://zenn.dev/sankantsu/articles/e629c978b02806

https://qiita.com/arakiken/items/4a216af6547d2574d283

https://qiita.com/arakiken/it

元記事を表示

Go | module declares its path as: but was required as:

自分でCLIツールを作成してリリースしたが利用側でパッケージを取得しようとしたらエラーが発生したのでその時の対応のメモ。

## 結論

まずは結論から。

提供しているmodule名を変更した上で再リリース(自分の場合はタグの変更で発火するGHAで再リリース)

“`diff_go:go.mod
– module gen-slice-accessor
+ module github.com/snamiki1212/gen-slice-accessor
“`

– [fix: update importpath · snamiki1212/go-gen-slice-accessors@e269c8f · GitHub](https://github.com/snamiki1212/go-gen-slice-accessors/commit/e269c8fcb8babac205f8d9f3880816f6aa02d3ee)

:::note warn
リポジトリ・モジュール名を変えたので読み替えてください
“`diff
-gen-slice-accessor
+go-gen-sli

元記事を表示

Go言語(Golang) ポインタとアドレス演算子について

### `*`(ポインタ)

– **意味**: `*`はポインタ型を示します。ポインタは、変数のメモリアドレスを指し示すための型です。
– **使い方**: 変数のポインタを取得したり、ポインタを使ってデータにアクセスしたりします。

#### 例
“`go
var x int = 10
var p *int = &x // xのポインタを取得
“`
ここで、`p`は`x`のメモリアドレスを持つポインタです。

### `&`(アドレス演算子)

– **意味**: `&`は変数のアドレスを取得するための演算子です。変数のメモリアドレスを返します。
– **使い方**: 変数のアドレスを取得してポインタに代入する際に使用します。

#### 例
“`go
var x int = 10
var p *int = &x // xのアドレスを取得
“`
ここで、`p`は`x`のアドレスを持つポインタです。

### コード内での使用

あなたのコード内での`*`と`&`の使用に関して具体的に見てみましょう。

“`go
return &UserNotFound{Username:

元記事を表示

go-redis/cacheの使い方

Redisバックエンドのキャッシュライブラリ、[go-redis/cache](https://github.com/go-redis/cache)についてまとめました。

このライブラリの良さそうなところ:point_up:
– ローカルキャッシュ(多層キャッシュ)がサポートされている
– Onceメソッドが便利

## 初期化
[redis/go-redis](https://github.com/redis/go-redis)のクライアントを渡して初期化します。

“`go
func newCache() *cache.Cache {
addr := fmt.Sprintf(“%s:%s”, os.Getenv(“REDIS_HOST”), os.Getenv(“REDIS_PORT”))
client := redis.NewClient(&redis.Options{
Addr: addr,
DB: 0,
})
return cache.New(&cache.Options{
Redis: client,
})
}
“`

## 基本操

元記事を表示

変数にnilとかつけちゃダメだよ

## 特徴

Go言語でnilはユニバースブロックで定義されています。[ユニバースブロックとは公式によると](https://tip.golang.org/ref/spec#Blocks)Go言語でのユニバースブロックとはソースコード全体を包んでいるブロックを示します。これはプログラム全体のスコープを指し、すべてのプログラムで共通に使用される識別子や型が含まれています。

## 実装

“`main.go
package main

func main() {
nil := 42 // ここでnilを再定義
var ptr *int
if ptr == nil { // 本来のnilの意味が失われている
println(“ptr is nil”)
}
}
“`

上記の実装では、本来のnilの性質をシャドーイングしバグが発生しやすくなります。

## 参考記事

[The Go Programming Language Specification – The Go Programming Language](https://tip

元記事を表示

asdfでgoを管理しているときのPATHの通し方

GOをインストールして時に以下のように.zshrcに記述していたら、シェル起動時にパスが通っていなかった

“`zsh
export PATH=$PATH:$(go env GOPATH)/bin
“`

シェル起動時のルートでgoが有効になっていなかったため“`go env GOPATH“`が無効だった。
もしルートで有効だとしても複数のバージョンを使い分けている場合、ルートで使用しているバージョンしかパスが通らない。

asdfで管理しているすべてのバージョンのパスを通すには以下のようにする

“`zsh
for version in $(ls ~/.asdf/installs/golang); do
export PATH=$PATH:~/.asdf/installs/golang/$version/go/bin
done
“`

元記事を表示

Go言語(Golang)における、RestAPI、GraphQL、gRPCについて

### RestAPI

#### 特徴
1. **エンドポイントベース**: 各リソースに対して個別のエンドポイントが存在します(例: `/users`, `/posts`)。
2. **HTTPメソッドの使用**: リソースの操作はHTTPメソッド(GET, POST, PUT, DELETE)を用いて行います。
3. **ステートレス**: 各リクエストは独立しており、サーバーはクライアントの状態を保持しません。
4. **キャッシュ可能**: HTTPのキャッシュ機能を活用できます。

#### 書き方の例

以下は、Golangを使用したシンプルなRestAPIの例です。

“`go
package main

import (
“encoding/json”
“net/http”
“strconv”

“github.com/gorilla/mux”
)

type User struct {
ID int `json:”id”`
Name string `json:”name”`
}

var users = [

元記事を表示

Go言語のポインタレシーバの謎に迫る:CとGoのメモリ管理を比較しながら

こんちは。今日はポインタ使うのかい、どうなんだいという話をしちゃいます。お母さんには内緒だゾ。

本記事では、Python Tutor (https://pythontutor.com/) を使用して生成されたメモリ状態の可視化画像を使用しています。これらの画像はCreative Commons CC BYライセンスの下で使用されています。Python Tutorは、コードの実行過程とメモリの状態を視覚化するための優れたツールです。

## Goのメソッド

Go では名前付きの型にメソッドを定義できます。このときメソッドが定義される型をレシーバと呼んだりします。

レシーバはポインタ型にすることもできます。
“`Go
type Person struct {
Name string
Age int
}

// ポインタレシーバを使用したメソッド
func (p *Person) HaveBirthday() {
p.Age++
}
“`

ポインタレシーバと対比して、こっちを値レシーバと呼びます
“`Go
// 値レシーバを使用したメソッド
func

元記事を表示

Go言語(Golang) interfaceとstruct

### インターフェース (interface)

#### 機能
– インターフェースはメソッドの集合を定義する型です。
– インターフェースを実装する型は、そのインターフェースが定義するすべてのメソッドを持っている必要があります。
– インターフェースは、異なる型のオブジェクトが共通のメソッドを持つことを保証し、ポリモーフィズムを実現します。

#### 使い方
1. **定義**:
“`go
type Human interface {
Say() string
}
“`
– `Human`インターフェースは`Say`というメソッドを定義しています。このメソッドは引数を取らず、文字列を返します。

2. **実装**:
– インターフェースを実装するには、そのインターフェースが定義するすべてのメソッドを持つ構造体または型を定義します。
“`go
type Person struct {
Name string
}

func (p *Person) Say()

元記事を表示

ES自動生成AIを作った ~コード解説編~ (経歴入力 & 回答生成)

今回は以下の拡張機能を作成したときのことについて書いていく。
[ES自動生成AIを作った](https://qiita.com/Yutosaki/items/ad92ccd9ee087fc9a7bb)

https://github.com/Yutosaki/es-writer/tree/main?tab=readme-ov-file

https://chromewebstore.google.com/detail/es-writer-extension/jkencchebhkbaomammmgbhnpalgkchkm?hl=ja

以下の機能がどの様に動いているのかについて、それぞれコードを追いながら解説していきたいと思う。

* [SignUp(メールアドレスなどの認証も含む)](https://qiita.com/Yutosaki/items/5fec33696105678aa416)
* [SignIn(ログイン)](https://qiita.com/Yutosaki/items/c52da4b98cdd3a934271)
* 経歴入力(自己PR、経験、今まで作った作品)

元記事を表示

【OSS】イベント・ハンズオン向けサポートツール(スライド共有、メッセージ送信)

# はじめに

どうも、Shakkuです。

都内某高専情報科の4年生です。(2024/8/30時点)

 今回は、スライドを使用するイベントや講演会、ハンズオンなどで使用する便利なサポートツールを作成しました。
また、初めてOSSとしての公開をしてみました。(OSSの定義がちょっと曖昧なため、ちゃんとできているか不安ですが、多分みなさんの環境でも使えるはずです…)

 本アプリケーションについて、自由に使用・修正・拡張していただいて問題ありません。使用した際の感想や問題点改善点などがありましたら、お気軽にご連絡ください。(再配布に関しては一度ご連絡いただけると幸いです。)

# 経緯

 私の通っている高専では定期的に「ICT基礎Lab. for Junior」という中学生向けの技術イベントを学生主体で開催しています。私もそのイベントの運営や講師として当日や事前準備に参加しています。

 そんな中で運営している際に以下のような問題があり、私も他の運営の学生もなんとかしないとなーという状況でした。

– 正面のスクリーンやディスプレイにスライドを映しているため、作業遅めの参加者の進

元記事を表示

GOのAWS SDKでEC2のインスタンスを作成

# はじめに
GoのAWS SDKを使用してEC2のインスタンスを作成してみました。これまでも、インスタンスの起動、停止用のツールとして使用していましたが、もうちょっと深く学習してみようと思い、EC2インスタンスの作成を行ってみました。

# 環境
* Windows 11
* AWS SDK for Go v2

# 前提
AWSサービスにプログラムからアクセスするため、AWS側でAccess Key IDとSecret Access Keyを事前に作成し、~/.aws/credentialsファイルを準備しました。SDKでもcredentialsファイルからプロファイルを読み込むことができます。

【credentialsファイル】
“`
[myregion]
aws_access_key_id =
aws_secret_access_key =
“`

また、EC2で使用するKeyPaire、Subnet、SecurityGroupも事前にAWSで作成しています。プログラムで作成できますが、力不足のためや

元記事を表示

Goで黄金比ハッシュマップ

https://android.googlesource.com/kernel/common/+/refs/tags/ASB-2018-08-05_3.18-n-release/include/linux/hash.h#49

Linuxカーネルのソースに、不思議な定数があります

“`C:hash.h
#define GOLDEN_RATIO_32 0x61C88647
“`

どうやらこの数字は、2 ^ 32を黄金比で割り、符号付きで表した数とのこと

“`math
\phi = \frac{(1 + \sqrt{5})} {2} \\
“`
“`math
\frac{2^{32}} {\phi} = 2654435769.4972…
“`
2654435769を32ビット符号付き10進数にすると-1640531527
符号をプラスにして16進数で表記すると61C88647

ハッシュマップのようなデータ構造を作る際に、程よくばらけたインデックスが必要になるのですが、黄金比から導いたこの定数を用いることで、適度にばらけた良い感じの値が得られるそうです

クヌース先生

元記事を表示

ES自動生成AIを作ってた ~コード解説編~ (SignIn & SignOut)

今回は以下の拡張機能を作成したときのことについて書いていく。

https://github.com/Yutosaki/es-writer/tree/main?tab=readme-ov-file

https://chromewebstore.google.com/detail/es-writer-extension/jkencchebhkbaomammmgbhnpalgkchkm?hl=ja

以下の機能がどの様に動いているのかについて、それぞれコードを追いながら解説していきたいと思う。

* [SignUp(メールアドレスなどの認証も含む登録)](https://qiita.com/Yutosaki/items/5fec33696105678aa416)
* SignIn(ログイン)
* [経歴入力(自己PR、経験、今まで作った作品)](https://qiita.com/Yutosaki/items/b3c1a35a6e3c1306cd3f)
* [回答生成(埋め込み含む)](https://qiita.com/Yutosaki/items/b3c1a35a6e3c1306cd

元記事を表示

IPv4 アドレスからその所属国のカントリーコードを検索するためのGo言語用モジュールを作ってみました

![作ったモジュールのデモ用CLI](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3872080/b1b67141-5220-d26b-8808-f16390db0551.png)

勉強がてら、IPv4 アドレスからその所属国のカントリーコードを検索するためのGo言語用モジュールを作ってみました(上の画像は、そのモジュールのデモ用CLIのスクリーンショット)。
せっかく作ったので、需要は無視して無謀にも公開。

[github.com/suka-test/ccipv4](https://github.com/suka-test/ccipv4)

## 作った動機とか

IPアドレスの国判定なんていうのは、いろんな手段が提供されていまして、今さら作る必要もない気もしますが。
実際、わたしもアクセスログのチェックなどに、アメリカのMaxMind社が提供している無償利用可のジオロケーションデータベース GeoLite2 Free をずっと使っていました。

[MaxMind](https://www.maxmind

元記事を表示

重複しているデータがあればINSERTをさせないようにする[MySQL, Go]

データベースのレコードの挿入を自動で行うプログラムを作っていた際に、同じデータがあったら挿入させないようにするにはどうしたらいいのかわからなかったので調べて実装してみました。

# コード
実際に実行するSQLクエリは下のようになっています。
“`sql
INSERT INTO musics (music_name, composer,createdAt,updatedAt)
SELECT ?,?,?,? WHERE NOT EXISTS (SELECT 1 FROM musics WHERE music_name = ?, AND composer = ?)
“`
これはサブクエリで同じデータがないか確認し、存在しなければ実行するように条件分岐させています。

:::note
#### サブクエリ
サブクエリとは,sqlクエリの中にsqlクエリを書くことを言います。
上のクエリでは、`WHERE`文以降にある()で囲まれている部分がそれに該当します。
:::

上のクエリにおけるサブクエリ内では、`SELECT 1`と書かれている部分があると思います。

これは、実際には以下の

元記事を表示

DMMのGo言語5daysインターンが最高すぎた!

初めて企業のインターンに参加しました。DMMさんのGo言語5daysのインターンです。今回はこのインターンの内容、またGo言語でのAPI開発で学んだTipsを中心に記事を書きます。
温かい目で見てくださると嬉しいです。記事の内容に誤りがあった場合は、いつでもご指摘ください 🙇‍♂️

## インターン概要

今回のインターンは8月5日から8月9日の5日間にわたって行われました。最終日はオフィス開催で、4日間はオンラインでの開催でした。
初日と2日目は主にライブラリの使い方を学び、残りの3日間はハンズオン でAPIのエンドポイントを実装しました。このインターンの教材はDMMさんの新卒バックエンド研修の課題として使用されているため、難易度はとても高かったです。

私はGo言語を使用した経験がありますが、本で独学という勉強の仕方だったので、少し古い情報で学んでいたこともあり、
今回最近のバージョンに追加された機能などを知ることができました。また、Go言語の勉強だけでなく、アーキテクチャやライブラリの選定理由なども紹介があり、とても実践的な内容でした。

## サポート体制

開発は難しかった

元記事を表示

OTHERカテゴリの最新記事