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

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

GoでWebアプリケーション

### Webサーバーの準備

以下の目的でWebサーバーを用意する

・クライアントがブラウザ上で利用するHTMLとJavaScriptを提供する
・クライアントとの間でWebSocketを使った通信を行う

### 処理の流れ

・net/httpパッケージを利用し、ルートのパスへのリクエストを待ち受ける
・リクエストを受け取ると、HTMLを返す
・ListenAndServeメソッドで、ポート番号上でWebサーバーを開始する

### ソース

“`
package main

import (
“log”
“net/http”
)

func main() {
http.HandleFunc(“/”, func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte(`


GoのWebアプリケーション


GoでWeb


`))

元記事を表示

Web開発初学者と学ぶCleanArchitecture

# 自己紹介
文系大学院生をしているものです。
今回初Qiitaとなります。何にも考えずに執筆したので多分駄文です。お手柔らかにお願いいたします。
ここ違うよってところありましたら、お手数ですがコメントで教えていただけると助かります。

# はじめに
この記事は、Web開発を初めて行なった際に一番苦労したシステム設計について書き残したものです。
コードはGolang、MySQLで書いています。([サンプルコード](https://github.com/temmie524/room-management-app))

私はこれまでRailsでハンズオン記事やRailsTutorial等を用いてWeb開発をチュートリアル的に行なってきました。Railsではrails g した際に雛形が自動生成されるため、システム設計を意識することなく開発を行なってきました(それがRailsの良さであると理解しています)

今回はGo言語での開発を行いましたが最初につまづいたのはそこでした。1から自分で考えなくてはいけません。そこで「アプリ作る時 ディレクトリ構成」などとググったところ、そこでさまざまな設計

元記事を表示

Agora SDKでリアルタイムコミュニケーション

# Agora SDKの概要と機能

Agora SDKは、リアルタイムコミュニケーションを実現するためのプラットフォーム。SDKは、ビデオ通話、音声通話、メッセージングなどのさまざまな通信機能を提供します。以下にAgora SDKの主な機能を詳しく説明する。

1. ビデオ通話:
– ビデオキャプチャとディスプレイ: カメラや画面の共有を実現するための機能
– オーディオ/ビデオコーデック: 高品質なオーディオ/ビデオストリームのエンコードおよびデコードをサポート
– リアルタイム映像処理: ビデオフィルターや仮想的な背景などのリアルタイム映像処理を実現する機能
– レコーディングとプレイバック: ビデオ通話の録画および再生をサポート

2. 音声通話:
– 音声コーデック: 高品質な音声ストリームのエンコードおよびデコードをサポート
– ノイズおよびエコーキャンセル: 音声品質を向上させるためのノイズおよびエコーキャンセル機能
– オーディオミキシングと変換: 複数の音声ストリームをミキシングしたり、サンプルレートを変換したりする機能

3

元記事を表示

【Go言語】Go言語基本型

Go言語でのメモです。

Goには整数型、浮動小数点型、論理型、文字列型など基本的なデータ型があります。

## 整数型

| 型 | サイズ(bit) | 符号 | 最小値 | 最大値 |
| ————– | ——————–: | —- | ———————:| ———————–: |
| int8 | 8 | あり | -128 | 127 |
| int16 | 16 | あり | -32768 | 32767 |
| int32 | 32 | あり | -2147483648 | 214

元記事を表示

golang+reactなアプリの開発環境をモノレポで作る

こんにちは。

モノレポという、1つのリポジトリに複数のアプリを1つのリポジトリに保存するというパターンがあるということを知ったので、
実際にその構成での開発環境を作ってみます。

今回考えるのは、APIサーバとしてgolangで作られたものがあり、reactではそのフロントエンドを実装するようなアーキテクチャにします。

# この記事で達成すること

– golangでAPIの開発環境を作る
– reactの開発環境を作る
– 1つのリポジトリで↑2つのアプリが保存されている再現できる(モノレポ構成にする)
– reactとgolangをモノレポで構成

# 言語、ミドルウェアのバージョン

| 言語、ミドルウェア | バージョン |
|:———-:|:—————:|
| docker | 20.10.11 |
| docker-compose | 1.29.2 |
| golang | Dockerfile参照 |
| mysql | Dockerfile参照

元記事を表示

【Oracle DB】DATE型のカラムに日付をINSERTすると、ORA-01861: literal does not match format stringとなる

## やったこと

Goのdatabase/sqlパッケージを使用し、DATE型のカラムtest_dayに日付をINSERTした。

“`go
query := INSERT INTO my_table(test_day) VALUES(‘1999-01-01’)

db.ExecContext(ctx, query)
“`

## エラー

ORA-01861: literal does not match format string

## 対応

OracleDBのTO_DATE関数を使用する
明示的にDATE型に変換して日時データにする必要がある。

“`go
query := INSERT INTO my_table(test_day) VALUES(TO_DATE(‘1999-01-01′,’YYYY-MM-DD’))

db.ExecContext(ctx, query)
“`

こちらでも可能だが、時刻の指定はできず、時刻は常に00時00分00秒となる
日付リテラルであり、日時リテラルではない)

“`go

元記事を表示

Goのキャスト

Go言語ではintは明示的なキャストが必要。

数字→文字列はstrconv.Itoa(数字)

文字列→数字はstrconv.Atoi(文字列)

元記事を表示

DBを2回呼び出すのと処理をまとめて1回で済ませた時のパフォーマンス比較

# 初めに
APIでDBを操作する際、各機能が対象とするモデルを1つに限定したいと考えた。なぜなら、各モデル(例:本、出版社)に対するCRUD操作が独立していて、ユースケースに応じてこれらを組み合わせることで、設計をシンプルにできると感じたから。

仮想テーブルを作成してバックエンドでJOIN操作を行う方がパフォーマンスが良いと思うが、実際にどれくらいのパフォーマンス差が現れるのか、小さいアプリケーションなら無視できる程度なのか。この疑問を解決するために、検証を行った。

# じゃあなにすんのサ
PostgreSQLのDBを建て、ダミーデータ(本と出版社)を100件、10,000件、1,000,000件登録。本のテーブルには出版社の主キーを保持するフィールドを設定した。
データの取得は以下の2つのパターンで行う。

**パターン1:**
無作為に本のレコードをDBから取得し、その後出版社の主キーを使用して出版社のレコードを取得する。

**パターン2:**
無作為に本のレコードをDBから取得し、その際に出版社のテーブルとJOINして、一度のクエリで必要な情報を全て取得する。

本と出版

元記事を表示

【Go】環境ごとの設定値管理

Go で web server を立てる際に、環境(staging とか production とか)ごとの設定値をどういうふうに管理し、アクセス可能にするかのメモ。

外からの値の受け取り方としては環境変数から取るか、コマンドラインフラグで渡すかの2択だけど、どちらを取ったとしてもアプリケーションコードのロジック中からその値をどのように参照するかという話がある。
毎回 `os.Getenv` とか書きたくないし、このアプリケーションにどのような設定を入れられるのかがわかりづらいので、どこかで一元管理したい。

そこで、以下のように設定管理用の `myconfig` というパッケージを作っておいて、そこに集約させてみる。
設定値を持った構造体をパッケージグローバル変数に突っ込んでおいて、その構造体経由で設定値を参照できるようにする。

“`myconfig.go
package myconfig

import (
“github.com/caarlos0/env/v6”
/*…以下省略*/
)

var cfg config

type config struc

元記事を表示

やっぱギャンブルはやべぇなってことを学ぶためにコイントスを作るなど

# こんな記事を見かけた
https://gigazine.net/news/20230812-ergodicity-breaking-peters-coin-toss/

>「ピータースのコイントス」は「大勢の参加者の平均」を求めると必ずプラスになる賭け事に見えるのに、実際に何度も挑むと大敗を喫することになる魔のコインゲームです。

コイントスはコインを投げて裏が出るか表が出るかで賭ける運ゲーです。
ピーターのコイントスは、特定の条件の状態ではコイントスを繰り返せば損をする確率が上がるというアルゴリズムだそうです。

この記事ではコイントスを何度も繰り返して行い統計を出すツールが紹介されていますが、実際に投げてみて体感できるページは貼られていないように見受けられました…

おあー…

## やってみたいな

ということで実際にピーターと同じ条件でコイントスを投げてみるコマンドツールをGoで作ってみました。

## 作戦

Goで作るところまで決まったのでざっくり目標を立てて、どういったコードにするかを考えていきます。
今回はこんな感じで考えてみました。

目標:ピータ

元記事を表示

logパッケージの定数を出力する

“`go:main.go
package main

import (
“log”
)

func main() { // 出力は10進数 //2進数に直すと
log.Print(log.Ldate) // 1 // 1
log.Print(log.Ltime) // 2 // 10
log.Print(log.LstdFlags) // 3 Ldate | Ltime // 11
log.Print(log.Lmicroseconds) // 4 // 100
log.Print(log.Llongfile) // 8 // 1000
log.Print(log.Lshortfile) // 16 /

元記事を表示

Go言語向けNCMB SDKの使い方(配列の追加・削除操作)

NCMBはモバイル向けのBaaS(mobile Backend as a Service)ですが、サーバー側のデータとNCMB上のデータを連係させたいというニーズは良くあります。

そんなときには各言語向けのSDKがあると便利です。サーバー向けにはRuby、Python、PHP、Java、C#のSDKがあります(すべて公式サポート対象外の、コミュニティSDKという位置づけです)。

新しくGo言語向けのSDK開発をはじめたので、その使い方を紹介します。今回はデータストアの配列フィールドに対する要素追加・削除の処理について解説します。

## ソースコード

ソースコードはGitHubにて公開しています。ライセンスはMIT Licenseになります。

[NCMBMania/ncmb\_go](https://github.com/NCMBMania/ncmb_go)

## インストール

SDKのインストールは下記コマンドで行います。

“`bash
go get -u github.com/NCMBMania/ncmb_go
“`

## インポート

続けてSDKをインポート

元記事を表示

[Go] Go言語で簡単なじゃんけんプログラムを作成してみよう!(初心者向け)

## この記事の目的
Go言語に興味がある初学者の方が簡易なじゃんけんプログラムを理解することができる

## 何はともあれまずはコードを確認してみましょう!

“`main.go
package main

import (
“fmt”
“math/rand”
“time”
)

func main() {
rand.Seed(time.Now().UnixNano())
userChoice := getUserChoice()
computerChoice := getComputerChoice()
result := determineWinner(userChoice, computerChoice)
displayResult(userChoice, computerChoice, result)
}

func getUserChoice() string {
var choice string
fmt.Println(“じゃんけんを始めます!”)
fmt.Println(“1:

元記事を表示

Goのホットリロードツール (Air) で変更反映時のtcpポート競合を回避する方法

# 環境
Docker: 4.20.1
Nginx: 1.23
Air: 1.45.0

## 記事の要約
Goのホットリロードツール(Air)による再実行時にtcpポート競合が起きてしまっていた問題を**Airの設定ファイル**を修正することで解決したという記事。

## 前提
– Dockerについてある程度知っている
– Docker環境でのAirの導入は既に出来ている

# 目次
– [背景](#背景)
– [問題](#問題)
– [解決](#解決)
– [終わりに](#終わりに)

# 背景
Goは(RubyやPHPとは異なり)コンパイル言語であるため、実行中のアプリケーションのソースコードへの変更を反映させるためには**実行停止+コンパイル+実行**を毎回行う必要がある。
これは明らかに面倒だし効率が悪すぎるということで、この辺りの不満を解決してくれるホットリロードという機能が提供されている(GoではAirというモジュールが主流らしい)。

# 問題
Go言語での開発においてソースコードを書き換えを勝手に検知してbuild+再実行をしてくれるAirであるが、
`

元記事を表示

CARTA HOLDINGS の秋季インターンシップ【Sunrise】に参加してきた話

CARTA HOLDINGS の秋季インターンシップ 【Sunrise】 に参加してきました!

![PXL_20230912_035503570.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3143089/3720eedb-4361-70f6-4fb7-afffc9ba1cf0.jpeg)
![PXL_20230912_004727084.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3143089/21f2a69c-b87c-c48c-a04f-98da7583b8c0.jpeg)

インターンを振り返りつつ行ったことや感想などをまとめます!

# インターン概要

5日間の対面インターンで、イベント計測サーバーを秒間30,000リクエスト捌けるように、インフラ・Golangアプリの両方からパフォーマンスチューニングを行うという内容でした。

4人1組でチームを組み、そこに技術メンターと人事メンターの2名(私たちの

元記事を表示

[GCP] Workflows機能x実装

# GCPのWorkflowsについて

GCPのWorkflowsは、タスクの実行と制御のための単純で柔軟な実行環境です。このサービスを使用することで、異なるサービスやAPIの呼び出しや、条件に基づいた制御フローの定義が可能。

## 機能

### 1. ワークフローの定義と制御

GCPのWorkflowsでは、YAML形式でワークフローを定義することができる。この定義には、各タスクの手順と条件、依存関係などを設定する。また、複数のタスクを直列に実行したり、並行して実行したりすることもできる。

### 2. サードパーティのAPIとの連携

Workflowsは、様々なサードパーティのAPIとの連携をサポートしている。RESTやgRPCで公開されたAPIを使用する場合、タスクとして呼び出しを追加することができる。また、自動的に再試行やエラーハンドリングを行ってくれるため、信頼性の高いAPI呼び出しを簡単に実現することができる。

### 3. 高度な制御フロー

Workflowsでは、条件に基づいた処理や反復処理を簡単に定義することができる。たとえば、ある条件が成立した場合の

元記事を表示

GoでFizzBuzz

### FizzBuzzとは

数列を1つずつ表示する。ただし3で割れる数が来たら「Fizz」
5で割れる数が来たら「Buzz」。3でも5でも割れる数が来たら「FizzBuzz」と表示する

### ソースコード

“`
package main

import “fmt”

func main() {
for i := 1; i <= 20; i++ { if i%3 == 0 && i%5 == 0 { fmt.Println("FizzBuzz") } else if i%3 == 0 { fmt.Println("Fizz") } else if i%5 == 0 { fmt.Println("Buzz") } else { fmt.Println(i) } } } ``` 有名すぎて何度もやってるけど違う言語で初めて書くと改めて楽しい。

元記事を表示

Go言語で高速JSONライブラリをメモリ安全にしたらさらに速くなった話

## はじめに

こんにちは。Sugawara Yuutaです。”Go言語で最速のJSONデコーダーを作った話”, “それでも僕はGoで最速のJSONデコーダーを作りたかった”…以来の方はまた読んでいただきありがとうございます。まだの方は、経緯を伝えやすくなると思うので、そちらの方も読んでいただけたら幸いです。
https://qiita.com/sugawarayuuta/items/526b34547bf6ca53535a
https://qiita.com/sugawarayuuta/items/a4135dd49d28e9baf2dc

## その後

Go言語チームのメンバーが取り組んでいる新しいバージョンのJSONライブラリである[go-json-experiment/json](https://github.com/go-json-experiment/json)というレポジトリを発見しました。(厳密に言うと、知ってはいたのですが中身等は見ていない状態でした。) そこで学んだことが少しでも役に立てばとissueを提出したところ、そのときのJSONデコーダーに足りないも

元記事を表示

GoでWebアプリケーションを作る(8)ーテスト

こんにちは。

今日は「テスト」についてです。

これまで作り上げてきたGyudon型にテストを追加してもらいます。

# Go言語でのテストのやり方

Go言語にはテストをサポートする標準パッケージ [testing](https://pkg.go.dev/testing)があります。 そのためなにかテストフレームワークを使うのではなく、標準のライブラリを使用してテストを行うケースが多いです。

テストは以下のコマンドだけで実行できます。 `./…`でカレントディレクトリ以下のすべてのファイルが対象となります。

“`go
$ go test ./…
“`

`<機能>.go`というファイルがある時、テストは`<機能>_test.go`という名前のファイルに記述していきます。

テストの関数は下のような書き出しで始めます。

“`go
func Test<テスト名>(*testing.T)
“`

このような関数のテストを書くときを考えます。

“`go
func IsTopping(food string)bool{
switch food {
cas

元記事を表示

[Go] defer, panic, recover 簡単整理 (備忘録)

> 記事の内容は間違いがあり得ますので、ご了承いただけると幸いです。内容の間違い、認識の違い、違う意見などありましたら、コメント大歓迎です!

# defer

deferとして定義した構文や関数をStackに保持しておき、現在の関数処理の終了とともにPOPされて実行する

### Example

“`go
package main

import “fmt”

func main() {
fmt.Println(“Main func start”) // 1
defer func() { fmt.Println(“First defer”) }() // 4
defer func() { fmt.Println(“Second defer”) }() // 3
fmt.Println(“Main func end”) // 2
}
“`

### Result

“`
Main func start
Main func end
Second defer
First defer
“`

# panic

現在の関数処理を止めて、Stackに登録

元記事を表示

OTHERカテゴリの最新記事