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

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

Goチートシート

本記事ではgo言語の超基礎を記載する.初めてgoを学ぶ人向けに最低限知ってほしいことのみまとめたので本記事を読み切ると基礎を学ぶ/復習することができます!おまけにgo向けのORMのgormチートシートもあります.

# 他のチートシート
git/ghコマンド

https://qiita.com/JavaLangRuntimeException/items/6b46551f56e0def76eba

SQL

https://qiita.com/JavaLangRuntimeException/items/f038fbaccdd92fb0308a

TypeScript

https://qiita.com/JavaLangRuntimeException/items/5894391c08e0d8e28389

Docker コマンド

https://qiita.com/JavaLangRuntimeException/items/21f7c7bf3d143f821697

ステータスコード

https://qiita.com/JavaLangRuntimeException/it

元記事を表示

Goのjson.Marshalで非公開フィールドも出力する方法

## 背景
こんにちは。エンジニアのKennieです。
以前の業務で、非公開フィールドを持つ構造体をシリアライズする必要がありました。その際にデフォルトでのMarshalJsonではシリアライズすることができなかったので、その際に学んだことを記載します。

## デフォルトのMarshalJsonを使用したコード例
まずは、Goのデフォルトの MarshalJSON を使ったシンプルなコード例を見てみましょう。以下のコードでは、公開フィールドを持つ構造体がJSONとしてシリアライズされています。

“`go
package main

import (
“encoding/json”
“fmt”
)

type Person struct {
Name string
Age int
}

func main() {
p := Person{Name: “Alice”, Age: 30}
data, err := json.Marshal(p)
if err != nil {
fmt.Println(“Error:”, err)
return
}
fmt.P

元記事を表示

golangで、brainfuckソースをx86_64アセンブリに落とすコンパイラを書いてみた。[習作]

go言語を取り掛かるにしたら、何を書けばよいかを思案しているうちに、brainfuck compilerを書くことにした。やってることは難しそうに見えても、実際の処理は簡単だし、すぐにできるだろうと思って書いたが、変数のscopeで、ちょっと引っ掛かった。

### 実行

goはシバンをつけるのがややこしいので、`go run bfs.go `としてコンパイル、実行して下さい。

### コメント

標準出力に結果が出力されます。やってることは、拙作のbfs.c,bfs.pyと一緒です。

https://qiita.com/fygar256/items/3274f1dfc14378645350

相変わらずエラー処理がプアです。人間は何をするかわからないから、エラー処理はいくらやってもキリがないので。ガベージイン・ガベージアウトです。
しかし、生まれて初めて書いたgolangのコードがbrainfuckコンパイラだなんて、、、(苦笑)

pythonもそこそこに、これからgoをやるぞ!と思っていましたが、リストが使えないことが大分不便で、pythonは手放せそう

元記事を表示

ヘキサゴナルアーキテクチャでポケモンバトルを実施する。(Step2: coreのテスト実装)

## はじめに
[前回の記事]()の続きです。

## テストコード
プロダクトコードに乱数を含むケースがあり、テストが安定しないため、プロダクトコードも一部修正しています。

“`go:internal/core/move.go
package core

import (
“math/rand”
“time”
)

type Move struct {
Name string
Power int // 技の威力
Accuracy int // 命中率(0-100%)
Type string // 技の属性(例: 電気、炎など)
randSource *rand.Rand // 乱数生成器を保持
randomFactorFunc func() float64 // ランダムなダメージ倍率を計算する関数
hitCheckFunc func() bool // 命中判定の関数
}

//

元記事を表示

ヘキサゴナルアーキテクチャでポケモンバトルを実施する。(Step1: coreの実装)

## はじめに
表題通り、ヘキサゴナルアーキテクチャでポケモンバトルを実装します。
今回はドメインのコアとなる部分を中心に実装していきます

## 要件
### enititityの定義
1. ポケモンの定義
• 各ポケモンは以下のステータスを持つ。
• 名前: ポケモンの名前を保持する(例: “ピカチュウ”)。
• HP: ポケモンのヒットポイント。0になると戦闘不能となる。
• 攻撃力: ダメージ計算のために使用される攻撃ステータス。
• 防御力: 受けるダメージを軽減するための防御ステータス。
• 素早さ: バトルでの行動順を決定するためのステータス。
• 技のリスト: ポケモンが使用できる技のリスト(複数の技を保持)。
2. 技(Move)の定義
• 技は以下のプロパティを持つ。
• 名前: 技の名前(例: “10まんボルト”)。
• 威力: 技が持つ基礎ダメージ値。
• 命中率: 技が命中する確率。0~100%の範囲。
• タイプ: 技の属性(例: 電気、炎、草など)。
• 特殊効果(オプション): 特定の技が持つ追加効果(例: 相手をまひ状態にする

元記事を表示

Goでクラス図を自動生成する

## はじめに
表題通り、Goでクラス図を自動生成します。goplantumlを使うと簡単に生成できます。

https://github.com/jfeliu007/goplantuml

## 成果物
goplantumlを使うとクラス図を自動生成できます。
![pokemon_battle.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/7ab56c06-31d0-0d2a-769f-b5a9ee7e3c24.png)

## 準備
“`go:goplantumlのinstall
go install github.com/jfeliu007/goplantuml/cmd/goplantuml@latest
“`

“`shell:PNG画像を生成するためのツール
brew install plantuml
“`

## UMLを作成する
“`go:UMLを作成する
~/develop/pokemon_battle (feat/initial)$ goplantuml int

元記事を表示

Hugoを使って爆速で静的サイトを作ってみる

## Hugoとは
– 静的サイトジェネレーターの1つ
– Go言語で開発された高速なHTMLサイト作成ツール
– 動的なデータベース等を使わず静的ファイルのみでサイトを構成する
– ビルドが非常に高速、セキュリティ面でのリスクが少ない、といったメリットがある

この記事では、Hugoのインストールから簡単なサイトの作成までの流れを紹介します。

## 1. Homebrewをインストールする
“`terminal
$ /bin/bash -c “$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)”
“`
(インストールコマンドは[Homebrew公式サイト](https://brew.sh/ja/)より)

## 2. Hugoをインストールする
“`terminal
$ brew install hugo
“`

“`terminal
$ hugo version
hugo v0.133.1+extended darwin/arm64 BuildDate

元記事を表示

Go言語:Go1.22 で機能強化された net/http.ServeMux について、ちょっとしたこと

いささか、旧聞に属しますが、今年の初めに出た Go1.22 で HTTP サーバーのルーティングに使われる net/http.ServeMux の機能が強化されて、HTTPメソッドの指定ができるようになり、かつ URL パターン文字列にワイルドカードが使えるようになりました。例として、次のような書き方ができるようになりました。

“`
mux := http.NewServeMux()
mux.HandleFunc(“GET /test/{id}”, Test)

“`

このように書くと、“` handler “` 側で “` Request.PathValue “` メソッドを使うことにより “` {id} “` の値を取得できるようになりました。

“`
func Test(w http.ResponseWriter, r *http.Request) {

id := r.PathValue(“id”)
fmt.Printf(“id = %s\n”, id) // {id} の値が表示される

“`

使えそうな機能強化ですが、ふと、疑問が頭

元記事を表示

【Go】EchoとmongodbをDockerで環境構築して、実装とテストまでやってみた

# 1. はじめに
今回、Goを使ったAPIサーバーを構築しようとした際、アーキテクチャの知識やテストの方法などについて調べる機会があったので、忘備録も兼ねてこの機会にまとめようと思います。
アーキテクチャにも触れますが、今回の主題はechoとmongoを使った環境構築とテストですので、アーキテクチャが気になった方は他の記事も参考にしてください。

今回のリポジトリです。
少々フォルダ構成が異なっていますがアーキテクチャ含め大部分は同じです。

https://github.com/yupon-pro/go-mongodb

– [1. はじめに](#1-はじめに)
– [2. 環境構築](#2-環境構築)
– [2-1. Go](#2-1-go)
– [2-2. mongodb](#2-2-mongodb)
– [3. レイヤードアーキテクチャとDDD](#3-レイヤードアーキテクチャとddd)
– [3-1. レイヤードアーキテクチャ](#3-1-レイヤードアーキテクチャ)
– [3-2. DDD](#3-2-ddd)
– [3-3. 実装の

元記事を表示

なぜgo.workはリポジトリにコミットすべきではないのか

## 本記事の背景と目的
 go言語のWorkspace modeを導入した際に生成される`go.work`ファイルは,リポジトリにコミットすべきでないとの指摘がある[[1](https://poyo.hatenablog.jp/entry/2022/12/05/090000)][[2](https://future-architect.github.io/articles/20220216a/)].この点について[Proposal](https://github.com/golang/go/issues/53502)でも盛んに議論されており,[公式リファレンス](https://go.dev/ref/mod#go-work-file)では`go.work`をリポジトリにコミットしないよう推奨されている.
 本記事では,`go.work`をリポジトリにコミットすると困りうるパターンを検証し,`go.work`をコミットすべきでない理由を明らかにする.

https://github.com/golang/go/issues/53502

https://go.dev/ref/mod#

元記事を表示

golang-migrateでマイグレーションをやってみる[Mac]

Goで`GORM`を使わずにDB設計を行っていたのですが、どうにかデータベースのカラムだけを変更することがしたいと考えた時に、Djangoで`マイグレーション`を行っていたことを思い出したので,今回どうやってGoでマイグレーションを行うか調べてみました。

# そもそもマイグレーションとは
`マイグレーション`とは、一般的に移行という意味を持っています。

今回行う`データベースマイグレーション`とは、データベースの定義を自動的に作成・管理することを指します。

従来の直接データベースに入って操作していたデータベース定義をスクリプトで操作することができます。

# `golang-migrate`でマイグレーションしてみる。

まず、golang-migrateのcliツールインストールします。

### インストール
“`
brew install golang-migrate
“`
>windowsのパッケージマネージャーとかは使ったことないのですいません

以下のコマンドで入っているかを確認します。
“`
migrate –version
“`

## マイグレーション

元記事を表示

GoとLaunchDarklyでフィーチャーフラグを実装する

## はじめに
業務でフィーチャーフラグを実装をする機会があり、技術調査の一環でフィチーチャーフラグのプラットフォームである[LaunchDarkly](https://launchdarkly.com/)を使って実装してみました。

この記事では、Go言語とLaunchDarklyを使った具体的なフィーチャーフラグの実装方法について解説します。フィーチャーフラグ自体の概要やメリットについては、多くの記事で詳しく説明されていますので、ここでは割愛します。

フィーチャーフラグについては、よくわからないという方は以下の記事がおすすめです。
[フィーチャーフラグ(Feature Flag)はなぜ必要なのか?](https://codezine.jp/article/detail/14114)
[Feature Flag](https://martinfowler.com/bliki/FeatureFlag.html)

## やること
この記事では以下の内容で進めます。
・LaunchDarklyでフィーチャーフラグを設定する
・設定したフィーチャーフラグをSDKを使って取得する

##

元記事を表示

Goのインターフェースと依存性注入(DI)

# 1. はじめに
昔、オブジェクト指向の記事を書いた時、ポリモーフィズムの実装のために使われるインターフェースを記述したことがあるのでインターフェース自体の理解はあったつもりだったのですが、Goではどのようにインターフェースが実装されるのかや、これがどのように処理の抽象化につながるのか(特にDI)ということについて理解が甘かったです。
今回参加したプロジェクトでインターフェースやDIを利用する機会があったので、忘備録も兼ねて自分なりの理解をまとめてみようと思います。

# 目次
– [1. はじめに](#1-はじめに)
– [2. インターフェース](#2-インターフェース)
– [3. DI](#3-di)
– [4. おわりに](#4-おわりに)
– [5. 参考](#5-参考)

# 2. インターフェース
インターフェースはメソッドの束を定義し、データを抽象化したりポリモーフィズムを実装するためなどに使われます。ポリモーフィズムはインターフェースを適用するクラスに対して、インターフェースに記述されたメソッドの実装を要求します。即ち、インターフェースはその具体的な実装をもたず、

元記事を表示

Go言語(Golang) sort

“`go
package main

import (
“fmt”
“sort”
)

func main() {
i := []int{5, 3, 2, 8, 7}
s := []string{“d”, “a”, “f”}
p := []struct {
Name string
Age int
}{
{“Nancy”, 20},
{“Vera”, 40},
{“Mike”, 30},
{“Bob”, 50},
}

// pスライスをNameフィールドでソート
sort.Slice(p, func(i, j int) bool { return p[i].Name < p[j].Name }) // ソートされたスライスを出力 fmt.Println(i, s, p) } ``` ### 解説 1. **パッケージのインポート**: ```go import ( "fmt" "sort" ) ``` - `fmt`パッケージはフォーマットされたI/Oを提供します。 - `so

元記事を表示

Hugoのshortcodeでmarkdownify関数が正しく動作しなかった

# はじめに

あるサイトで利用しているHugo(gohugoio)のMarkdownコンテンツファイルを別のサイトにコピーしたところ、shortcodeが正しく動作しなくなりました。

shortcodeを利用したい理由はtableをレンダリングしたいためで、参考資料に載せている[How Create Bootstrap Tables in Hugo](https://www.mybluelinux.com/how-create-bootstrap-tables-in-hugo/)をほぼそのままコピーしています。

環境の違いなどはあると思いますが、根の深そうな問題にみえたので、デバッグをした時のメモをまとめておきます。

:::note
最終的にHugoのDiscourseに[記事](https://discourse.gohugo.io/t/the-markdownify-function-calls-asciidoctor/51411)を投稿してみました。
:::

# 環境

* Ubuntu 22.04.4 LTS (amd64版)
* Hugo v0.133.1+exte

元記事を表示

【個人開発】最もジェネレーティブで、最もアーティフィシャルで、そして最もインテリジェンスなやり方でRedisを実装した話

はじめまして!もんたです。

私もんた、「[もんたの森](https://www.montanomori.com/)」っていうもんた版イラストやみたいなWebサービスを趣味で開発しているのですが、最近そのもんたの森にRedisを導入しまして、今回はそのお話をしようかなと思います。

この記事を読んで僕と同じかけだしエンジニアの個人開発のモチベーションにつながれば幸いです!

あ、そういえばいろいろやらせてもろてます。
よかったら覗いてみてあげてください。

**【たまーに描いた絵をアップする X ( Twitter ) 】**

https://x.com/monta_no_mori

**【最近始めた Instagram 】**

https://www.instagram.com/monta_no_mori/

**【もんたのLINEスタンプ】**

https://store.line.me/stickershop/author/2887587/ja

## 1. **プロジェクト概要**

### 背景

![image.png](https://qiita-image-st

元記事を表示

Go言語(Golang) “godoc”と”go doc”

### `go doc`と`godoc`の違い

**1.使用方法**:
– `go doc`: コマンドラインで直接使用
– `godoc`: ウェブサーバーを起動し、ブラウザで閲覧

**2.機能**:
– `go doc`: シンプルなドキュメント表示
– `godoc`: 詳細なドキュメント表示、ソースコードリンク、検索機能

**3.インストール**:
– `go doc`: Go標準ツールチェーンに含まれる
– `godoc`: Go標準ツールチェーンに含まれる

**4.用途**:
– `go doc`: 素早い情報確認
– `godoc`: 包括的なドキュメント閲覧

**5.出力形式**:
– `go doc`: テキスト形式
– `godoc`: HTML形式(ブラウザで表示)

### `go doc`の例

**1.パッケージのドキュメントを表示**:
“`sh
go doc fmt
“`

**2.特定の関数のドキュメントを表示**:
“`sh
go doc fmt.Println
“`

元記事を表示

Go言語(Golang) Goroutine記述例

“`go
package main

import “fmt”

// producer関数は、0から9までの整数をfirstチャネルに送信します
func producer(first chan int) {
defer close(first) // 関数が終了する前にチャネルを閉じる
for i := 0; i < 10; i++ { first <- i // チャネルに整数を送信 } } // multi2関数は、firstチャネルから受信した整数を2倍にしてsecondチャネルに送信します func multi2(first chan int, second chan int) { defer close(second) // 関数が終了する前にチャネルを閉じる for i := range first { // firstチャネルから値を受信し、チャネルが閉じられるまでループ second <- i * 2 // 受信した整数を2倍にしてsecondチャネルに送信 } } // multi4関数は、secondチャネルから受信した整数を4倍にし

元記事を表示

GopherCon 2024 Recap: Exploring the Go Compiler: Adding a “four” loop

## はじめに

本記事は GopherCon 2024 の発表である [Exploring the Go Compiler: Adding a “four” loop](https://www.gophercon.com/agenda/session/1341852) の Recap のためのエントリです。こちらの内容は、元々 [Go 1.23 リリースパーティ & GopherCon 2024 報告会](https://gocon.connpass.com/event/324888/)で発表する予定でしたが、発表時間が15分しかなく具体的な実装を追う時間がなさそうなので、こちらの記事で具体的な変更差分をシェアすることとしました。

## 本記事で触れることと触れないこと

– 触れること
– 当該発表の概要
– コンパイラの処理の概要
– 構文追加における具体的な変更差分
– 触れないこと
– Goにおける用語の詳細な説明
– Statement、arrayなど
– よく知らない場合は[GoのSpecification](https://go.dev

元記事を表示

Go言語(Golang) Goroutine記述例

“`go
package main

import (
“fmt”
“sync”
)

// producer関数は整数チャンネルに整数を送信します。
func producer(ch chan int, i int) {
// チャンネルにi * 2を送信
ch <- i * 2 } // consumer関数はチャンネルから受信した整数を処理し、WaitGroupのDoneメソッドを呼び出してカウントを減らします。 func consumer(ch chan int, wg *sync.WaitGroup) { // チャンネルから受信した整数を処理 for i := range ch { fmt.Println("process", i*1000) wg.Done() } } func main() { // WaitGroupを初期化 var wg sync.WaitGroup // 整数チャンネルを作成 ch := make(chan int) // 10個のプロデューサーゴルーチンを起動 for i := 0; i

元記事を表示

OTHERカテゴリの最新記事