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

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

元記事を表示

ゲーム開発におけるのサーバー負荷と戦う工夫

# はじめに
こんにちは、都内在住の大学生をしている[Daina](https://qiita.com/nishiumidaina)です。普段はゲームの開発や研究をしています。

この記事は[サイバーエージェント24卒内定者 Advent Calendar](https://qiita.com/advent-calendar/2023/ca24engineer)の5日目です。

今回はゲームのサーバーサイド開発に焦点を当てて、golangを用いたゲームサーバーのメモリキャッシュとDBシャーディングに関する内容を中心に取り扱います!

## プロジェクト構成
– 言語:Golang
– フレームワーク: Echo
– DB: MySQL
– ORM: gorm
– キャッシュ:go-cache

※重要なディレクトリのみ記載
“`
.
├─ api
| ├─ di: wire
| └─ presentation
| ├─ controller: ハンドリングを記述する
| ├─ middleware
| ├─ request: 自動生成
| ├─ r

元記事を表示

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 Go

Usage:
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運営のアカウントから以下のようなポストがありました。

とあり、当日スタッフを5名ほど募集していました。
自分はGoが好きで、Goのコミュニティにも関わりたいと思っていた矢先このようなチャンスが舞い込んできました。
Go Conf

元記事を表示

Goで並行処理を扱う

#並行処理
アドベントカレンダー4日目は並列処理についてです。[3日目はこちら](https://qiita.com/shuyaeer/items/60ce23324dc1063c4e98)

## Goにおける並行処理
Goは並行処理ととても相性がよく、最大の特徴の一つといってもいいでしょう。

次に並列処理のプログラムとその実行例を見てみます。
プログラムは0から4までの数字を2倍にして表示するというものです。
“`go
package main

import (
“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

元記事を表示

Golangの開発生産性を上げるVSCodeスニペットランキング

本投稿はMIXI DEVELOPERS Advent Calendar 2023 4日目の記事です。

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

この記事では、Golang用のVSCodeユーザースニペットの中で自分が特に役に立っていると思うものをランキング形式で発表します!

# 前提:

### VSCode ユーザースニペットとは
コードとキーを予め登録することでキー入力するだけで設定したコードが簡単に呼び出せる機能です。
キーボードソフトの辞書機能に似ていて、特定のキーワード入力で予め設定されたコードが挿入されると考えていただけるとわかりやすいと思います。

### VSCode ユーザースニペット 登録方法

⌘ + Shift + P で検索フィールドを展開し、`snippets` を入力すると候補にあがってくるのでクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262578/75e71a57-d97c-19

元記事を表示

型システムから考えるPython, Java, Golangそれぞれの違い

# 初めに

## 背景

今までPythonを使ってきたのですが、転職先ではJavaとGolangを主に使用することになりました。特にPythonにはない型を意識した開発のメリット、JavaとGolangのintefaceの違いがあまりよく分からなかったので、調べてみました。
この記事では、PythonとJavaとGolangの違いについて触れ、そして記事の最後には GolangとJavaのintefaceを違いを明示しつつ、Pythonで書き直してみました。

## 対象読者

* 動的型付け言語しか使ったことない人
* JavaとGolangの違いがはっきり分からない人
* 型を意識したことがあまりない人

## シンプルな実装

まず、Python, Java, Golangの3つで一番シンプルなクラスを書いてみる。
Pythonは以下を見てもらうと分かる通り、Pythonを知らない人でも、理解できてしまうぐらいシンプル。

Pythonの場合

“`python:simpleなクラス(python)
clas

元記事を表示

色々な言語で簡単なREPLを実装する #golang

続きです。

# REPLとは
[こちらの記事](https://qiita.com/runeleaf/items/7615afd7abc79c9b3c01)を参照してください。

## Goで実装する

main.go
“`golang
package main

import (
“bufio”
“fmt”
“os”
)

func main() {
scanner := bufio.NewScanner(os.Stdin)
cmd:
for {
fmt.Print(“go> “)
if !scanner.Scan() {
break
}
prompt := scanner.Text()
switch prompt {
case “exit”:
fmt.Println(“Bye!”)
break cmd
default:
fmt.Println(prompt)
}
}
}

“`

## 実行する

“`bash
$ go mod edit -module=example.com/app
$ go buil

元記事を表示

「無害」なdata raceについて

## 概要

Goの「無害」なdata raceについてはたしてそれは実際には無害なのか、避けるべきなのか例を交えてまとめている

## 結論

「無害」なdata raceも避けるべき

## そもそもdata raceとは?

二つ以上のスレッドが同じ変数(メモリ)に対して同時にアクセスし、少なくとも一つのスレッドが書き込みの場合に発生する状態のこと

参考:https://ja.wikipedia.org/wiki/%E3%83%87%E3%83%BC%E3%82%BF%E7%AB%B6%E5%90%88

### data raceの例

典型的な例で言うと、以下のように二つのgroutineからcount変数に対してアクセスする場合、

以下は0,1,2,3,4,5,,と表示されるわけではない

おそらく(タイミングによって変わる)0,0,0,0,1,,1,1,1,1みたいに表示される

“`go
package main

import (
“fmt”
)

func main() {

var count int
ch := make(chan bool)

g

元記事を表示

バックエンドをGoからRailsに切り替えたお話

# はじめに
今年のカレンダーはとある会社のとあるチームで活動した1年間を振り返っていきます

背景はこちらに記載しています

# バックエンドをGoからRailsに切り替えたお話
## やったこと
環境構築の記事を以前投稿しています。

https://qiita.com/does_not_exist/items/19c35639e466844e8b0e

https://qiita.com/does_not_exist/items/23a70dab286ed146b05f

https://qiita.com/does_not_exist/items/b79b3fd51ea6ef39df23

## 気づいたこと
環境構築はGoよりRailsの方が少し早くできたような気がします。
Rails側でよしなに設定してくれる箇所が多いからだと思います。Goはポインタや構造体という概念があるので理解に時間がかかったりしました。コードの書きやすさ、可読性でいえばGoの方が良いのかなという感触でした。

# おわりに
RailsもGoもさらに触れていき、状況に応じて技術選択できるようになりたいで

元記事を表示

【Go言語】シャドーイング

## シャドーイングとは
異なるスコープで同じ名前の変数が使用される場合に発生することがある
具体的には、異なるスコープで`:=`演算子を使って再宣言された変数はスコープ外の値に影響を及ぼさない

意図せずに異なる変数にアクセスしてしまう可能性があるので、注意が必要になる

### サンプル

“`go
package main

import “fmt”

func main() {

num := 10
if true {
num := 20 // シャドーイングが起きる
fmt.Println(num) // 20
}
fmt.Println(num) // 10

if true {
num = 30 // シャドーイングが起きない
fmt.Println(num) // 30
}
fmt.Println(num) // 30
}

“`

## シャドーイングを避ける方法

1. `:=`の代わりに`=`を使う
1. shadowを利用する
使用方法は以下の記事が参考になる
* https://engineer-

元記事を表示

制約で固められた環境をできるだけモダンに踏み倒す

# はじめに
こちらは[**klis(筑波大学情報学群知識情報・図書館学類) Advent Calendar 2023**](https://adventar.org/calendars/8957) 4日目の記事です!
klisのアドベントカレンダーに参加するのは初めてです!よろしくお願いします〜

## 自己紹介

本年度から長野高専より3年次編入しました**Bony_Chops**と申します!Web系の技術に興味があります

https://bonychops.com

# 前置き
自分は[データベース技術](https://kdb.tsukuba.ac.jp/syllabi/2023/GE70901/jpn)という科目を履修しており、その授業では最終成果としてDBを用いたWebサービスを開発します。
成果物は授業で提供されるVPSを使って動かします。以下のような環境・制約です(一部セキュリティの都合上あえて曖昧な表現をしています)。

– VPS
– OS: Linux系統(amd64)
– 接続方法: SSH
– PHP/HTML/CSS/JS

今回は、この授業の環境でなるべ

元記事を表示

Next.js+Go+MySQLの環境をDockerで構築する

# はじめに
この記事では、frontend、backend、dbのコンテナを作成しコンテナ間通信が出来るようにする所まで説明しています。
ですので、それぞれの層での実装までは行わないので、予めご了承ください。🙇
## 環境
Docker : v24.0.6
Docker Compose : v2.23.0-desktop.1

## 構成図
“`
.
├── docker-compose.yml
├── backend
│ ├── Dockerfile
│ └── app
│ └── main.go
├── frontend
│ ├── Dockerfile
│ ├── app
│ ├── public
│ ├── node_modules
│ ├── .eslintrc
│ ├── next-env.ts
│ ├── next.config.js
│ ├── package-lock.json
│ ├── package.json
│ ├── postcss.config.js
│ ├── README.md

元記事を表示

Goにおけるポインタ操作

# ポインタを学ぶ
3日目はポインタについてです。
Go言語においてポインタは非常に重要な概念です。

“`go
package main

import “fmt”

func main() {
i, j := 42, 2701

p := &i // point to i
fmt.Println(p) // 0x1400009c018
fmt.Println(*p) // read i through the pointer
*p = 21 // set i through the pointer
fmt.Println(i) // see the new value of i

p = &j // point to j
*p = *p / 37 // divide j through the pointer
fmt.Println(j) // see the new value of j
}
“`

実行する前に挙動を考えてみることにします。

変数pに変数iの番地を代入しています。
“`go

元記事を表示

Rust vs. Go: About Vulnerability Management

Rust / Go のセキュリティについて考える。

依存関係の管理が重要になる。

特に、コードを流用する場合は、`Cargo.toml` の内容は注意が必要。

依存関係については、Node.js にも同じことが言える。

共通で使える scanner について調べる。

– [OSV‑Scanner](https://github.com/google/osv-scanner)
– [Trivy](https://github.com/aquasecurity/trivy)

他にもあると思うが、事例や汎用性を考えてこの 2 つについて調べる。`cargo audit` は置いておく。

## Environment
– dev container
Rust と Go が使える状態。

https://github.com/danny-yamamoto/rust-api-samples/blob/main/.devcontainer/devcontainer.json

## Installation
– OSV‑Scanner
[Docs](https://osv.dev/)

元記事を表示

【Go言語】リテラル・変数宣言

## リテラル
Goのプリミティブなリテラルでよく使われるもの
* 整数
* 浮動小数点数
* ブール型
* 文字列
* nil
> `nil`は無効な参照先を表す値で、初期化されていない状態を表すのに利用される

“`go
// 整数
1
// 浮動小数点数
1.5
// 文字列
“あいう”
`Hello
World`
// プール値
true
false
// nil
nil
“`

## 変数宣言
`var`の後に`変数名`、`型`で宣言する
初期値を代入する場合は、`=`の後に`初期値`を記述する
初期値の値から型が明らかな場合は、`型`を省略できる

“`go
// 整数型の宣言
var num1 int = 10

// 右辺から型が決まるので型の記述を省力できる
var num2 = 20
“`

変数名と初期値の代入を`:=`演算子で行うことができる
ただし、関数の中でしか使えない

“`go
package main

import “fmt”

// コンパイルエラーになる
num1 := 10

func main() {
// num2に整数を

元記事を表示

GoでAPIサーバーを立てよう!(Ruby on Railsと比較しながら)

# 概要
Ruby on Railsしかバックエンド触ったことがない筆者がはじめてGoでAPIサーバーを立てた時、「Railsと比較しながら理解すれば理解しやすいのでは・・・!」と思いせっかくなら記事にしようと思い立って記事にした。

# まず最初に、RailsでAPIサーバーを動かすイメージを・・・
まず、RailsでAPIサーバーを動かす時、どうやって実装してサーバーを動かしていたかイメージします。
文字にするとこんな感じでしょうか。
1. rails sするとlocalhost:3000にサーバーが立ち上がる
2. routes.rbにルーティング(エンドポイントと対応するコントローラー, アクション)を定義する
3. コントローラーのアクションの中身を書く(DBの読み込み、書き込み、レスポンスの返却…etc)

GoでAPIサーバーを立てるときも基本的にやることは変わらず、この通り進めていけば問題ないです。

# じゃあ実際にGoでAPIサーバーを立ててみようか
んじゃ、実際にやってみましょう。

## 1. Goの環境を立ち上げる
railsでいうところのrails ne

元記事を表示

OTHERカテゴリの最新記事