- 1. 【Go言語】マップ
- 2. 【Go言語】ゼロ値・スライス
- 3. GoでよしなにJSONをパースする
- 4. golang から Application Insights にログを送信する
- 5. Goの構造体をGhidraで逆アセンブルして静的解析する
- 6. Goの複数バージョンをインストールして切り替える
- 7. apimachineryのQuantity型の扱い
- 8. GoでEnumを自前実装したら結構使えた話
- 9. Goで競技プログラミングをするときに作っておくと便利な関数
- 10. aws lambdaカスタムランタイムでGoを動かす
- 11. 【Go言語】ポインタ
- 12. Go! Kobe! に参加しました
- 13. gormのDB.Set関数利用時のエラーについて
- 14. ゲーム開発におけるのサーバー負荷と戦う工夫
- 15. spm-goでGoの結合度を計測する
- 16. Goで作る Kubernetes Podで稼働するコンテナメトリクスを取得するプログラム
- 17. samber/loを使ってABC329のA-Fを解いてみた
- 18. Goで学ぶGraphQLサーバーサイド(9)ークエリ複雑度の制限
- 19. Go Conference mini 2023 Winter IN KYOTOに参加しました!
- 20. Goで並行処理を扱う
【Go言語】マップ
## マップ
マップは、キーと値のペアを格納するためのデータ構造で、キーを使ってデータの検索、更新、削除ができる。
Pythonの辞書やJavaのハッシュマップに似ている。### マップの作成
“`go
package mainimport “fmt”
func main() {
// リテラルを使用する
m1 := map[string]int{
“foo”: 1,
“bar”: 2,
}
fmt.Println(m1) // map[bar:2 foo:1]// `make`関数を使用する
m2 := make(map[string]int)
fmt.Println(m2) // map[]}
“`
### マップの操作
“`go
package mainimport “fmt”
func main() {
m := make(map[string]int)// 追加
m[“foo”] = 1
m[“bar”] = 2
fmt.Println(m) // map[bar:2 foo:1]// 更新
m[“f
【Go言語】ゼロ値・スライス
## ゼロ値
変数宣言したが、値を設定していない変数は**ゼロ値**で初期化される。### 型ごとのゼロ値
|型|ゼロ値|
|—-|——|
|数値|`0`|
|ブール型|`false`|
|文字列|`””`|
|ポインタ、インターフェース|`nil`|### サンプル
“`go
package mainimport “fmt”
func main() {
var n int
fmt.Println(n) // 0
var b bool
fmt.Println(b) // false
var s string
fmt.Println(s) // “”
var err error
fmt.Println(err) // nil
}“`
## スライス
スライスは動的なサイズを持つ配列のようなデータ構造で、同じ型の要素を順序つけて格納する。
スライスは宣言時にサイズを指定する必要がない。
配列よりも柔軟で、スライスの方がより一般的に使用される。### スライスの作成
スライスの作成には複数の方法がある
“`go
package m
GoでよしなにJSONをパースする
# よしなにJSONをパース
Goは静的型付け言語であるため、JSONを利用するにも型を宣言しなければならない。
自らが作成したアプリケーションが返すJSONならば良いのだが、
頻繁に変更されるような外部のAPIや巨大JSONの型を都度宣言し直すのは嬉しくない。そこで、型を宣言せずともJSONから値を取れるライブラリの紹介。
## jsonparser
https://github.com/buger/jsonparser“`bash
mkdir app/day6/ && touch app/day6/main.go
“`“`go
package mainimport (
“fmt”“github.com/buger/jsonparser”
)
func main() {
var jsonStr =`
{
“name”: “山田太郎”,
“age”: 30,
“isStudent”: false,
“address”: {
“street”: “桜通り1-2-3”,
“city”: “東京”,
“zip”:
golang から Application Insights にログを送信する
# golang から Application Insights にログを送信する
先だって、こんなアナウンスがありました。
[Making Azure the Best Place to Observe Your Apps with OpenTelemetry](https://techcommunity.microsoft.com/t5/azure-observability-blog/making-azure-the-best-place-to-observe-your-apps-with/ba-p/3995896?utm_source=pocket_saves)
> GoやRustなど、現在Distroが提供されていない言語はコミュニティのライブラリで計装して、Azure Monitor Agent経由でAzute Monitor/Application Insightsに送る、という方針
らしいのですが、このあたりあまり情報が整理されていないので、現時点で何ができているのか備忘録代わりに整理しておこうと思います。
全般的に、この辺りについては素人なので、用語や理解が
Goの構造体をGhidraで逆アセンブルして静的解析する
## お詫び
執筆中インフルエンザにり患してダウンしていたため、書ききれませんでした。
アドカレ中には書き切りますので温かい目で見守っていただけますと幸いです。
## はじめに
普段はVR企業でバックエンドエンジニアをやっています。
弊社では今までバックエンドのAPIを主にRuby/Railsで実装していたのですが、最近ではGoで実装することが増えてきております。
そこで今回はGoの内部実装の理解を進めるため、サイバーセキュリティでは有名なGhidraでGoの実行ファイルを逆アセンブルしてみます。
## Ghidraとは
Ghidra
– https://www.ghidra-sre.org/リバースエンジニアリングツールです。
アメリカのNSA(国家安全保障局)が開発したもので、2019年にOSSとして公開されました。
開発自体は2000年前半から始まっていて、十数年の時を経て誰でも利用できるようになりました。
– https://netagent.co.jp/study/blog/hard/20190530.html
今回はこのGhidr
Goの複数バージョンをインストールして切り替える
:::note info
この記事は[ZOZO AdventCalender 2023](https://qiita.com/advent-calendar/2023/zozo)シリーズ4の6日目の記事です。
:::# 始めに
go言語で複数バージョンをPCにインストールして切り替える方法について説明します。
なおgo言語では[Go1.x系の間には後方互換性を破壊するような変更は加えないということがルール化](https://go.dev/doc/go1compat)されているので、
基本的には最新バージョンを使用すれば良く、複数バージョンをPCに入れる必要はありません。
後方互換性を破壊するような変更を加えないといけないといった状況になった際にはGo2としてリリースされるという方針になっているようです。
しかしながら諸般の事情で複数バージョンをPCに入れて切り替えたいということはありえます。
筆者も最新バージョンではビルドができないというプロジェクトに最近関わることになり、最新バージョンとは別に1.17系を入れる必要が出てきて複数バージョンを扱う方法を調べました。
この記事ではそ
apimachineryのQuantity型の扱い
::: note info
これは [ZOZO Advent Calendar 2023](https://qiita.com/advent-calendar/2023/zozo) カレンダー Vol.5 の 6日目の記事です。
:::本記事では、GoでKubernetesリソースのメトリクスを扱う際に登場する、`k8s.io/apimachinery`モジュールの`api/resource`パッケージに含まれる`Quantity`型の扱いについてご紹介します。
# k8s.io/metricsモジュール
Kubernetesクラスタ内のPodやNode、コンテナといったオブジェクトのリソース使用量を取得する際、Kubernetes Metrics APIを利用することができます。
Go言語でこれらのリソース使用量を取得するプログラムを実装する場合、`k8s.io/metrics`モジュールが提供する型やメソッドを利用することで、簡単にこれを実現することができます。## Quantity型の利用箇所
`k8s.io/metrics`モジュールの中でもコンテナメトリクスの値
GoでEnumを自前実装したら結構使えた話
この記事は [Go 言語 Advent Calendar 2023](https://qiita.com/advent-calendar/2023/go) 6日目の記事です。
# はじめに
GoでEnumってどう実現するんだという話をSNSでたびたび目撃します。
[GoとEnumについて](https://zenn.dev/nobonobo/articles/986fea54fdc1c1)にベストプラクティスは紹介されていますが、今回は私の関わっているチームで自前実装した方式を紹介します。すでに本番導入している方式で、数年間本番で追加開発/保守運用する中でもうまく機能していると感じています。
# 実装したもの
こんな感じです。
定義ファイルから以下のコードを生成して使っています。“`order_status_gen.go
// Code generated; DO NOT EDIT.// 追加でメソッドを定義したい場合は、別ファイルでメソッドを追加してください。
// 別ファイルはこのファイルから、「_gen」を取った名前で作成してください。
// 例:hogeh
Goで競技プログラミングをするときに作っておくと便利な関数
この記事は[and factory.inc Advent Calendar 2023](https://qiita.com/advent-calendar/2023/andfactory)の6日目の記事です。
昨日は @MatsuNaoPen さんの「[使って便利なmermaid記法(flowchart編)](https://qiita.com/MatsuNaoPen/items/c052d012d62f1046baca)」でした。急遽埋めたので完全に業務に関係ない話で恐縮です…。もう一枠取っているのでそちらではもう少し業務絡みの事を書ければと思います。
# 概要
この記事ではGoで競技プログラミングをする時に作っておくよい関数をお伝えしたいと思います。Goで競技プログラミングをするに当たってのテクニックは既に詳しくまとめていただいている方がおり、こちらがとても参考になるかと思います。
https://qiita.com/ktateish/items/ab2df3e0864d2e931bf2
上記を踏まえた上で実際にどんな関数があると便利かは日々試行錯誤しているのですが、
aws lambdaカスタムランタイムでGoを動かす
# aws lambdaでGo
アドベントカレンダー5日目です。
Goはaws lambdaで正式にサポートされていましたが、Amazon Linux AMI のメンテナンスサポートが 2023 年 12 月 31 日に終了するに伴い、Go 用ランタイムもサポートが終了してしまいます。
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/lambda-golang.htmlそのため、これからは`provided.al2`イメージ上に作成する必要があります。
## Dockerfile作成
“`bash
touch app/day5/Dockerfile
touch app/day5/main.go
“`
`day5`を独立したモジュールとしたいため、初期化しておきます。
“`bash
cd app/day5
got mod init github.com/shuyaeer/learn-go/app/day5
“`Dockerfileです。ビルドしたバイナリを`provided:al2`上で実行しています。
“`do
【Go言語】ポインタ
## ポインタとは
値のメモリアドレスを扱う機能のこと。
変数がメモリ上のどこに格納されているかを示すために使用する。## 使い方
**ポインタの宣言**:`*` + `型`
**アドレスの取得**:`&`演算子
**値の参照**:`*`演算子## サンプルコード
“`go
package mainimport “fmt”
func main() {
var x int = 1
// xのアドレスをpに割り当てる
var p *int = &x
// pが指すアドレスの値を出力する
fmt.Println(*p) // 1// pが指すアドレスの値を変更する
*p = 2
fmt.Println(x) // 2
}“`
## 参考
https://www.oreilly.co.jp/books/9784873119694/
Go! Kobe! に参加しました
# はじめに
この記事は[Yamato Advent Calendar 2023](https://qiita.com/advent-calendar/2023/yamato) 4日目の記事です。今回は12/3(日)に神戸で開催された[Go! Kobe!](https://gdgkobe.connpass.com/event/303098/)に参加してきたのでまとめようと思います。
# 概要
[@tenntenn](https://twitter.com/tenntenn)さんが主催するGoのハンズオンイベントです。https://gdgkobe.connpass.com/event/303098/
↓ ハンズオンの資料です
https://github.com/gohandson/genai-ja
# ハンズオン
ハンズオンはステップアップ式にOpenAIを活用したChat Botを作成するというものでした。
普段Goをかじってはいるので、内容は比較的簡単に感じました。が、このハンズオンを通して、学んだこともたくさんあったので、まとめたいと思います。
gormのDB.Set関数利用時のエラーについて
これは[Hubble Advent Calendar 2023](https://qiita.com/advent-calendar/2023/hubble)の3日目[^1]の記事です。
[^1]: 平日のみの投稿なので、投稿日は5日ですが3日目の記事としています。# はじめに
契約書の作成から管理までを行える契約書管理クラウドの[Hubble](https://hubble-docs.com/)では、一部のサービスをGo言語で実装しています。
ORMに[gorm](https://gorm.io/)を使っているサービスがあり、その利用シーンにおいて問題が発生し、解決に時間を要したため、この記事にて紹介させていただきます。# gormのDB.Set関数の振る舞いについて
## サンプル“`go:sample.go
const key = “test_key”type (
Form struct {
ID uint `json:”id” gorm:”primaryKey”`
Name
ゲーム開発におけるのサーバー負荷と戦う工夫
# はじめに
この記事は[サイバーエージェント24卒内定者 Advent Calendar](https://qiita.com/advent-calendar/2023/ca24engineer)の5日目です。こんにちは、都内在住の大学生をしている[Daina](https://qiita.com/nishiumidaina)です。普段はゲームの開発や研究をしています。
今回はゲームのサーバーサイド開発に焦点を当てて、golangを用いたゲームサーバーのメモリキャッシュとDBシャーディングに関する内容を中心に取り扱います!## プロジェクト構成
– 言語:Golang
– フレームワーク: Echo
– DB: MySQL
– ORM: gorm
– キャッシュ:go-cache※重要なディレクトリのみ記載
“`
.
├─ api
| ├─ di: wire
| └─ presentation
| ├─ controller: ハンドリングを記述する
| ├─ middleware
| ├─ request: 自動生成
| ├─ re
spm-goでGoの結合度を計測する
よいパッケージ性の測り方
## 結合度を計測する
コードの良さを測る指標として循環的複雑度などがありますがどちらかというと単一ファイルの指標で、アーキテクチャの良さを測る指標として不足に感じました。マイクロサービスでもモジュラーモノリスでもマルチモジュールの境界をどううまく引くかは悩みどころで、機械的なソフトウェアメトリクスである程度あたりをつけられると便利です。
Goの結合度を測るツールとして[spm-go](https://github.com/fdaines/spm-go)の存在を知ったので動かしてみます。
## spm-goとMattermostの準備
spm-goをインストールします。helpが出ればインストール成功。“`bash
$ go version
go version go1.21.4 darwin/arm64
$ go install github.com/fdaines/spm-go@latest
$ spm-go
Software Package Metrics for GoUsage:
spm-go [command]Availa
Goで作る Kubernetes Podで稼働するコンテナメトリクスを取得するプログラム
::: note info
これは [ZOZO Advent Calendar 2023](https://qiita.com/advent-calendar/2023/zozo) カレンダー Vol.5 の 5日目の記事です。
:::本記事では、Go言語でKubernetes Podで実行中のコンテナメトリクスを取得する方法をご紹介します。
Kubernetesでは、アドオンのコンポーネントであるmetrics-serverをデプロイすることで、Metrics APIを介してクラスタ内で実行中のPodやNodeのリソース使用量を取得することができます。
こちらのMetrics APIを利用して対象のPodで稼働中のコンテナメトリクスを取得するプログラムをGo言語で作成しつつ、各処理について説明します。# `k8s.io/metrics`モジュールの紹介
Kubernetes Organization配下のリポジトリである`metrics`リポジトリでは、`k8s.io/metrics`モジュールを提供しています。
このモジュールには、Kubernetes Metri
samber/loを使ってABC329のA-Fを解いてみた
# はじめに
これは、[富士通クラウドテクノロジーズ Advent Calendar 2023](https://qiita.com/advent-calendar/2023/fjct) の5日目の記事です。
## 投稿動機
### その1
競技プログラミングのコツの一つとして、ライブラリを利用してコードの記述量を減らし、より早く問題を解くというものがあります。競技プログラミング用の自作ライブラリを設計する際は、この観点をはじめとして、使い勝手の良さ、コマンドの覚えやすさなどの様々な観点を加味しながら設計を行っていきます。他作のライブラリを使ってみたり、汎用のライブラリを触ってみたりもします。そんな中でlodashのエッセンスを取り込める[samber/lo](https://github.com/samber/lo)というライブラリを見つけたので、これを利用した場合にどのようなコードになるかを検証してみました。
### その2
[プログラミング文体練習](https://www.oreilly.co.jp/books/9784814400225/)というオライリー本を読ん
Goで学ぶGraphQLサーバーサイド(9)ークエリ複雑度の制限
こんにちは。
今回はクエリ複雑度の制限について説明いたします。
# この章について
N+1問題に対してDataloaderを使い対処したように、複雑なクエリが来たとしてもDBにかける負担を減らす方法というのは確かに存在します。
しかし、どんなにリゾルバ内の処理を工夫したとしても、そもそものリクエストクエリが複雑で、取得対象となるデータが膨大になっている場合にはやはりサーバーにかかる負荷は重くなってしまいます。
そのため、「あまりにも複雑なクエリはそもそも受け付けないようにする」という機能をGraphQLサーバーにつけることがあります。
今回はその「クエリ複雑度の制限」をサーバーにつける方法を紹介します。# クエリ複雑度の計算法
「あまりにも複雑なクエリはそもそも受け付けないようにする」という機能のためには、クエリの複雑度を定量的に決定する必要があります。
ここではまず、デフォルトでのクエリ複雑度の計算法を解説したいと思います。## 具体例となるクエリ
今回具体的に複雑度を計算するクエリとして、以下のものを使用します。
“`graphql
query {
nod
Go Conference mini 2023 Winter IN KYOTOに参加しました!
# はじめに
この記事は[Yamato Advent Calendar 2023](https://qiita.com/advent-calendar/2023/yamato) 3日目の記事です。今回は12/2(土)に京都で開催された[Go Conference mini 2023 Winter IN KYOTO
](https://kyotogo.connpass.com/event/285351/)に当日スタッフとして参加してきたので、そのことについて色々まとめようと思います。# 何で運営参加なのか?
元々、Go Conference mini IN KYOTOには3枠しかない学生枠で参加予定でした。
が、、、kyoto.go運営のアカウントから以下のようなポストがありました。
Go Conference mini 2023 Winter IN KYOTOの当日スタッフを追加募集いたします。 当日スタッフの参加応募に関して現地参加枠を所有するかどうかは不問です。 締切は18日23時59分となります。 詳細は以下のアンケートよりご確認ください。 https://t.co/ANCDY8BRLD… #kyotogo
— Kyoto.go (@kyotogolang) November 8, 2023
とあり、当日スタッフを5名ほど募集していました。
自分はGoが好きで、Goのコミュニティにも関わりたいと思っていた矢先このようなチャンスが舞い込んできました。
Go Conf
Goで並行処理を扱う
#並行処理
アドベントカレンダー4日目は並列処理についてです。[3日目はこちら](https://qiita.com/shuyaeer/items/60ce23324dc1063c4e98)## Goにおける並行処理
Goは並行処理ととても相性がよく、最大の特徴の一つといってもいいでしょう。次に並列処理のプログラムとその実行例を見てみます。
プログラムは0から4までの数字を2倍にして表示するというものです。
“`go
package mainimport (
“fmt”
“sync”
“time”
)func worker(id int, wg *sync.WaitGroup, results chan<- int) { defer wg.Done() fmt.Printf("Worker %d starting\n", id) time.Sleep(time.Second) fmt.Printf("Worker %d done\n", id) results <- id * 2 } func main() { const numWorkers