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

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

【Go】math/randとcrypto/randの使い分けについて

# はじめに
こんにちは、kenです。お仕事ではGoを書いています。
最近「もう一段Goと仲良くなりたいなー」と思い、[Go Code Review Comments](https://go.dev/wiki/CodeReviewComments)というサイトを読んでいたところ、`math/rand`と`crypto/rand`の関係について初めて知ったことがあったので、今回はそれについて書こうと思います。
今まではどちらも乱数を生成するライブラリという認識でしたが、両者には明確な違いが存在していました。

# math/randとcrypto/rand
私が勉強になったGo Code Review Commentsの[Crypto Rand](https://go.dev/wiki/CodeReviewComments#crypto-rand)の節を引用します。
> Do not use package math/rand to generate keys, even throwaway ones. Unseeded, the generator is completely pred

元記事を表示

【Go】型が特定のinterfaceを満たしているかをコンパイル時に確認させる方法

# はじめに
こんにちは、kenです。お仕事ではGoを使っています。
先日、[Effective Go](https://go.dev/doc/effective_go)(Goの公式が出している慣用的なコーディングスタイルと実践を記したドキュメント)を読んでいたら[興味深いこと](https://go.dev/doc/effective_go#blank_implements)が書かれていたので今日はそれについて書こうと思います。

内容は「**型が特定のinterfaceを満たしているかをコンパイル時に確認させる方法について**」です。
# Goのinterfaceについておさらい
本題に入る前にGoのinterfaceについてざっくり説明しておきます。interfaceについてもう知っているよという方はスキップしてください。

Go言語ではinterfaceをメソッドシグネチャの集合として定義します。
“`go
type hogeIF interface {
Method1()
Method2()

MethodN()
}
“`
そして型がinterfaceを実

元記事を表示

【Go】マップへの値追加時に発生する「panic: assignment to entry in nil map」

## はじめに

Go言語でキーがint型、バリューがbool型のマップを作成したいです。初期化時は空で生成し、値は後から追加していきます。

初期化して値を追加したらエラーになりました。

“`go
var m map[int]bool
m[1] = true
“`

“`bash
# エラー
panic: assignment to entry in nil map
# 日本語訳「パニック: nil マップのエントリへの代入」
“`

## 原因:マップが初期化されていない

`var m map[int]bool`で初期化したつもりでしたが、これは**宣言しただけ**でまだ初期化されていません。
なのでmはnilの状態です。nilのマップに値を追加しようとすると上記のようなエラーになります。

“`go
var m map[int]bool
fmt.Println(m == nil) // true
“`

## 対策:マップを正しく初期化する

初期化方法は3種類あります。

### 方法1:make関数を利用

“`go
m := make(map[int]

元記事を表示

Azure Function + Go でハマった話

タイトル通りの備忘録です。チュートリアルは以下に存在していますがちょっとだけハマったのでメモ代わりに残しておきます。

[Visual Studio Code を使用して Go または Rust の関数を作成する – Azure Functions | Microsoft Learn](https://learn.microsoft.com/ja-jp/azure/azure-functions/create-first-function-vs-code-other?tabs=go%2Clinux)

## functions の作成

VSCode からでも、`func`コマンドでも可能なのでサクットつくります。

`func` コマンドなら以下のような感じです。

“`sh
func init –worker-runtime custom –template HttpTrigger –name HelloFunction –authlevel anonymous
func new –language custom –template HttpTrigger –n

元記事を表示

【Go】int型の10進数のリテラル同士のビット演算

## 前置き

最近 [Go 1.22](https://tip.golang.org/doc/go1.22) がリリースされたのでこの機会にリリース内容を理解したいとチャレンジしており、言語の変更の中に「for」ループのバグに対する修正がありました。

詳細は、[Go Wiki: LoopvarExperiment](https://tip.golang.org/wiki/LoopvarExperiment)に記載されています。上から読んでいて、次のようなループの例が登場しました。

“`go
func TestAllEvenBuggy(t *testing.T) {
testCases := []int{1, 2, 4, 6}
for _, v := range testCases {
t.Run(“sub”, func(t *testing.T) {
t.Parallel()
if v&1 != 0 {
t.Fa

元記事を表示

高速UTF-8バリデーションを通してビット演算を学ぶ

## はじめに
こんにちは。前回は文字列から浮動小数点数への変換を高速化する話を書きました。その中で、もっと文字列を読む部分も高速化できないかと思い複数バイトを一度に操作する方法について色々実験してみたところ想像以上に面白かったので作ったものなど紹介したいと思います。
## 目指すもの・目指さないもの
今回はGo言語の標準ライブラリである`utf8.Valid`を高速化することを目標にして進めていきます。この関数は、与えられたバイト配列が正しくUTF-8の符号化に従えているかを確認するものです。もちろん、この内容を過去に研究した人もおり、有名どころで言うと[Daniel Lemireさんの論文](https://arxiv.org/abs/2010.03090)などがありますが、今回はこの論文に紹介されていた方法とは違い[SIMD](https://en.wikipedia.org/wiki/Single_instruction,_multiple_data)を**使わない**ことにします。

理由はそれぞれのプラットフォームへの対応が簡単になることが大きく、コードを統一できたり、メン

元記事を表示

[Go]環境変数 まとめ

実務のプロダクションコードで、普段意識してなかった環境変数周りの処理を追ったときに前提知識が不足しすぎてて、とても苦労したのでまとめておく

# osパッケージ利用

“`sample.go
package main

import (
“fmt”
“os”
)

func main() {
// 環境変数のセット
os.Setenv(“APP_ENV”, “prod”)

// 環境変数の取得
appEnv := os.Getenv(“APP_ENV”)
fmt.Printf(“appEnv: %v\n”, appEnv)
}
“`
[PlayGround](https://go.dev/play/p/yLn4t9hNPgx)

# [envconfig](https://github.com/kelseyhightower/envconfig)パッケージ利用
「環境変数名を列挙した構造体を渡すことで、各フィールドに環境変数を一気に読み込む」
機能を提供してくれるパッケージ。2024/03/27時点で、Star4.9kと人気がある。
READMEに記述されている内

元記事を表示

既にGo言語がインストール済みの場合に新しいバージョンに切り替える

Go言語のv1.22がリリースされたので試したいとなったときに、自身の環境には既にGo言語のv1.20がインストールされていました。

どうやって新しいバージョンをインストールして切り替えればよいのか分からなかったので調べた所、〇〇env系のツールを使わずともできることを知りました。今回は、[Goの公式ドキュメント](https://go.dev/doc/manage-install)の方法で切り替えました。

## 新バージョンのインストール

バージョン番号は [All releases](https://go.dev/dl/) を参考に今回は `1.22.1` をインストールします。

“`bash
$ go install golang.org/dl/go1.22.1@latest
“`

`GOPATH` 配下にソースがインストールされます。`GOPATH` の場所は `go env GOPATH` で確認できます。

次に `download` コマンドを実行すると、`~/sdk` 以下に指定したバージョンのGoがインストールされます。

“`bash
$ go1.2

元記事を表示

Golangで環境変数を使用してFirebaseを初期化する。

# Golangで環境変数を使用してFirebaseを初期化する。
Firebase Adimin SDKをJSONファイルを使用せず、環境変数を使用して、初期化する。
## 環境変数を使用したい理由
### 公式ドキュメントの内容
“`go
import (
“fmt”
“context”

firebase “firebase.google.com/go”
“firebase.google.com/go/auth”

“google.golang.org/api/option”
)

opt := option.WithCredentialsFile(“path/to/serviceAccountKey.json”)
app, err := firebase.NewApp(context.Background(), nil, opt)
if err != nil {
return nil, fmt.Errorf(“error initializing app: %v”, err)
}
“`
### 理由
`serviceAccountKey.json`フ

元記事を表示

Go 値を処理する例

## はじめに
GoでMapやスライスを使用した例を色々つらつら記載しただけです。
Chatgptに確認した結果をほぼそのまま乗せています。
整理が間に合わないですが、結果はコードの次に載せていますので、いまいち型定義ができない、スライス、Mapの使用が慣れていないので、それでも例が欲しい場合用です。

## 型と変数

空の整数型スライスを宣言
[]int{}

“`go
var mySlice []int // これはnilスライスを宣言していますが、まだ初期化されていません。
mySlice = []int{} // これで空のスライスが初期化されます。
“`

直接空のスライスを初期化
“`go
mySlice := []int{} // 空のintスライスを作成しています。
“`
・:=は型と値を一度にセットする
Go言語において、`:=`演算子は、変数の宣言と同時にその変数に値を割り当てる「短い変数宣言(short variable declaration)」を行います。この演算子を使用することで、変数の型を明示的に指定する必要がなくなります。代わりに、割り当てられ

元記事を表示

ユニクロのUTでGoコードが書かれているTシャツ買ってみた🐉

## はじめに

2024年初投稿です!よろしくお願いします!

## 何を買ったか?

これです!

https://www.uniqlo.com/jp/ja/products/E459561-000/00?colorDisplayCode=09&sizeDisplayCode=004

かなり前から気になっていて、もうないんだろうなと思っていたのですが
最近また見てみたら、あったので購入しました!

サイズは、XLで部屋着にします。
リモートも多いのでちょうど良い!

まだ、寒いですが

## 解読

Googleレンズを使用して、Tシャツを読み取りました。

“`go
package main; import ( “fmt”; “html”; “10 “net/http”; “strconv”; “strings”; “time” trolMessage struct { Target string; Count func main() { controlChannel := make(chan sage); workerCompleteChan := make(chan bo

元記事を表示

gRPCを用いた使用例

## はじめに
gRPCを用いたエンドポイントとリクエスト、レスポンスデータのセットの備忘記録です。
例えばSample/GetDataというエンドポイントを通じてクライアントからのリクエストを受け取り、適切なレスポンスを返すプロセスを実装例を記載します。

## 環境構築
以下を参考に環境を作りました。(非常に簡易に作れる)

https://qiita.com/totoaoao/items/6bf533b6d2164b74ac09

## 今回試すファイルを修正と対応
ファイル構成
“`
.
├── client
│   └── main.go
├── go.mod
├── go.sum
├── grpc_sample
│   ├── sample.pb.go
│   └── sample_grpc.pb.go
├── proto
│   └── sample.proto
└── server
└── main.go
“`

proto/sample.goを以下のように記載
“`proto
syntax = “proto3”;
package sample;

opt

元記事を表示

モノリスだけどマイクロサービス??Service Weaver 使ってみる

# はじめに

Google が、この 3月にオープンソースとして公開した Service Weaver というフレームワークを公開しました。

https://serviceweaver.dev/

簡単に紹介すると、
“モノリスなアーキテクチャーのようにコードを書くだけで、マイクロサービスとしてデプロイ可能なアプリを書くためのフレームワーク”
です。

「は?何を言っているの?」でしょうし、字面をなんとなく理解できたとしても、「そんな魔法のような話がある訳ないでしょ?」だと思います。

今回は、「あぁ、こういうことか!便利だな!」と感じられるように、実際に手を動かして、実際の動きを見てみたいと思います。

# 前提

OS への依存は、特には無いとは思いますが、Ubuntu 22.04 LTS を利用しています。

“`bash
$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=22.04
DISTR

元記事を表示

GoとWebsocketでリアルタイムチャットサービスを作成しRenderへデプロイしてみた

# はじめに

 どうも、Shakkuです。
 都内某高専情報科の3年生です。(2024/3/24時点)

 Websocketを使って何か作りたいな〜とずっと思っていつつ、「javascript全くわからん!」でずっと触れていなかったので、さらっとjsのお勉強して今回リアルタイムに会話ができるチャットサービスを作ってみました。

また、作ったプログラムをデプロイするという体験もしてみたかったので、[Render](https://render.com/)というサービス内でサーバーとPostgreSQLをお借りして、プログラムをデプロイ&公開してみました。

 作成したものは、GitHubにもあげています。(https://github.com/Shakkuuu/websocket-chat-go)

 どんなコードかだけ見たい方は上のGitHubから。
 ざっくりとした構成や使用技術の概要も見たい方は、下の「概要」「参考画面」「使用技術」「構成」などを。
 プログラムの中身の説明も見たい方は、最後まで読んでいただければと思います。

 いつものごとく、プログラムの説明は自身の振り返り

元記事を表示

AtCoder Unit Test が新しくなりました!

AtCoder の問題ページからユニットテストを生成するブラウザ拡張機能 “AtCoder Unit Test” を大幅リニューアル!便利な新機能をいろいろ実装しました!

* **テストコードのテンプレートが編集できるようになりました。**
* **テストコードの生成方法が変更になりました。**
* Go, Ruby のテストコードを生成できるようになりました。
* (Python, Ruby) テストコードを含んだまま提出できるようになりました。 ([例](https://atcoder.jp/contests/abc341/submissions/51385551))
* (Java, Kotlin) テストライブラリが JUnit5 に変更になりました。

ダウンロードは ↓ から。ぜひご利用ください!!!

* [AtCoder Unit Test – Chrome ウェブストア](https://chromewebstore.google.com/detail/atcoder-unit-test/lmahhninbclefepjbcdfbcjnancipfmi?hl=j

元記事を表示

画像の動的リサイズ方法を検討した

# 結論

https://www.libvips.org/

速度・省リソースの観点ではこれが良い。

# 背景

10年もののシステムを運用しています。
画像を扱うサービスなのですが、画像ファイルが相当数になって、ファイルサイズの合計が peta byte にとどこうとしています。
ここまでくると、Storageの費用がかなり目立ちます。

画像の表示速度が遅くなることはビジネス要件として許容しにくく、ストレージを低速なものに変えにくいです。

一番量が多い画像の種別は大きさ違いで同じものを扱っている画像でした。
(メインのドメインの画像を大きさごとに物理的に3種類)

なので、
その種別の画像は1枚のみ管理して他の大きさの画像を削除して1種類のみ管理することで、ストレージのディスクサイズを減らすことで費用削減効果が期待できました。
(細かい話は割愛)

1種類のみ管理するために他の大きさの画像は動的に生成することでそれが実現できます。
(他にも色々対策ありそうですが、細かい話は割愛)

つまり、
画像の大きさを動的に生成する必要がありました。

動的リサイズ: https://e

元記事を表示

ent. の使い方についてかんたんにまとめてみた

# はじめに

APIサーバを作成するにあたって、「`ent.`がモダンで使いやすそうだな」と思い学習した内容を書いていきます。

[Quick Introduction](https://entgo.io/ja/docs/getting-started/)から、極力コードを省いた、`ent.`の使用フローについて、`Atlas`によるマイグレーションついてわからなかったことを書きました。

# 使い方の流れ

1. Goモジュールの作成
2. スキーマの作成・定義
3. アセットの生成
4. スキーマのマイグレーション

## Goモジュールの作成

“`bash
go mod init example
“`

## スキーマの作成・定義

以下のコマンドで、Userスキーマを自動生成できる。

複数生成する場合も、引数を追加することで可能。

“`bash
go run -mod=mod entgo.io/ent/cmd/ent new User
“`

`entdemo/ent/schema/` 配下に `user.go` ファイルが作成される。

内部の`User.Fi

元記事を表示

Goにおける「俺的」クリーンアーキテクチャ構成

# はじめに
こんにちは、mizukoです!

親の顔より見たGoのクリーンアーキテクチャ構成について、自分はこうしているよ!というのをアウトプットしていきます!
Goのディレクトリ構成に悩んでいる人の参考になりましたら幸いです!

# 構成
まず全体像です。

“`
.
├── .devcontainer
├── .env
├── .gitignore
├── Makefile
├── compose.yml
├── config
│   ├── config.go
├── docker
│   ├── golang
│   │   └── Dockerfile
│   └── postgres
│   ├── Dockerfile
│   └── pg_hba.conf
├── domain
│   ├── model
│   │   ├── category.go
│   │   ├── memo.go
│   │   └── user.go
│   └── repository
│   ├── category
│   │   └── cate

元記事を表示

【OpenSSL】localhost を https 化する 自己証明書の作成方法

自己証明書(通称オレオレ証明書)の作成方法です :smiley:

## 1. CA用の秘密鍵を生成
このコマンドは、2048ビットのRSA秘密鍵を生成し、`localCA.key` というファイルに保存します。

“`bash
$ openssl genrsa -out localCA.key 2048
“`
– openssl genrsa: RSA 秘密鍵を生成するコマンド
– -out: 生成した秘密鍵の出力ファイル名 (例: localCA.key)
– 2048: 秘密鍵の長さ (ビット単位) (例: 2048ビット)

## 2. 秘密鍵と識別情報から証明書署名要求 (CSR) の作成
このコマンドは、以下の情報を設定した CSR を生成し、`localCA.csr` というファイルに保存します。

“`bash
$ openssl req -batch -new -key localCA.key -out localCA.csr \
-subj “/C=jp/ST=Osaka/L=Osaka-shi/O=\”Example Inc\”/OU=Foo/CN=

元記事を表示

反省会~その①

プログラミングをして、ハイ終わり。
では勿体ないと思っています。
学校の勉強同様、何が間違ったのか、何で間違ったのか検証しようと思います。


お題はこちら。

https://qiita.com/NothingMyself37/items/27b87c6e2b9e88055673

> – importするのは1つだけだから、()で括らなくて良い
> – 1日24時間を定義していない
> – 定数と変数の違いを、きちんと理解して使い分けしていない
> – 単位を表示させていない
> – 当然ながら、計算式が合っていないので不正解

では、1つずつ検証していきましょう。

> – importするのは1つだけだから、()で括らなくて良い

こちらについては、初めてコメントを頂きました。
ありがとうございます。

“`
その通りではあるんですが、常にカッコを付けるのは今後インポート対象が増えるときに出る差分が少ないというメリットはあるので一長一短かなと思います。
“`

言われて、たしかに、と思いました。
模範解答=絶対解ではない、ということを教えてくださり

元記事を表示

OTHERカテゴリの最新記事