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

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

[Go] os.Exit()について

# os.Exit()とは?

https://pkg.go.dev/os#Exit

os.Exit()とは、与えられたステータスコードを出力すると共に、プロセスを即時終了する関数です。
ステータスコードの慣習的には、

– 0 = 成功
– 0以外 = 失敗

のようで、ステータスコードの範囲は [0 ~ 125]が推奨されています。

実際に実行してみると、ステータスコード0以外の場合は、”exit status 1″とともにプログラムが終了します。

“`go:
package main

import (
“fmt”
“os”
)

func main() {
fmt.Println(“hello world”)
os.Exit(1)
fmt.Println(“ops”)
}

“`

“`log:出力
$ go run ./main.go
hello world
exit status 1
“`

# deferファンクションは実行しない
os.Exit()はプロセスを即時終了させ、deferファンクションは実行しないようです。

“`go:
p

元記事を表示

GolangでWebAPIを作成する①

## Golangを利用し、WebAPIを作成していきます。

## 今回のお題
今回は、golangでWebAPIを作成するための環境を作成していきます。
① golangのプロジェクトの作成
② ginのインストール

### 今回の内容は、環境構築を行いたいと思います。
利用するツールとバージョンは以下の通りです。

### 開発環境
  |バージョン
—|—
Golang|1.20.4
gin|1.9.1

## 実装
### Goのプロジェクト作成
最初は、main.goのファイルを作成し、Hello Worldを表示させます。
“`main.go
package main

import “fmt”

func main() {
fmt.Println(“Hello World”)
}

“`

この状態で、以下のコマンドを実行します。
“`
$ go run main.go
“`
正常に、Hello Worldが表示されました。
“`
Hello World
“`

### Ginのインストール
正常にGoのプログラムが動作したところで、W

元記事を表示

DockerでGoの開発環境を作りVisual Studio Codeでコーディングを行う

# 目的
ソースコードの編集はホストPCで行っているようにし、Dockerで立てたコンテナでビルドやバイナリの実行を行う。

## 経緯
何かの言語の開発環境をローカルに作ってみたいけど直接PCにインストールするのは気が引けるという場面がよくある(環境グチャグチャになりがち)。
以下の方針で進める
– Go langで開発をする
– Dockerでコンテナを立てることでローカル環境を汚さない
– コンテナをバインドマウントをすることで、ローカルで開発をしているような環境を作る

### 手順
1. docker-compose.yamlを作成し実行
1. Visual Studio CodeにDev Containersをインストールする
1. Go langプログラム作成する
1. 作成したプログラムをビルドして実行する

#### Step.1 docker-compose.yamlを作成し実行
“`yaml:docker-compose.yml
version: ‘3’
services:
golang:
image: golang:1.19.11-alpine

元記事を表示

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

こんにちは。

Part 3は準備(MySQL & docker-compose.yml)についてです。

# 目標

– MySQLを起動する
– GoからMySQLに接続する

## MySQLを起動する

### MySQLの設定ファイルを準備します。

早速、MySQLを起動の前に、後々必要になるかもしれない設定などをしています。
そのために必要なディレクトリを作成します。

“`
$ mkdir -p _tools/mysql/{init.d,conf.d}
“`

今回で言うとMySQLに関するファイルを_toolsディレクトリ以下にまとめます。

_tools/mysql/conf.dにはMySQLの設定ファイルを置きます。

_tools/mysql/conf.d/my.cnf
“`
[mysqld]
character-set-server=utf8mb4

[client]
default-character-set=utf8mb4
“`

_tools/mysql/init.dには今回使うユーザーのテーブル作成用のファイルを作成します。

_tools/m

元記事を表示

APG4g(Go言語入門 APG4b)【1.05】

# 本記事について

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

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

– [1.05. プログラムの実行順序と入力](#105-プログラムの実行順序と入力)

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

1. Go言語のプログラムが実行される流れを知る
2. Go言語が標準入力をどうやって受け取るかを知り、書けるようになる
3. Go言語を使って、文字列を整数などの色々なデータ型に変換できるようになる

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

## [1.05. プログラムの実行順序と入力](https://atcoder.jp/contests/apg4b/tasks/APG4b_f)

### キーポイント

– プログラムは上から下へ順番に実行される
– `bufio.Scanner`で入力を受け取ることが出来る

### プログラムの

元記事を表示

Go言語でREST APIを作成する

Go言語を使用してREST APIを作成する方法を記載します。
この記事では、基本的なHTTPメソッド(GET, POST, PUT, DELETE)を使用して、RESTfulなエンドポイントを作成します。

## 必要なパッケージ

以下のパッケージを使用します。

– `net/http`:HTTPクライアントとサーバーの作成に使用します。
– `encoding/json`:JSONのエンコーディングとデコーディングに使用します。
– `github.com/gorilla/mux`:リクエストルーティングとディスパッチに使用します。

## データモデル

まず、APIが扱うデータのモデルを定義します。この例では、`Book`という構造体を作成します。

“`go
type Book struct {
ID int `json:”id”` // BookのID
Title string `json:”title”` // Bookのタイトル
Author string `json:”author”` // Bookの著者
}
“`

## エ

元記事を表示

APIサーバをデーモンで動かすためのsupervisorの設定

SupervisorとはPython製のプロセス管理ツール
プログラムなどを簡単にデーモン化することができる。

今回はEC2にデプロイしたGolangのAPIサーバをsupervisorで動かすことを想定する。

### 導入手順

“`shell:bash
sudo yum install python3
sudo pip3 install supervisor
echo_supervisord_conf > ~/supervisord.conf

# 移動させる
sudo mkdir /etc/supervisord/
sudo mkdir /etc/supervisord/conf.d
sudo mv ~/supervisord.conf /etc/supervisord/supervisord.conf

# オリジナルとっとく
sudo cp /etc/supervisord/supervisord.conf /etc/supervisord/supervisord.conf.org
“`

### 設定ファイルの作成

/etc/supervisord/super

元記事を表示

GoでBOMを考慮したio.Readerを扱う

GoでBOM付きのUTF-8ファイルを扱う必要があったので、その時に知ったテクニックを共有したいと思います。

具体的に言えば、Excelでファイル形式を`「CSV UTF-8 (コンマ区切り) (.csv)」`として保存した際のCSVファイルを扱った時の話です。
(Excelや少し前のメモ帳などでUTF-8としてファイルを保存すると、BOM付きのUTF-8ファイルになります。[^1])

[^1]: 最近のメモ帳はBOMなしUTF-8が標準になったようです。

## BOM(Byte Order Mark)とは

BOM(Byte Order Mark)というのは、Unicode系の符号化方式(UTF-8やUTF-16など)の場合に、どの符号化方式であるかが分かるように先頭に付ける数バイトのデータのことです。
より詳しい説明についてはWikipediaの[バイト順マークのページ](https://ja.wikipedia.org/wiki/%E3%83%90%E3%82%A4%E3%83%88%E9%A0%86%E3%83%9E%E3%83%BC%E3%82%AF)などに譲ります。

元記事を表示

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

元記事を表示

OTHERカテゴリの最新記事