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

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

redis-goを使い値を取得するところまで自学習してみた話

## はじめに
この記事は [スタンバイ Advent Calendar 2023](https://qiita.com/advent-calendar/2023/stanby) の13日目の記事です。
昨日の記事は [@smurai_](https://qiita.com/smurai_) さんの「[MCodeが変えるMy行動. 未来神々 視界良好](https://note.com/smurai/n/n344499bb55f8)」でした。

# ごあいさつ
[株式会社スタンバイ](https://stanby.co.jp/)でSEOエンジニアをやっております、[本田](https://qiita.com/arata-honda)と申します!
スタンバイでは、ScalaからGoへのリプレイスを行なっています!
この度Goのキャッチアップもかねて[アドベントカレンダー](https://qiita.com/advent-calendar/2023/stanby)に参加させていただきました!

# 今回のゴール
– [MUST]go-redisを使って簡単な値を取得する
– [MUST]

元記事を表示

SQLBuilderの仕様を考える 目標設定編

# 目的
GolangのSQLBuilerを作ってみたくて、仕様を考える。
最終系をみつつ、Version1にするゴールを考える

# なんでやってみたいのか
GolangにもSQLBuilderはあるが、unionに対応していないことが多い。(もしかしたらやり方を知らないだけかも)
現在業務では、unionを使うことが非常に多いのでどうするべきかに困っていた。
With句を使うことも多いのでこちらも対応したい。
それならやってみようと思ったことと、OSS活動にもならないかと思ってやってみようと思い立った。

# 目標
主要な手段である
– Select
– insert
– Update
– Delete(truncateを含める)
に対応できるようにしたい。
最初は特定のコマンドを実行することでSQL文が取得できる形を目指す。
他のORMなどの連携に関しては形ができたときに検討することとして一旦は保留とする。
最初はMySQL対応をベースにする。
Postgreseに関しては別途対応を考えるものとする。

## Modelとの関係性
Version1では基本見送る。
方針としては

元記事を表示

平均律じゃなくたっていいじゃない 〜2の12乗根は無理数だもの〜

https://qiita.com/advent-calendar/2023/42tokyo

この記事は 42 Tokyo Advent Calendar 2023 の 12日目の記事です。

12といえば、西洋音楽で 1オクターブに存在する半音の数ですよね!

ということで、今回は go言語で wave ファイルを生成しつつ、平均律以外の音律でも演奏できるようにしてみたいと思います。

## WAV ファイル

https://ja.wikipedia.org/wiki/WAV

RIFFベースの音声ファイルフォーマット。
非圧縮リニアパルス符号変調で符号化した音声の格納によく用いられる。
要するに音の波形をそのまま数値化したデータを格納している。

### WAV ヘッダー

“`go
type WaveHeader struct {
ckID_riff [4]byte // “RIFF”
ckSize_riff uint32 // 以降のバイト数 // 36+len(data)
formType [4]byte // “WAVE”

元記事を表示

Goで学ぶGraphQLサーバーサイド(10)ーGraphQL特有のミドルウェア

こんにちは。

今回は「GraphQL特有のミドルウェア」について説明していきます。

# この章について

前章にて「クエリ複雑度によって、リクエストの受付可否を決める」機能を、エクステンションというミドルウェアのようなものを使って導入しました。
しかし、GraphQLには他にもリゾルバによる処理前後にロジックを挟むミドルウェアが存在します。
本章ではそれらを紹介したいと思います。

# GraphQLサーバーに適用できるミドルウェア

`github.com/99designs/gqlgen/graphql`の中に定義されているミドルウェアは全部で4種類存在します。

“`go
type OperationMiddleware func(ctx context.Context, next OperationHandler) ResponseHandler
type ResponseMiddleware func(ctx context.Context, next ResponseHandler) *Response
type RootFieldMiddleware func(ct

元記事を表示

Goのクロスコンパイルのありがたみを知る

# クロスコンパイル
Goはクロスコンパイルをサポートしています。
つまり、MacOS上でWindows上、Linux上それぞれで動作するバイナリを生成することができます。CPUアーキテクチャも複数サポートしています。

## クロスコンパイルできると
実行環境用のバイナリを生成できるということは、わざわざGoが動作する環境を用意する必要がありません。(Goの環境構築は比較的容易ですが)
もっというと、リポジトリをcloneする必要がなかったり、コンテナにはバイナリ一つ載せればよいということになります。

## クロスコンパイルできる環境
クロスコンパイルできる環境一覧です。
`OS/CPUアーキテクチャ`で表示されています。
“`bash
$ go tool dist list
aix/ppc64
android/386
android/amd64
android/arm
android/arm64
darwin/amd64
darwin/arm64
dragonfly/amd64
freebsd/386
freebsd/amd64
freebsd/arm
freebsd/arm6

元記事を表示

[Go]パート4

# はじめに
訳あってGo言語を勉強することになりました。
完全に自分のメモ用です。
馴染みのない書き方を中心にメモしていきます。

## func
“`go:main.go
package main

import “fmt”

func main() {
var a int
var b int

a, b = test(5, 7)

fmt.Println(a)
fmt.Println(b)
}

func test(x int, y int) (int, int) {
return x * y, x + y
}
“`
結果
“`
35
12
“`
戻り値を複数返すことが可能です。

## ポインタ
“`
package main

import “fmt”

func main() {
var val1 int

fmt.Println(val1)
change(&val1)
fmt.Println(val1)

}

func change(hoge *int) {
fmt.Println(hoge)
*hoge = 4
}
“`
結果

元記事を表示

gqlgenで大きなファイルをアップロードできない時の対処法

# はじめに
普段、業務でGo + GQLGenを使ってアプリケーションを構築しているものです。
https://gqlgen.com/

その中で3MBぐらいのファイルをアップロードした時にエラーが出る事象が発生しました。その時の解決まで至る過程を記します。

# 不具合発生
ある日、ビジネス側から不具合の報告が

「ファイル(画像)を50枚ぐらい一度にアップロードしようとするとエラーになる」

すぐにローカルで確認しましたが、再現。コンソールを見ると、

“`
net::ERR_CONNECTION_RESET
“`

が出ていました。

# 調査
エラーメッセージが汎用的なものだったので、全く原因がわからず非常に苦戦しました。

ログを見てみると、バックエンドにリクエスト自体は来ているみたいなので、バックエンドのどこかで落ちていると仮定して、調べてみました。

# 解決法

どうやらGQLGenではデフォルトでファイルの最大が決められているらしく、それを変えたら正常に動くようになりました。

https://stackoverflow.com/questions/756461

元記事を表示

Datadog Go APM の automatic instrumentation

## はじめに
こんにちは、Datadog Japan で Sales Engineer をしている AoTo(@AoTo0330) です。

この投稿は **[AoTo Advent Calendar 2023](https://qiita.com/advent-calendar/2023/aoto) 12日目**の記事です。

**Orchestrion** はご存知でしょうか。

Golang はコンパイル型の言語のため、Java, Python のように実行時にコードを追加することができません。アプリケーションの計装を行うには手動計装か、最近では eBPF を利用した自動計装が知られています。

これに対し Datadog は [**Orchestrion**](https://pkg.go.dev/github.com/jonbodner/orchestrion) と呼ばれる自動的計装のツールを公開しています。

:::note info
Orchestrion による automatic instrumentatio

元記事を表示

プログラミング言語Go 1Dayブートキャンプ に参加して

![Advent Calendar 2023 Template.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618539/1832138c-67bb-ca66-f327-8a8eeb83ea8f.png)
[Chompy Advent Calendar 2023](https://qiita.com/advent-calendar/2023/chompy) の12日目です。

はじめまして。
ChompyでBIZアシスタントをしたり、コーポレートをしたり、エンジニアに転向したりしている吉田です。
経歴が怪しいですが、気になる方は[Podcast](https://open.spotify.com/episode/0OlqreJHXl6a6iFJQ2nI6n?si=onHc9kQjSGW1ud9iFFhRfA)をチラ聞していただけると経緯を話していたりします。

# プログラミング言語Go 1Dayブートキャンプ

Go初心者なのでさまざまな形で勉強しているのですが、
先日ブートキャンプへ参加する機会

元記事を表示

GoとOpenAI APIでシンプルなChat API作ってみた

# 概要
タイトル通り、GoとOpenAIのAPIを使ってChat APIを作ってみようと思います。
Goも生成AIもど素人なので、ご指摘ご助言ありましたらいただけると非常にありがたいです。

なんちゃってハンズオンみたいな感じを目指して書いていきます。

### 使用技術
– Go(Gin)
– Docker
– OpenAI

### 構成を考える
こんな感じで作っていこうと思います。
“`
├── cmd
│ └── main.go
├── docker-compose.yml
├── Dockerfile
├── go.mod
├── go.sum
└── pkg
├── config
│ └── config.go // 環境変数担当
├── domain
│ └── usecase
│ └── chat_usecase.go   
├── infra
│ └── openai
│ ├── client.go     // OpenAIとの疎通担当

元記事を表示

Goで標準出力を差し替えて遊ぶ

:::note info
この記事は[ZOZO AdventCalender 2023](https://qiita.com/advent-calendar/2023/zozo)シリーズ5の12日目の記事です。
:::

# Goの標準出力
皆さんはGo言語で始めて書いたプログラムはどんなプログラムでしょうか?
多くの人はHelloWorldではないかと思います。
説明するまでもないですが、こうですね
“`go
package main

import fmt

func main() {
fmt.Println(“Hello, World!!”)
}
“`
この一見シンプルな入門用プログラムも紐解いていけば発見に溢れていて色々と面白いアイディアが生まれます。
というわけでシンプルだけど奥深いGoの世界にDeepDiveしていきましょう。

## fmt.Println
Goでとりあえず何かを出力したいなら真っ先に使うのが、この`fmt.Println`です。
HelloWorldでも使われてGoの初学者が最初に呼び出す関数です。
この記念すべき初めて呼び出す関

元記事を表示

Rust vs. Go: Effective Unit Testing

[Retail AI Adventurers Advent Calendar 2023](https://qiita.com/advent-calendar/2023/rai-adventurers) の投稿です。

https://qiita.com/advent-calendar/2023/rai-adventurers

[Retail AI](https://www.retail-ai.jp) は、[トライアルカンパニー](https://www.trial-net.co.jp) を軸とした小売におけるお客様の買い物体験の向上を目指す企業です。

この投稿では、本業(SRE)のかたわらで取り組む Backend Tech Stack について書きます。

題材は、「Rust 初心者として、Standard な Test Code の実装方法」についてです。

Rust における Test Code の書き方と Go で一般的な Table Driven Tests[^1] を使った Test Code について書きます。

## tl;dr
* Rust でも Go と同じよう

元記事を表示

AtCoder Beginners SelectionをGoで解いてみた(前半)

`Go`の基本的な文法に慣れるため、**AtCoder Beginners Selection**を解いてみようと思う

## AtCoder Beginners Selectionとは?
> このコンテストは、「AtCoderに登録したけど何をしていいか分からない・・・!」という人に向けて作られた、初心者向け問題集です。

https://atcoder.jp/contests/abs

### PracticeA Welcome to AtCoder
https://atcoder.jp/contests/abs/tasks/practice_1

**PracticeA**は`Go`のサンプルコードが問題文の下にある。
`fmt.Scan` 関数で標準入力からデータを読み込み、指定した変数に値を格納できる。

#### ACコード
“`go
package main

import (
“fmt”
)

func main() {
var a, b, c int
var s string
fmt.Scan(&a, &b, &c)
fmt.Scan(&s)

resu

元記事を表示

シンプルなインメモリキャッシュ go-cache

# go-cache
キャッシュというと、Redisやmemcachedなどが有名所ですが、Goではインメモリなキャッシュを扱うことができます。アイテムごとにTTLを設定でき、取り扱いがシンプルな`go-cache`を紹介します。

https://github.com/patrickmn/go-cache

## インストール
“`bash
go get github.com/patrickmn/go-cache
“`

“`go:main.go
package main

import (
“fmt”
“time”

“github.com/patrickmn/go-cache”
)

func main() {
// TTL設定
c := cache.New(30*time.Second, 2*time.Minute)
c.Set(“key”, “value”, cache.DefaultExpiration)

val, found := c.Get(“key”)
if found {
fmt.Println

元記事を表示

TinyGo×leavesでLightGBMのWASMを作る

## 概要
この記事では、LightGBMを用いた推論処理をWASMにしてブラウザ上で実行させる方法を紹介します。具体的には、軽量なビルドアセットが作成可能なTinyGoと全てGo言語で実装されているleavesを使い、軽量でランタイムやモデルファイルが内包されているWASMを作ります。

## leaves
leavesは純粋なGo言語だけでGBRTモデルの予測コードを実装しているライブラリで、対応モデルはLightGBM、XGBoost、scikit-learnのtree modelです。今回はLightGBMの学習済みモデルを推論で利用させるために使用します。LightGBMのモデル読み込みは、txt形式とjson形式の2種類が対応しており、自分の環境ではLightGBMのモデルファイルサイズが小さいtxtの方を利用しました。また、標準でカテゴリ特徴量がサポートされていたり、バッチ推論もできるのが特徴量です。推論速度はREADMEによるとC言語実装と比較してもそれなりに高速みたいです。また、External (Unofficial) RepositoriesとしてLightGBM

元記事を表示

クリーンアーキテクチャへの第一歩

## 1. **はじめに**

本記事では、ソフトウェアアーキテクチャの一つであるクリーンアーキテクチャの基本的な理解を深めることができます。
具体的な実装方法として、Go言語を用いた例を紹介します。クリーンアーキテクチャとGo言語の特性を初めて学ぶことで、ソフトウェア開発がより効率的でメンテナンス性の高いものになる第一歩を踏み出せると思います!
また、クリーンアーキテクチャの全体像を掴みたい方や、Go言語の実用例を知りたい方にも役立つ内容となっていますー!

## 2. **クリーンアーキテクチャとは何か**

ソフトウェアの設計と組織を明確にし、可読性とメンテナンス性を高めることを目的とした設計原則です。
これにより、ソフトウェアはテストが容易で、柔軟性があり、独立した開発とデプロイが可能となります。

## 3. **クリーンアーキテクチャの構造**

円状に層を配置した構造を持ちます。内側の層が外側の層に依存する一方で、外側の層は内側の層に依存しないようになっています。

![CleanArchitecture.jpg](https://qiita-image-store.s3

元記事を表示

Goのinternalパッケージを使ったPackage by Featureを意識した構成

この記事は カオナビ Advent Calendar 2023(シーズン2) 11日目です。

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

最近はinternalパッケージを使用した開発をしているので、どのような構成でやっているかを書きます。

## internalパッケージ

Goでは先頭を大文字にした関数・interface等はどこからでも参照できます。
ただモジュール開発などをしていると内部で共通化のためにパッケージを切り出したいが、外部から参照はさせたくないということはよくあります。

そこで以下のようにinternalパッケージを使用することで、配下パッケージの実装を外部パッケージから参照できなくすることができます。

以下の構成の場合は`a/b/b.go`からは`a/b/internal`を参照できますが、
`a/a.go`からはinternalパッケージ配下は参照できなくなります。

“`
a/
├ b/
│ ├ internal/
│ │ ├ d/
│ │ │ └ d.go
│ │ └ c

元記事を表示

Goの書式付きフォーマットをpkg.go.devを見ながらまとめる

# Goのfmt.Printf()をpkg.go.devを見て勉強する

Goの書式付きフォーマットを見ると最初はびっくりしませんか?

過去の私と同じ経験をしているあなたと一緒にこの記事で勉強していきたいと思います。

参考サイト
https://pkg.go.dev/fmt

## 忙しい方向けにサマリ

– 個人的に良く使うもの

| フォーマット | 出力 |
| — | — |
| %v | 通常のフォーマット |
| %+v | フィールド名つきのフォーマット |
| %d | int |
| %s | string |

– デバッグ時には%+vを進めたい

## 参考サイトを見ていきましょう

“`go
package main

import (
“fmt”
“math”
“time”
)

func main() {
// A basic set of examples showing that %v is the default format, in this
// case decimal for integers, which can be

元記事を表示

技術書典15で「Go言語で構築するクリーンアーキテクチャ設計」を頒布した話

# はじめに
技術書典15にサークル名「コードカキタイ」で初参加し「Go言語で構築するクリーンアーキテクチャ設計」を頒布しました。

https://techbookfest.org/product/9a3U54LBdKDE30ewPS6Ugn?productVariantID=itEzQN5gKZX8gXMmLTEXAB

本記事では初めて出展するまでの話を書きます。

# 参加までの背景
社内の定期輪読会にて技術書を読み、意見交換をしていく中で、技術書を書く側も面白そうと感じていました。また技術書典に参加経験がなく、いつか経験してみたいと考えていました。

そんな時エンジニア仲間が技術書典参加メンバーを募集しており、参加を決意しました。結果として、別々の企業に所属する4人のGoエンジニアが集まり、約半年にわたるプロジェクトが始まりました。

# 頒布までに大事にした点
企画~出展までのストーリーは共著者の@hiroaki-u さんの記事にまとまっているため、自分は書籍を執筆する中で大事にした点を書きます。

https://qiita.com/hiroaki-u/items/b85

元記事を表示

【Go言語】簡単なウェブアプリケーションの作成

Goで作成されたアプリケーションは配布が容易で、特にコマンドラインツールの実装に優れているが、ウェブアプリケーションの作成にも適している。

## 基礎的なウェブサービス

`http://localhost:8080/hello`にアクセスすると`Hello, World`を返すウェブアプリを作成する

### サンプル
“`go
package main

import (
“fmt”
“io”
“net/http”
“os”

“github.com/rs/zerolog/log”
)

func main() {
// URLごとの処理を登録
http.HandleFunc(“/hello”, func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, “Hello, World”)
log.Info().Msg(“receive hello world request”)
})

// サーバーの起動を画面に表示
fmt.Println(“Start listening at :80

元記事を表示

OTHERカテゴリの最新記事