Go関連のことを調べてみた2023年02月15日

Go関連のことを調べてみた2023年02月15日

GolandのWSL環境利用によるデバッグ

**やりたいこと**
WindowsにインストールされているGoland(jetbrains製IDE)でWSL環境を利用してデバッグする。
⇒Linux環境でないと動かない場合に便利

**Windows環境でテスト**
都合によりWindows環境では失敗…
![222.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3114591/c761f24c-5e81-8293-cd1d-61b6bde9eae4.png)

**WSL2(ubuntu20.04)環境でテスト**
「実行構成の編集」選択
![111.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3114591/dcedc79e-c77f-dd9d-aa14-c278c735d685.png)

実行場所:「WSL」選択
![333-be.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com

元記事を表示

ハンズオン Linuxのしくみ

Linuxから目を背け続けていたのですが、お仕事で必要になったってしまったので、
うさぎのアイコンの方が著者の ”Linuxのしくみ” を試して理解しようと思います。

# 環境
作業用のメインPCのTeratermから、ミニPCのUbuntuにアクセスします。
・ミニPC: 8GB DDR, 128G SSD, Intel N5095
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2311625/b74b80f4-2ae8-74cb-7f56-d8006a347444.png)

詳細手順は下記。
https://qiita.com/nekokane/items/610294ce18e9

元記事を表示

【競プロ】Goで配列をstringで出力したいとき

## 概要

Goで競プロをしている際、配列を文字列として出力したいときがありました。
e.g.
NG: `[“a”,”b”,”c”]`
OK: `a b c`

## 本題

[yoshi389111](https://qiita.com/yoshi389111) さんからより良い方法を[コメント](https://qiita.com/akima1001/items/aae97136aaf508c1c255#comment-d4ae84b7eea374d9d8e7)にて教えていただきました!

> “`strings.Join()“`を使った方が良いのではないでしょうか?

まさしくそのとおりでした!
Goにもjoinはそりゃあるよね…

https://pkg.go.dev/strings#Join

“`
s := strings.Join(arr, ” “)
“`

旧記載内容

配列のまま文字列として出力後、[]を取り除く。

“`
s := fmt.Sprintf(“%v “, arr)
s = str

元記事を表示

Golang初心者向け!mapの基礎から応用

## はじめに

Go言語のMapは、非常に便利なデータ構造であり、多くのアプリケーションに使われることがあります。この記事では、GolangのMapの基礎的な使い方と応用をまとめます。

## Mapの基礎的な使い方

Mapを使うには、最初に `make()` 関数を使って新しいMapを作成する必要があります。新しいMapは以下のように作成できます。

“`
//make(map[key名]value)の型名
intMap := make(map[string]int) //valueがint型
stringMap := make(map[string]string) //valueがstring型

“`

Mapの要素を追加するには、`[key] = value` の形式を使用します。以下のように追加することができます。

“`
m[“foo”] = 10
“`

Mapから値を取得するには、`[key]` の形式を使用します。以下のように取得することができます。

“`
value := m[“foo”]
“`

## Mapのネスト

Mapを使うと、複雑なデー

元記事を表示

【個人開発】LINEでURLを送るとNotionに保存してくれるLINEBot「記事のストックくん」を作りました。

stock_title.png

**「この記事、後で読み返したい!」**
そんなとき、みなさんどうしてますか?

僕ははてぶやTwitter、Podcastをよく使うのですが
「今じっくり読める状態じゃないから、とりあえず保存しておきたい!」みたいなことが結構あります。

いや、ありました。このLINEBotを作るまでは…

今回は **「LINEBot 〇〇くん」第二弾「記事のストックくん」** のご紹介です。

>↓第一弾はこちら
【個人開発】ごみのお知らせをしてくれるLINEBot「ごみのお知らせくん」を作りました。
[https://qiita.com/wallkickers/items/7bf00de66f802503f957](https://qiita.com/wallkickers/items/7

元記事を表示

Go で Azure Storage Blobを扱うときの覚え書き

# Go で Azure Storage Blobを扱うときの覚え書き

azblobに関する、備忘録代わりの記事です。(古い記事やパッケージなどが検索に紛れてきてしまうので)

SDKのリポジトリは以下にあります。執筆時点で v1.0.0 が最新です(ちょうど執筆前にリリースされたようです) 以前のバージョン(v0.5 とか v0.6)を使っている人はアップデートするとよいでしょう。

– https://github.com/Azure/azure-sdk-for-go/tree/main/sdk/storage/azblob#readme
– https://github.com/Azure/azure-sdk-for-go/releases/tag/sdk%2Fstorage%2Fazblob%2Fv1.0.0

パッケージは以下にあります。
– https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob

`azblob`と検索すると、古いバージョンが先にヒットしてしまう場合がありあますが、理

元記事を表示

OpenAIのAPIで自然言語(日本語)を使ってDBに問い合わせるCLIツールを作ってみた

## 概要

ChatGPTで話題になっているOpenAIが提供しているAPIを使って、自然言語(日本語)でデータベースに問い合わせすることができる[CLIツール](https://github.com/dotneet/natuql)を作成してみました。Go言語で実装しています。記事内で使い方と仕組みの説明をします。

https://github.com/dotneet/natuql

## 動機

ChatGPTがデータベースを理解することに驚いたことや、[gpt-index](https://github.com/jerryjliu/gpt_index) の仕組みなどを調べていて、自然言語でのDB問い合わせは比較的簡単に実現できそうで未来的な面白さを感じたので実験的に実装してみました。自然言語を使ってSQLクエリを発行できれば、SQLを書けない人でも柔軟にDBから情報を取得できるようになります。非エンジニアが分析を行うときのハードルを相当下げることができます。おそらく似たものは既に存在するのだと思いますが、ノンガチ勢でもこういったものが簡単に作れる時代になったのは本当に素晴らしい

元記事を表示

【Go】ハードコードしているSQLをバイナリに埋め込んですっきりさせよう

## はじめに

Goを書いていて、実行するSQLをハードコードしていることはないでしょうか

例えば、短いSQLだとこんなかんじ

https://pkg.go.dev/database/sql#example-DB.QueryContext

“`go
age := 27
rows, err := db.QueryContext(ctx, “SELECT name FROM users WHERE age=?”, age)
if err != nil {
log.Fatal(err)
}
“`

この例であれば、構文ミスがあっても実行前に気づくこともあるでしょう

ただ、次のように複数行にわたってSQLを書いてしまうこともあるのではないでしょうか

“`go
sqls := []string{
`UPDATE employees
SET salary = 5000;
`,
`UPDATE employees
SET salary = salary * 1.1
WHERE salary <= 10000; `, `UPDATE e

元記事を表示

GoでCLIを実行後にターミナルを閉じる

## やりたいこと

“`main.go
import “fmt”

func main() {
fmt.Println(“hello world.”)
fmt.Println(“Bye bye~”)
}
“`

上記ファイルを`go build`してできたCLIを実行すると、コマンド実行後はこのように表示される。

“`
hello world.
Bye bye~
logout

Saving session…
…copying shared history…
…saving history…truncating history files…
…completed.

[プロセスが完了しました]
“`

このCLIを実行後にターミナルウィンドウを閉じたい。

## やり方
この挙動はMac自体のターミナル設定によるもので、コマンドで指定はできない。

ターミナル > 設定 と進み
もう怖くない!Goのポインタを理解しよう!

## はじめに
僕がGoを触っていてまず最初に躓いたのがポインタでした。
「なんか値が上手く変わんない?」「あれ、今回って`&`だっけ?それとも`*`だっけ?」「ん?なんかsliceが変な挙動を示す?」
気づいたら色々な壁にぶつかって、ポインタはよく分からないしなんか怖いものと思っていました。
Goを初めて学ぶ人でそう思う人は僕以外にもいるはず!笑

ということで今回はそんな恐怖とおさらばしようという記事です!
Goのポインタで苦しんでる方、一緒にポインタを理解していきましょう!

**目次**
– [そもそもポインタって何?](#そもそもポインタって何)
– [関数とポインタ](#関数とポインタ)
– [sliceとポインタ](#sliceとポインタ)
– [sliceの構造](#sliceの構造)
– [append時のslice](#append時のslice)
– [mapとポインタ](#mapとポインタ)
– [おわりに](#おわりに)
– [参考文献](#参考文献)

## そもそもポインタって何?
[A tour of Go](https://go.dev/tou

元記事を表示

Go言語で最速のJSONデコーダーを作った話

## はじめに

こんにちは。Sugawara Yuutaです。今回は高校の休み時間に考え、空いた時間で作ったJSONデコーダーについて紹介したいと思います。
知ってる限りでは、汎用型受け入れ型をとっているデコーダー(つまり、標準パッケージと同じスタイルという意味です)の中では最速です。

## モチベーション

Go言語で開発を始めて、(Go言語のコミュニティーのスタイルがJavaScriptなどと比べるとなんでも標準ライブラリでやってしまうようなのにも関わらず)サードパーティー製のJSONデコーダーが多く作られていることに驚きました。

しかし、大規模なものから小規模なものまで試してみて、それぞれが必ずしも共通しているとは限らない、たくさんの問題を持っていることに気づきました。それについては下のセクションで詳しく取り上げます。

## 今までのJSONデコーダーが持つ問題

具体的なライブラリの名前は出さないでおきます。

– CPU依存(アセンブリを使ったりして、速くなる可能性を得る代わりにamd64以外が対応されなくなったりします。例えばM1やRaspberry Piはarm6

元記事を表示

GCP, Cloud RunでgRPCのサービスを動かす & サービスアカウントによりアクセス制御する

# はじめに
Cloud RunでgPRCのサービスを動作させます。
かつ、サービスアカウントによるアクセス制御をほどこします。

# 構成と検証ステップ

下図のようなフロント/バックともにCloud Runの構成とします。
フロントはHTTPS、バックはgRPCでリクエストを受け付けます。

![figure.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1950110/176ca430-8671-bba1-00d4-559e3a15b392.png)

フロント、バックの機能は以下のとおりです。

| コンポーネント | 機能 |
|-|-|
| バック | ランダムな緯度、経度の組み合わせを返す |
| フロント | 上の緯度、経度を中心とした地図を表示する (Google Maps使用) |

以下のステップで検証を進めていきます。

| ステップ | 構成 | フロントからバックへのアクセス可否 |
|-|-|-|
| 1 | フロント、バックともに認証不要 | OK |
| 2 | バッ

元記事を表示

[Go][備忘録] sliceをmake()する方法による挙動の違い

# はじめに

Go初心者です。
学習していて、今後つまずきそうと思ったのでメモしておきます。

# make()方法による挙動の違い

`make()`を使用してsliceを作成する場合、第2引数に`length`、第3引数に`capacity`を渡すようにしないと、`int`の初期値である`0`で埋められたsliceが作成されてしまう。

`make()`にsizeだけ渡す場合

“`go
package main

import “fmt”

func main() {
var s []int
s = make([]int, 5)

for i := 0; i < 5; i++ { s = append(s, i) fmt.Println(s) } fmt.Println(s) // -> [0 0 0 0 0 0 1 2 3 4]
}
“`

`make()`にsizeとcapcityどちらも渡す場合

“`diff_go
package main

import “fmt”

func main() {
var s []int
– s = m

元記事を表示

GoでSMTPを使用したメール二段階認証ページを作ってみた

# GoでSMTPを使用したメール二段階認証ページを作ってみた
Goでユーザー名/パスワード認証とワンタイムパスワードを使用した二段階認証を作ってみました。イメージをつかむためのテストとして作成したものでそのまま使用できるようなものではありませんが、ご参考になればと思います。

また、駆け出しなのでプログラムのミスや単語の誤用があるかと思いますので、コメントにてご指摘頂けると嬉しいです。

## 開発環境
* OS
* Microsoft Windows 10
* エディタ
* Visual Studio Code
* Go SDK
* go1.20 windows/amd64

## SMTPサーバーについて
SMTPサーバーは何でもよいのですが、試験的に使うものなのでGmailを利用しました。GmailのSMTPサーバー機能を使用する場合、以前は普段のログインと同じパスワードが使用できたのですが、現在はアプリパスワードを取得する必要があります。

アプリパスワードの取得方法は本筋から逸れる内容ですので割愛します。筆者は以下のサイトを参考にアプリパスワードを取得しました。

元記事を表示

Docker on WSL2でawesome-composeのnginx-golang-mysqlを立ち上げる

Dockerの勉強を兼ねていろんなサーバを構築して遊んでいるのですが、次のような素晴らしい(awesome!な)リポジトリがあったので、早速試しました。

https://github.com/docker/awesome-compose

基本的には好きなディレクトリに入って “` docker compose up -d “` するだけなのですが、自分の環境(WSL2)では少々詰まってしまったところがあったので、備忘録として残しておきます。

この記事では、アプリケーションサーバにGo、プロキシサーバ(Webサーバ)にNginx、データベースサーバにMySQLを使ったアーキテクチャ “` nginx-golang-mysql “` を立ち上げてみます。

### git clone & ディレクトリに入る
“`
$ git clone https://github.com/docker/awesome-compose.git
$ cd awesome-compose/nginx-golang-mysql/
“`

### docker compose実行
“` doc

元記事を表示

Asterisk AGIでGo言語を使う方法

# 1. AGIファイルを用意する

“`agi.go
package main

import (
“log”
)

func main() {
log.Println(“AGI TEST”)
}
“`

# 2. AGIファイルをビルドする

“`
# $ go build agi.go

$ ls
agi.go
agi
“`

# 3. extension.confでビルドしたバイナリを指定する
“`extensions.conf
same => n,AGI(agi)
“`

元記事を表示

CKADを駆け抜けろ!kubectl短縮コマンドを体に叩き込むツールを作った

# TL; DR

“`bash
# リソース名が長い!
$ k get replicasets
ERROR: too long! should be `kubectl get rs`

# オプション名が長い!
$ k get rs –namespace foo
ERROR: too long! should be `kubectl get rs -n foo`

# ヨシ!
$ k get rs -n foo
NAME DESIRED CURRENT READY AGE
nginx-76d6c9b8c 1 1 1 23h
“`

https://github.com/Syuparn/kuberta

# はじめに

CKADは、k8sを利用するアプリケーション開発者向けの試験です。

https://training.linuxfoundation.org/ja/certification/certified-kubernetes-application-developer-ckad/

元記事を表示

構造体の埋め込みを GORM で利用すると便利

## 構造体の埋め込み

“`go
type A struct{}

func (A) Execute() { println(“A”) }

type C struct { A }

func Test(t *testing.T) {
c := C{}
c.Execute()
}
“`

上記のコードは正しく動作します。
このように、構造体を別の構造体に埋め込むことを Struct Embedding と呼びます。

## GORM での利用

GORM では、構造体からテーブル名を得る際に、構造体の `TableName` メソッドが使われます。
たとえば次のコードを書いたとき、GORM は `a` というテーブル名を得ます。

“`go
type A struct{}

func (A) TableName() string { return “a” }
“`

Struct Embedding により、以下の `B` 構造体は、外から見ると `TableName` メソッドを持つかのように見えます。

“`go
type A struct{}
type B str

元記事を表示

DDDとは?GOとは?って状態からAPIのユニットテストをつくってみた

# テストコード

今回は[DDDとは?GOとは?って状態からAPIをつくってみた](https://qiita.com/tauemo/items/87e34c5a7d631236ab4d)で作ったプログラムにテストコードを作ってみます。

まず、テストコードはどこからどこまで作成するのか、と言うのが大きく意見が分かれてくるところです。
個人的にはテストコードを書くなら、徹底的に書く。書かないならまったく書かない。と言うのが好きです。

と言うのは、引き継いだプロジェクトで「テストコード書いててCI環境も構築してコミットしたらテストコードが走るようになってるから。」と言われて安心してたんだけど、テストコードは中途半端に実装されているだけで、当然バグとして発見されるべきものが発見されず、リリース後に気づくということが頻発したことがありました。
テストコードのおかげでバグを見つけられることもあり、捨てるのはもったいなく、メソッドに変更を加えるとテストコードの変更も加えないといけない、時間のある時にテストコードの漏れを補っていかないといけない。手動のテストもやらないといけない。と言う経験があ

元記事を表示

GOを使ってLaravelのSeederクラスを生成するプログラムを作った

最近、GOを学習しているのと、csvファイルのデータからLaravelのSeederを作成するタスクがあったので、Seederを作成するツールをGOを使って作ってみました。

## 作ったソース
ついでに、DBからデータを取得し、Seederを作成するプログラムも作りました。
使い方は、README.mdを参照してください。

https://github.com/murapon/generate_seeder_by_golang

## 参考にしたサイト
https://qiita.com/ikawaha/items/28186d965780fab5533d

https://chat.openai.com/chat
を使って、回答を得た。

スネークケースのファイル名をアッパーケースに変更する方法
![スクリーンショット 2023-02-08 17.59.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37929/358e0ba1-f95b-64c6-5903-526059b7780f.png)

元記事を表示

OTHERカテゴリの最新記事