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

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

Golang 空インターフェイスと型アサーション

# 空のインターフェイス
go言語は全ての型と互換性のある空インターフェイス型を宣言できる。

“`golang
var kara interface{}

kara = 100
fmt.Println(kara)
fmt.println(&kara)

kara = “Empty”
fmt.Println(kara)

kara = [4]string{“K”, “A”, “R” “A”}
fmt.Println(kara)
“`

##### 実行結果

“`
100
0xc000080ec0
Empty
[K A R A]
“`

## 型アサーション
どんな型でも受け取れる空インターフェイスですが、逆に引数で受け渡された値は元の型の情報が欠落しています。
そのためGo言語では型アサーションを提供しており、型アサーションによりその受け取った型が何であるかを以下のように動的にチェックすることができます。

##### 構文
“`
t, ok := i.(T)

“`
i が T(型名) を保持していれば、 t は基になる値になり、 ok は真(true)になります。

元記事を表示

自動作曲アプリを書く

# はじめに

卒業研究で自動作曲システムを作ったので、応用してブラウザで動くアプリを作ろうと思いました。

# 目次

1. [アプリの概要](#Chapter1)
1. [フロントエンド](#Chapter2)
1. [バックエンド](#Chapter3)
1. [ソースコード](#Chapter4)
1. [今後の課題](#Chapter5)



# アプリの概要
キーを選択し、ダウンロードボタンをクリックすると、MIDIファイルが入ったZIPファイルがダウンロードされます。
![スクリーンショット 2023-07-24 181911.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733784/72a82c9b-ae9d-3497-d0a2-8d622515df59.png)
![image.png](https://qiita-image-s

元記事を表示

【AWS Lambda】複数のLamda関数を1つのコンテナイメージにまとめる

## 目的
1つのイメージ内に複数のLambda関数をまとめて管理したかったので、その方法をまとめました。Lambda関数の作成時にエントリポイントを指定することで実現可能です。

## ローカル環境の準備

– フォルダ構成
root/
 ├ Dockerfile
 ├ main1.go
 ├ main2.go
 └ main3.go

– Dockerfile作成
“`docker:Dockerfile
# ベースイメージの指定とビルドステージの開始
FROM golang:1.17-buster as builder

# 作業ディレクトリの設定
WORKDIR /go/src/lambda

# 依存関係のダウンロード
COPY go.mod go.sum ./
RUN go mod download

# ソースコードのコピー
COPY ./ ./

# ビルドの実行
RUN go build -o function1 ./main1.go
RUN go build -o function2 ./main2.go
RUN go build -o function3 ./m

元記事を表示

Go言語によるログファイル出力

Go言語でログファイルを出力する基本的な方法について記載します。

# 基本

まず、基本的なログ出力を見てみましょう。以下は、標準ライブラリの`log`パッケージを使用してログをファイルに出力するシンプルな例です。

“`go
// 必要なパッケージをインポート
package main

import (
“log”
“os”
)

func main() {
// ログを書き込むファイルを開く(なければ作成)
file, err := os.OpenFile(“testlogfile.log”, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
if err != nil {
// エラーハンドリング
log.Fatal(err)
}

// 関数が終了する際にファイルを閉じる
defer file.Close()

// ログの出力先をファイルに設定
log.SetOutput(file)

// ログを出力
log.Println(“This is a test log entry”)
}
“`

# ロ

元記事を表示

Go言語のエラーハンドリングについて

## 1. エラーハンドリングの基本

まず、基本的なエラーハンドリングの例を見てみましょう。ここでは、ファイルを開いて読み込むというシンプルなタスクを考えます。

“`go
file, err := os.Open(“example.txt”)
if err != nil {
log.Fatalf(“failed opening file: %s”, err)
}
defer file.Close()

byteSlice := make([]byte, file.Stat().Size())
_, err = file.Read(byteSlice)
if err != nil {
log.Fatalf(“failed reading file: %s”, err)
}

fmt.Printf(“file content: %s”, byteSlice)
“`

ここでは、 `os.Open` から返されたエラーを確認し、エラーが存在する場合にはログメッセージを出力してプログラムを終了しています。また、 `file.Read` から返されたエラーも同様に確認して

元記事を表示

[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

元記事を表示

OTHERカテゴリの最新記事