- 1. Goのmapのキーの使用方法メモ
- 2. VS CodeでFailed to find the “go” binary in either GOROOT() or PATHエラー解決
- 3. Golangのパッケージレベル変数と関数レベル変数の違い
- 4. Go言語でブロックチェーンのシステムを作成する(その1)
- 5. [golang] 構造体のスライスを重複排除(with ソート)
- 6. Qiitaの最新記事を教えてくれるアレクサスキルを作ろう Alexa X Lambda X Golang
- 7. sqlcを使ってデータ作成と取得を行う方法
- 8. [Golang] VSCodeのGoプラグインを0.40.3 -> 0.41.xに更新したらブレークポイントデバッグができなくなった
- 9. 【Go】math/randとcrypto/randの使い分けについて
- 10. 【Go】型が特定のinterfaceを満たしているかをコンパイル時に確認させる方法
- 11. 【Go】マップへの値追加時に発生する「panic: assignment to entry in nil map」
- 12. Azure Function + Go でハマった話
- 13. 【Go】int型の10進数のリテラル同士のビット演算
- 14. 高速UTF-8バリデーションを通してビット演算を学ぶ
- 15. [Go]環境変数 まとめ
- 16. 既にGo言語がインストール済みの場合に新しいバージョンに切り替える
- 17. Golangで環境変数を使用してFirebaseを初期化する。
- 18. Go 値を処理する例
- 19. ユニクロのUTでGoコードが書かれているTシャツ買ってみた🐉
- 20. gRPCを用いた使用例
Goのmapのキーの使用方法メモ
## 内容
Go言語のmapのキーの使用方法の確認## mapの特徴
`map`はGo言語における非常に便利なデータ構造の一つで、他のプログラミング言語では辞書(Dictionary)、連想配列(Associative Array)、ハッシュ(Hash)などと呼ばれることがあります。`map`はキーと値のペアを格納するためのコレクションです。キーは一意でなければならず、各キーは一つの値にマッピングされます。これにより、キーを使用して迅速に値を検索、挿入、または削除することができます。### mapのメリット
– **高速な検索**: `map`の主なメリットは、キーに基づくデータの検索が非常に高速であることです。キーを使用して値を直接参照できるため、大量のデータの中からも迅速に特定の要素を見つけ出すことが可能です。
– **柔軟性**: 任意の型のキーと値のペアを保存できるため(ただし、キーは比較可能でなければならない)、様々な種類のデータを扱うことができます。
– **簡単なデータ操作**: `map`は値の追加、更新、削除が簡単にでき、これらの操作も高速に行えます。#
VS CodeでFailed to find the “go” binary in either GOROOT() or PATHエラー解決
## はじめに
MacでGoの環境構築時のメモです## 解決方法
Homebrew等でGoをインストールして, PATHが追加してあることを確認します.
VS Codeを一度終了させます.
VS Codeをターミナルから直接起動することで、ターミナルの環境変数を引き継ぐことができます。ターミナルで以下のコマンドを実行してVS Codeを起動してみてください。
“`sh
open -a “Visual Studio Code”
“`これで、タイトルにあるエラーが解決できました.
—
Go言語を始める際の参考になれば幸いです。
Golangのパッケージレベル変数と関数レベル変数の違い
Golangでは、パッケージレベル変数と関数レベル変数は異なるスコープと目的を持ちます。
### パッケージレベル変数:
– スコープ:
パッケージレベル変数は関数の外、つまり関数の中ではなく、通常はGoソースファイルの一番上に宣言されます。
同じパッケージ内のすべての関数からアクセスできます。
パッケージがインポートされるときに初期化されます。– 初期化:
パッケージがロードされるときに初期化され、パッケージ内の関数が呼び出される前に初期化されます。
明示的な初期化が必要です。初期化されていない場合、ゼロ値が割り当てられます。– 使用法:
パッケージ全体で共有されるデータや設定などの値を保持するために使用されます。
同じパッケージ内の異なる関数間でデータを共有するのに役立ちます。### 関数レベル変数:
– スコープ:
関数レベル変数は関数内で宣言され、その関数内でのみアクセス可能です。
他の関数からはアクセスできません。
– 初期化:関数が呼び出されるたびに初期化されます。
初期化はオプションですが、初期化されていない場合、ゼロ値が割り当てられます。
Go言語でブロックチェーンのシステムを作成する(その1)
# はじめに
Go言語を使用して、ブロックチェーンのシステムを作成していきます。
今回は、ブロックチェーンについて簡単にまとめていきます。# ブロックチェーンとは
ブロックチェーンは、デジタルデータの取引を記録する技術であり、特に暗号通貨の世界で注目を集めています。この技術は分散型台帳技術(DLT)とも呼ばれ、取引データを複数のコンピュータにまたがって保存し、管理する方法です。## ブロックチェーンの主な構成要素
1. ブロック:データ(取引記録)、前のブロックへの参照(前のブロックのハッシュ値)、およびその他の情報(タイムスタンプ、自身のハッシュ値など)を含みます。
2. チェーン:各ブロックが前のブロックと連結して形成する、途切れることのない連続したリスト。
3. ノード:ブロックチェーンネットワークに参加する個々のコンピュータ。ノードは取引を検証し、ブロックを生成し、ブロックチェーンのコピーを保持します。## ブロックチェーンの構造
ブロックチェーンは名前の通り、「ブロック」と呼ばれるデータの集合体が「チェーン」のように連なって構成されています。各ブロックには、複数の
[golang] 構造体のスライスを重複排除(with ソート)
参考: https://future-architect.github.io/articles/20230816a/
この方法だと、重複排除するには事前にソートしないとダメらしいhttps://go.dev/play/p/cATqCg40qdY
例)
SQLでいう
“`SQL
select distinct *
order by classNumber, name, age
“`
をgoの構造体のスライスで、やる。“`go
package mainimport (
“cmp”
“fmt”
“slices”
)type user struct {
classNumber uint8
name string
age uint8
}func main() {
users := []user{
{classNumber: 2, name: “hanako”, age: 12},
{classNumber: 3, name: “jiro”, age: 32},
{classNumber: 2, name: “h
Qiitaの最新記事を教えてくれるアレクサスキルを作ろう Alexa X Lambda X Golang
# 1.はじめに
## 1.1目的
golangと、lambdaを使ってアレクサスキルと作りたくなったのでやってみる。## 1.2環境
Windows(GitBash)
Go Version 1.22.0## 1.3前提条件
– Amazon 開発者アカウントの作成を事前に行う。下記リンクより、Amazon開発者アカウントの作成を元に準備してくださいhttps://developer.amazon.com/en-US/blogs/alexa/post/31c9fd71-f34f-49fc-901f-d74f4f20e28d/alexatraining-firstskil.html
– 事前に[AWSアカウント](https://aws.amazon.com/jp/register-flow/)の作成を行ってください
– [AWSCLI](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/getting-started-install.html)が使える状態にする# 2.Golangでソースを書き、La
sqlcを使ってデータ作成と取得を行う方法
Go の ORM ツールの一つである sqlc を使用する機会があったので、sqlc を使って、簡単なデータ取得のコードを記述するところまでを書き留めていきます。
# バージョン
Mac で下記バージョンにて動作確認を行なっています。| 対象 | バージョン |
| ———- | ———- |
| PostgreSQL | 14 |
| Go | 1.21.1 |
| sqlc | 1.23.0 |# sqlc とは
sqlc とは Go の ORM の一つです。
ORM とは、Object-Relational Mapping(オブジェクト関係マッピング)のことで、オブジェクトと RDB(Relational Database)のマッピングを行うものとなります。
ORMを使用することで、SQL を直接書くことなく、オブジェクトのメソッドで DB を操作することができます。# sqlc の初期設定
データベース操作を行う事前準備として、 sqlcの初期設定を行います。
#
[Golang] VSCodeのGoプラグインを0.40.3 -> 0.41.xに更新したらブレークポイントデバッグができなくなった
# 環境
* golangで開発したAPIサーバーをDockerコンテナとして稼働させており、その中にデバッガdelveをインストールしてある。
* delveとのデバッグ用通信ポート2345をローカル(Mac)側に外出ししてある。
* Dockerコンテナ内のアプリケーションディレクトリは `/app`。
* VSCodeでブレークポイントデバッグするときは、Devcontainerでコンテナの中に入ったりはせず、ローカルから直接2345ポートに接続してデバッグしている。
“`docker-compose.yml
services:
app:
container_name: app
…
ports:
– 2345:2345
– 8080:8080
…
“`↓ VSCodeでブレークポイントデバッグを実行するための設定。
“`launch.json
{
“version”: “0.2.0”,
“configurations”: [
{
“nam
【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 mainimport (
“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