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

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

Go言語のテストケースの一覧性を高める

Goのテーブル駆動テストは、記述を工夫することで一覧性を高めることができます。

[strings.SplitN](https://pkg.go.dev/strings#SplitN)関数のテストを例に説明します。
# 通常の実装
シンプルなので読みにくくはないですが、行数の割に情報量が少なく全体を把握するにはスクロールが必要です。
“`golang
func TestSplitN_A(t *testing.T) {
type args struct {
s string
sep string
n int
}
tests := []struct {
name string
args args
want []string
}{
{
name: “-1”,
args: args{
“A,B,C,D”,
“,”,
-1,
},
want: []string{“A”, “B”, “C”, “D”},
},
{
name: “0”,
args: args{
“A,B,C,D”

元記事を表示

Go言語でスクレイピングのしかた

## はじめに

Go言語でのスクレイピングについて、基本的な手順と使用するツールを説明します。

## 必要なパッケージのインストール

Go言語でウェブスクレイピングを行うには、HTMLを解析するためのパッケージが必要となります。ここでは、`goquery`というパッケージを使用します。`goquery`はjQueryのような構文でHTMLの解析を行うことができるため、非常に使いやすいです。

ターミナルで以下のコマンドを実行して`goquery`をインストールします。

“`bash
go get github.com/PuerkitoBio/goquery
“`

## スクレイピングの基本的な手順

1. **ウェブページの取得**: `http.Get()`関数を使用してウェブページを取得します。
2. **HTMLの解析**: 取得したウェブページのHTMLを`goquery`で解析します。
3. **必要な情報の抽出**: `goquery`のセレクタを使用して、HTMLから必要な情報を抽出します。

以下に、この手順を用いてウェブページからタイトルを取得する基本的

元記事を表示

Go言語の標準ライブラリの活用方法

Go言語の標準ライブラリは、プログラムを作成する際に一般的に必要となる多くの機能を提供します。これには、基本的なデータ型の操作、ファイル入出力、ネットワーク通信、データのエンコーディングとデコーディング、並行プログラミング、暗号化、データベース操作などが含まれます。

## fmtパッケージ

fmtパッケージは、文字列の書式設定と出力を提供します。PrintfやPrintlnなどの関数を含みます。

“`go
package main

import “fmt”

func main() {
name := “Alice”
age := 25
fmt.Printf(“名前:%s, 年齢:%d\n”, name, age)
}
“`

## net/httpパッケージ

net/httpパッケージは、HTTPクライアントとサーバの実装を提供します。Webアプリケーションの作成や、Web APIの呼び出しに使用します。

“`go
package main

import (
“fmt”
“log”
“net/http”
)

fun

元記事を表示

GolangでAWS(DynamoDB + API Gateway + Lambda + Terraform)でのサーバレスWebSocketを作ってみた

# サマリー

– WebSocketの解説
– (サーバレスWebSocket APIを実装するにあたり)利用するAWSサービスの解説
– 実装の注意点

# 対象読者

– WebSocketについてざっくり理解したい
– 疎結合なWebSocketのアーキテクトを知りたい
– TerraformとAWSを利用して、サーバレスなWebSocket APIを(Golangで)実装したい
– lambda
– API Gateway
– DynamoDB

# ソースコード

https://github.com/mormorbump/GolangApigwDynamodbWebsocketApp

# WebSocketとは

参考記事

– [RFC6455 – WebSocket Protocol](https://triple-underscore.github.io/RFC6455-ja.html)
– [Microsoft – Windows 8 と WebSocketプロトコル](https://learn.microsoft.com/ja-jp/

元記事を表示

APG4g(Go言語入門 APG4b)【1.03 ~ 1.04】

# 本記事について

本記事は、[APG4g(Go言語入門 APG4b)【1.00 ~ 1.02】](https://qiita.com/Nub/items/f8c424e00a8b2ff593f8)の続きです。
もし、前の記事を読んでいない、もう一度見たい等ありましたら見ていただけると幸いです。

今回扱う内容は以下の通りです。

– [1.03. 四則演算と優先順位](#103-四則演算と優先順位)
– [1.04. 変数と型](#104-変数と型)

本記事での目標は、以下の3点です。

– Go言語で、四則演算とあまりの計算が出来るようになる
– Go言語で、データを保存する変数を作れるようになる
– Go言語にあるデータの型を知り、使えるようになる

では、始めていきましょう!

## [1.03. 四則演算と優先順位](https://atcoder.jp/contests/apg4b/tasks/APG4b_d)

### キーポイント

| 演算子 | 計算内容 |
| —— | ———— |
| `+` | 足し算 |

元記事を表示

Bun ORMでマルチテナントに対応する

## はじめに

 この記事ではGo言語の[Bun ORM](https://bun.uptrace.dev)を使用している際に、マルチテナントに対応する方法を説明する記事です。BunのGitHubにはexampleとしてmulti-tenantが示されていますが、ドキュメントには詳しくはされていません。
 この記事ではGitHubの例をベースにマルチテナントを実装可能になることを目標とします。

## 解説

公式ではマルチテナント以外の部分も合わせてModel and query hooksとして示されています。
https://bun.uptrace.dev/guide/hooks.html

### 公式例

 公式が示しているexampleはGitHubから見ることが可能です。
https://github.com/uptrace/bun/tree/master/example/multi-tenant
 ただ、READMEを見ていただければ分かる通り、実装内容の解説は行われていません。コードの必要な箇所を抜粋しつつ解説を行っていきます。

### Struct

 例で示さ

元記事を表示

goroutine, channelについて

## goroutine

Go言語では、ゴルーチン(goroutine)と呼ばれる軽量なスレッドを使用して、並行処理を実現することができます。ゴルーチンはGoランタイムによってスケジュールされ、マルチコアのCPUやスレッドプールに対して効率的にマッピングされます。

ゴルーチンを使うことで、非同期な処理や並行処理を直感的かつ簡単に実現できます。ゴルーチンは、goキーワードを使って関数の呼び出し前に開始されます。ゴルーチン内での処理は非同期に実行され、ゴルーチン間でのデータの共有には明示的な同期が必要です。

以下に、ゴルーチンの例を示します。

“`
package main

import (
“fmt”
“time”
)

func main() {
// ゴルーチン内で非同期に関数を実行
go sayHello()

// メインゴルーチンからの処理
for i := 0; i < 5; i++ { fmt.Println("メインゴルーチン:", i) time.Sleep(time.Millisecond * 500) } } func sayHe

元記事を表示

【Go】ログイン機能でウェブアプリを作ってみる(2)

こんにちは。

Part 2は準備(Go)についてです。

# 目標

今回はGoのホットリロード環境を作っていきます。
(ホットリロードとはコードの変更をアプリケーションに自動的に反映することです。)

テストを書きませんので、変更を確認しやすくするためにホットリロード環境を構築したいと思います。

# 準備

+ goのバージョン
“`
% go version
go version go1.20.6 darwin/amd64
“`

ディレクトリで下記のコマンドを実行します。
“`
% go mod init login-example
go: creating new go.mod: module login-example
“`

echoもダウンロードします。
“`
go get github.com/labstack/echo/v4
go: downloading github.com/labstack/echo/v4 v4.11.1
go: downloading github.com/labstack/echo v3.3.10+incompatible

元記事を表示

Go言語のパッケージとモジュールについて

## 1. パッケージ

Go言語のパッケージは、関連するGoのコード(関数、型、変数など)を一まとめにするための単位です。パッケージはコードの再利用と整理を容易にします。

Goのコードファイルは、必ず特定のパッケージに所属します。所属するパッケージは、ファイルの最初の行で`package`キーワードを用いて明示します。例えば、`package main`はそのファイルが`main`パッケージに属していることを示します。

同じパッケージに属するファイル群は、同じディレクトリに配置されます。そして、パッケージ内のすべてのファイルはパッケージレベルの変数や関数を共有することが可能です。

## 2. モジュール

次にモジュールについて見ていきましょう。モジュールはGo 1.11で導入され、関連するパッケージの集合を表現する単位となります。モジュールの存在により、パッケージのバージョン管理や依存関係の追跡が簡単になります。

モジュールは`go.mod`ファイルによって定義され、このファイルはモジュールのルートディレクトリに配置されます。このファイルにはモジュール名(通常はリポジトリの

元記事を表示

APG4g(Go言語入門 APG4b)【1.00 ~ 1.02】

# 本記事について

競技プログラミングサイトの1つである[AtCoder](https://atcoder.jp/home)では、プログラミング学習教材の[APG4b(AtCoder Programming Guide for beginners)](https://atcoder.jp/contests/APG4b)が公開されています。使用言語はC++です。

また、sabaさんによって、[Python版APG4b](https://qiita.com/saba/items/b9418d7b54cce4b106e4)も書かれています。さらに、その他多くのプログラミング言語を使ったAPG4bの記事が公開されています。

本記事では以上のコンテンツに則り、Go言語版APG4bを書いてみたいと思います。

今回扱う内容は以下の通りです。

– [1.00. はじめに](#100-はじめに)
– [1.01. 出力とコメント](#101-出力とコメント)
– [1.02. プログラムの書き方とエラー](#102-プログラムの書き方とエラー)

本記事での目標は、以下の3点です。

1. A

元記事を表示

Go 関数 基礎固め

## 名前付き関数
“`
package main

import (
“fmt”
)

func Plus(x int, y int) int { // ()intは引数の型と 外のintは返り値の型
return x + y //int型の返り値 returnで値を返す時は 返り値の型を指定する必要になる
}

func Div(x,y int) (int, int) {
q := x / y
r := x % y
return q, r //返り値が二つある だから(int, int)
}

func Double(price int) (result int) { //返り値に変数も指定できる。変数resultを宣言。
result = price * 2 //resultにpriceの2倍の値を入れる
return //(result int)で指定してるのでreturnの中身は省略できる
}

func Noreturn() { //返り値がない関数
fmt.Println(“No Return”)
return
}

func main() {

i

元記事を表示

( ´∀`) < モナーがechoしてくれる `monaco`って言うコマンドを作りました

# モナーって知ってますか?
モナーは某ネット掲示板の2ちゃんねる(今は5ちゃんねる)で愛されているアスキーアートの1つで
「お前が言うな」 や 「お前も一緒やろ」 的なニュアンスで使われているやつです

# 制作に至った経緯
〜ある日の深夜〜
私 「モナーがechoしたら面白いんじゃね?」
私 「モナーがecho、モナーがエコー、モナーエコー、モナコ、monaco でええやん」
と言う思いつきと深夜テンションのままに作ったコマンドになります
開発してから結構な日数が経っているんですが供養させてください?

ただ、1つだけ問題がMSのOSSの [Monaco Editor](https://microsoft.github.io/monaco-editor/) と名前が被ってるんですよね

## リポジトリはこちら
http

元記事を表示

【Go】ログイン機能でウェブアプリを作ってみる(1)

こんにちは。

Go言語で仮登録・本登録・ログイン機能だけのアプリを作成します。

追加で
“`
・CORS+CSRF
・リフレッシュ
・アクセス回数制限
“`
なども扱ってます。

# Part 1 はじめに

## 何を作るのか?

ユーザーの仮登録、本登録、ログイン、制限されたリソースへのアクセスをするだけのWEBアプリ

## 何が学べるの?

ログイン処理が学べます

追加で
“`
・docker composeの基本的な使い方
・JWTの基本
“`

## 前提

“`
– Go 1.20.6
– WEBのフレームワークとしてlabstack/echoを使用します。
– データベースとのやりとりはjmoiron/sqlxを使用します。
– 認証トークンとしてJWTを使用します。また、lestrrat-go/jwxを使用します。
– メールサーバーはmailhogを使用します。
– テストは書かない
“`

## 作成するエンドポイント

* 仮登録 /auth/register/initial
– クライアントからemail, passwordを受け取る

元記事を表示

echoでstrapi REST APIのようなパラメータを受ける

# 最初に
フロントからの特定のリソースに対して検索リクエストが飛んでくる。
そのリクエストはechoで動くサーバがさばく。
検索クエリはstrapi REST API(ここでは以下strapi API)のようになっていることが要件で
汎用性 <【優先度】< ビジネスロジックとのマッチ とすることが条件となっている。 そうした場合、こうやって組みましたの一例を紹介する。 # リクエスト内容を分解する strapi APIでは、ある規格化されたリクエストパラメータを送ることで 柔軟な検索リクエストを受けることができる。 パラメータ参考;[Parameters | Strapi Documentation](https://docs.strapi.io/dev-docs/api/rest/parameters) その処理を模すには、まず処理できる形にリクエストを分解しなければいけない。 その内容について、書いていく。 ## controller リクエストを受け取った後、parameters構造体に当てはまるよう分解するメソッドに渡す ~~~go import ( searc

元記事を表示

Go言語:ゴルーチンの完全な終了を確実にする方法

## はじめに
Go言語では、非同期のタスクを実行するための手段としてゴルーチンを利用することが一般的です。
しかしながら、その利用には注意が必要です。今回はその一つ、`main`関数が終了すると共にゴルーチンも終了してしまう問題とその解決策について記載します。

## ゴルーチンと`main`関数の関係性

まずは以下のゴルーチンが含まれたコードを見てみましょう。

“`go
package main

import (
“fmt”
)

func sayHello() {
fmt.Println(“Hello”)
}

func sayWorld() {
fmt.Println(“World”)
}

func main() {
go sayHello()
go sayWorld()
}
“`

このコードでは、`main`関数が`sayHello`と`sayWorld`のゴルーチンを起動します。
しかし、ここには一つ問題があります。それは、`main`関数が終了すると全てのゴルーチンも終了するというGoの特性上、これらのゴルーチンが終了する前に`main`関数が終了

元記事を表示

組織でGPTのプロンプト活用するのにお役立ちなツール書いたで!!

# い・しゅー

こんな課題が神々の大地からウォーターフォールしてきてないかな?

– プロンプトのDBを作ってノウハウを蓄積したい
– かつ、誰でも登録出来て誰でも検索させたい
– かつ、出力結果を実際の出力に近い形で分かりやすく参照したい
– かつ、どのくらいの利用があったか可視化出来る仕組みがほしい
– かつ、**分かりやすく使いやすいインタフェースから操作させたい!**

#### いやー無理っす!!!

となるところだけど、僕らが普段使いのslackをラップすれば出来そうな予感がしたので作ってみた
slackだとみんな使ってるから操作を覚える学習コストも少ないし、**スマホとかからも出来て良いよね!!**

# こ・れ

# おもな動作

– **

元記事を表示

Gormの使い方について

こんにちは。

GORMはデベロッパーフレンドリーを目指した、Go言語のORMライブラリです。
goを使ってGORMを使ってデータベース操作する必要があると思います。

# インストール

“`
go get -u gorm.io/gorm
go get -u gorm.io/driver/sqlite
“`

# データベーススキーマの作成

スキーマの作成の仕方についてみていきます。

## マイグレーション(Migrate)

Migrateは、接続先のスキーマを参照して、テーブルやカラムがなければ自動的に作ってくれるコマンドです。

![Screenshot 2023-07-17 at 6.23.52 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3507088/92c8f5e7-efc6-d3ce-71f2-258ceb9380ad.png)

“`
db.AutoMigrate(&User{})

db.AutoMigrate(&User{}, &Product{}, &Orde

元記事を表示

[Azure] Container Apps 機能調査

## Azure Container Apps

Azure Container Appsは、Azure上でコンテナベースのアプリケーションを初めて構築する開発者やエンジニアに向けたサービス。以下に、Azure Container Appsの概要と主な機能について詳しく説明する。

### 概要
Azure Container Appsは、コンテナ化されたアプリケーションのデプロイや実行を簡素化するためのパス(PaaS)サービス。このサービスは、開発者がアプリケーション自体に集中することができるよう、インフラストラクチャの詳細を隠蔽している。Azure Container Instancesをベースにしており、コンテナのスケールやネットワーキング、セキュリティなどの管理を自動化する。

### 主な機能
1. **コンテナのデプロイと実行**: Azure Container Appsは、独自のデプロイメントテンプレートを使用して、コンテナイメージを自動的にデプロイし、実行します。開発者は、ローカルで作成したコンテナイメージをAzure Container Registryにアップロー

元記事を表示

Goのテストコードを書く時パッケージ名に_testをつけるべきか?

Goでテストを書きたい時にテストコードには`_test`のsuffixをつける時と

同一パッケージでテストコードを書いている例があります。

どちらが正しい書き方なのか調べてみました。

## _testをつけている例

stringsパッケージでは`_test`のsuffixをつけてテストコードを書いています。
https://go.dev/src/strings/search_test.go

“` go
// Copyright 2012 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package strings_test
“`

## _testをつけていない例
bzip2パッケージでは`_test`をつけずにテストコードを書いています。

https://go.dev/src/compress/bzip2/bzip2_test.go

元記事を表示

VSCodeでGoの開発環境を簡単に作る

## はじめに

Go入門中の者です。
GoLandに課金するのはちょっと気が引けるので、VSCodeで簡単な実行環境を作ってみました。

色々な記事が出ているけど、結果Microsoftの記事が一番分かりやすく簡単でした。

https://learn.microsoft.com/en-us/azure/developer/go/configure-visual-studio-code

## 前提

VSCodeがインストールされている
記事に出てくるコマンドはMacを前提としております

## 手順

### 1. Goをインストールする

下記のサイトから、任意のバージョン/OSのGoをインストールする
(余談:私はasdfを使ってインストールしてます)

https://go.dev/doc/install

### 2. VSCodeの拡張機能「Go」をインストールする

これ↓です!
![スクリーンショット 2023-07-17 9.43.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0

元記事を表示

OTHERカテゴリの最新記事