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

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

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に登録

元記事を表示

Argocdのapiserverをvscodeでデバッグしてブレークポイントをヒットさせる

# モチベーション
1.Argocdのapiserverの動きを読んでバグフィックスしコントリビュートしたいため。
2.https://github.com/KouWakai/argo-cd/pull/2
のプルリクをあげる際にbadgeの動作を確認したかったため。

# 概要
公式ではtelepresenseを使った方法などありますが、準備も大変で結構複雑です。
apiserverをvscodeで動かすだけならお手軽でまずはとりかかりにapiserverのみをデバッグする方法をメモっておきます。

やることとしては、Argocdのプロセスはgoremanで実行されています。そのうちapiserverのプロセスをvscodeで実行してデバッグします。

一応make stat-local BIN_MODE=trueでサービスを起動してvscodeでローカルプロセスにアタッチする形でデバッグもできますがコードの反映する際に都度make build-localしないといけないのが手間です。
そのためvsocdeでgo run ./cmd/main.goを使ってapiserverを起動する方

元記事を表示

Go言語でバックエンドサーバーを作成する

## やりたいこと
Go言語を使用して簡易的なバックエンドサーバーを作成します。

“`Go:main.go
package main

import (
“fmt”
“net/http”
)

var count int

func main() {
// ハンドラを登録
http.HandleFunc(“/”, hanlder)
http.HandleFunc(“/get”, countHanlder)

// サーバーを起動
http.ListenAndServe(“:8080”, nil)
}

// lcoalhost:8080/で呼び出されるハンドラ
func hanlder(w http.ResponseWriter, _ *http.Request) {
count++
fmt.Fprintln(w, count)
}

// lcoalhost:8080/getで呼び出されるハンドラ
func countHanlder(w http.ResponseWriter, _ *http.Request) {
fmt.Fprintln(w,

元記事を表示

Golangデザインパターン入門:インターフェース継承とチャネル並行処理

Golangが伝統的なオブジェクト指向言語ではないことはよく知られていますが、
他の方法で実装することができます。

例として、入室と退室の操作があるシステムを想定してみましょう。
まず、StudentとTeacherの2つのオブジェクト(Golangでは構造体)を定義します。
これらはID、Name、ClassInfoという属性を持っています。
“`
type ClassInfo struct {
Class int
No int
}

type Student struct {
Class ClassInfo
Name string
id int
}

type Teacher struct {
Class ClassInfo
Name string
id int
}
“`
それから、入室と退室のメソッドを書きます。

“`
func (stu Student) inRoom() {
fmt.Println(stu.Name, “student in room”)
ch <- stu.Name } func (stu Studen

元記事を表示

Discord Bot作成を完全に理解する

## 1. はじめに

この記事は下記と同じものです。

https://zenn.dev/king/articles/4201f4ee821a27

Discord Bot は SDK を使用することで簡単に作成することが可能です。
テキストでのメッセージの送信はもちろん、埋め込み、音声メッセージなど Discord Bot で表現できることの幅は広くなっています。
今回は新たに Discord Bot を作成する上で Discord Bot で表現できること、および運用する上での注意点を紹介します。

本記事の内容は`Go(v1.20)とdiscordgo(v0.27.1)`を使用し作成しています。
また記事内の内容は章ごとに独立しているので、必要に応じて目次から参照してください。

### 対象読者

– Discord Bot で何ができるかよくわからない人
– Discord Bot を作成したい人
– Discord Bot の運用について知りたい人

## 2. Discord Bot で表現できるメッセージの種類

### 2.1. テキストメッセージ

– 基本的

元記事を表示

GoでWebアプリケーションを作る(7)ーWebアプリケーション

こんにちは。

今日は「Webアプリケーション」についてです。

これまで順番に作り上げてきたGyudon型をWebアプリケーションサーバとして起動する方法を確認してもらいます。
本章までを通して、Go言語の基本的な扱い方を学習した皆さんには、最も簡単な章かもしれません。

# 準備

複数のターミナルを用い、ハンズオンいただきます。
既存のコンテナに接続し利用するため、それぞれターミナルを起動し、以下コマンドを実行ください。
VSCodeをお使いの方はターミナルを追加で起動してください。

“`terminal
:# TERMINAL 1
$ docker exec -it go-tutor /bin/bash

:# TERMINAL 2
$ docker exec -it go-tutor /bin/bash
“`

# httpを起動する方法

Go言語の標準パッケージ [net/http](https://pkg.go.dev/net/http)を活用するだけで起動します。
特に細かい処理に拘らず、デフォルト動作でWebアプリケーションサーバをコーディングするのであれば、

元記事を表示

[MAC OS]VSCodeでGolangの環境構築してHelloWorld出力までの記録

## 初めに

今回はVSCodeでgo言語を使用して環境構築〜HelloWorldの出力までの方法を記載していきます。

割と備忘録的な感じになりますが、ご容赦ください。

※筆者ですが、普段はアプリエンジニアをしており、flutterやswiftを弄っていて、goの経験はないのでもし何か間違い等あればご指摘いただけると助かります。。

なお,筆者の環境ですが、以下の通りです。

cpu: **Apple M1**
os: **Monterey**
os version: **12.5**

## 環境構築

まずはgoのダウンロードからです。

以下のURLからアクセスして、ご自身の環境似合った物をダウンロードしてください。

https://go.dev/dl/

ダウンロードできたら、macではターミナル、windowsではコマンドプロンプトを開きます。
“`
go version
“`

と入力して確認します。

インストールされていたら、Goのバージョンが出力されます。

“`
go version go1.14.2 darwin/amd64
“`
※ダウンロー

元記事を表示

Go言語+WindowsTerminalで「ブロック崩し」を作ろうと挑戦したが四苦八苦[termbox-goは未使用]

# 動作画面

![PowerShell-2023-09-18-00-45-01.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/157498/924897a2-6555-6cc9-4fd7-bda33c87d146.gif)

## 説明
– 白棒(バー)は、[a]を押すと左方向、[s]を押すと右方向に動きます。
– ボールは、対角斜め(45度・135度・225度・315度)のみ動きます。
– スタート画面はないです。コンパイルすると、いきなりゲーム開始。
– ブロックを全部消しても、ゲームクリアーにならないです。
– ゲームオーバーも無いです。
– (とりあえず動けば良いということで)

# 車輪の再発明
↓先人が2016年に今回と同じテーマを投稿しており、車輪(タイヤ)の再発名ですが、私個人として「色」と「日本語や絵文字」がGo言語の定番ライブラリ「termbox-go」だと思い通りに使用できなかったので改めて挑戦しました。

https://qiita.com/kurehajime/items

元記事を表示

gormでtime.Time型を使用する

gormでレコード取得をする際に以下のエラーが出ました。

“`bash
sql: Scan error on column index 3, name \”updated_at\”: unsupported Scan, storing driver.Value type []uint8 into type *time.Time
“`

updated_atカラムの型をサポートしてない的なことが書いてあるので少し調べました。

## 解決策

gormの公式ドキュメントにも記載がありましたが、
time.Time型を扱うには、接続時のDSN情報に`parseTime`を指定する必要がありました。

> 注 time.Time を正しく処理するには、パラメータとして parseTime を含める必要があります。 (その他のパラメータ) UTF-8 エンコーディングを完全にサポートするには、 charset=utf8 を charset=utf8mb4 に変更する必要があります。

https://gorm.io/ja_JP/docs/connecting_to_the_databas

元記事を表示

goでパスワードを平文ではなくハッシュ化して保存し、ログインまで行う

goでパスワードのハッシュ化と、
ハッシュ化したパスワードを使用してログイン機能作ってみたかったので、
テスト的ではありますが作ってみました。

## 実装

ハッシュ化と称号に関しては`bcrypt`を使用します。

“`bash
$ go get golang.org/x/crypto/bcrypt
“`

https://pkg.go.dev/golang.org/x/crypto/bcrypt

リクエストで文字列のパスワードを受け取ってハッシュ化する関数は以下のような形。
`bycrypt.GenerateFromPassword()`で文字列をハッシュ化します

“`go
func encryptPassword(password string) (string, error) {
// パスワードの文字列をハッシュ化する
hash, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)
if err != nil {
return “”, err
}
retur

元記事を表示

Go言語を学んでみる #3

for文等の繰り返し処理、分岐処理のあたりのまとめ。

# For
“`
for i := 0; i < 10; i++ { sum += i } ``` 値の初期化・条件式・後処理の部分は割と他の書き方と一緒。 違いはカッコが無いくらい? ``` func main() { sum := 1 for ; sum < 1000; { sum += sum } fmt.Println(sum) } ``` 条件式以外は任意で、省略することも可能。 ``` func main() { sum := 1 for sum < 1000 { sum += sum } fmt.Println(sum) } ``` セミコロンまで省略できちゃう。便利。 これでC言語にある`while`と同じような処理ができる。 ``` package main func main() { for { } } ``` こうすれば無限ループも作れちゃう。らくちん。 # If ``` func sqrt(x float64) string { if x < 0 { ret

元記事を表示

Go言語を学んでみる #2

# Go Tour
ブラウザ上でもできるけど、Go言語をインストールすればローカルでもGo Tourが実行できるらしい。

せっかくだからローカルでやってみようかな。

ダウンロードは済んでいるので、コマンドラインで以下のコマンドを実行。

“`
go tool tour
“`
動かない。
もう一つ記載されているコマンドを実行。

“`
go get github.com/atotto/go-tour-jp/gotour
gotour
“`

やっぱり動かない。
仕方ないので別サイトを調べてみる。

https://learning-collection.com/go-tour%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9%EF%BC%88%E3%82%B9%E3%82%BF%E3%83%B3%E3%83%89%E3%82%A2%E3%83%AD%E3%83%B3%EF%BC%89/

このサイトのやり方でうまくいきました。

完了すると、ブラウザ上にA Tour og Goが立ち上がる。

# Go言語の構成
パッケージ(`package`)で

元記事を表示

Go×vscodeを使用してtestingを実行する際の環境変数を設定する

# 初めに
Go×vscodeを使用してtestingを実行する場合に下図のような「run test」などが表示される。
![スクリーンショット 2023-09-15 12.34.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/952574/14fba813-5d17-c3f3-bc12-bb86658b26d9.png)

その際に環境変数する必要があったので方法を記載する。

# やってみる
まず任意のディレクトリにenvファイルを作成する
“`
% touch .env
“`

envファイルに任意の変数を定義する。
“`.env
ENV=local
“`

vscodeの設定ファイルを開く。
macの場合は`command` + `,`で設定ファイルを開く

`go configuration`で検索して`setting.json`を編集する
![スクリーンショット 2023-09-15 12.42.43.png](https://qiita-image-store.s3.ap-no

元記事を表示

ざっくりDDD・クリーンアーキテクチャにおける各層の責務を理解したい②(インフラストラクチャ層・プレゼンテーション層編)

# 概要

弊社で開発中のプロダクトは、ドメイン駆動設計とクリーンアーキテクチャを組み合わせた設計となっています。
これまでフロントエンドの開発を担当することが多かった中で、golangでのAPI開発を担当した際に、「この処理はRepositoryに書くべき?」「Usecaseにこの処理を書いたら責務を持たせすぎ?」「Domain ServiceとUsecaseはどう分ける?」など迷うことが多々ありました。

そこで、これら設計に関する考え方を整理するために具体的な実装を踏まえてこの記事を書いています。
この記事は第二回です。第一回[(記事はこちら)](https://qiita.com/kotobuki5991/items/22712c7d761c659a784f#%E3%81%BE%E3%81%A8%E3%82%81)ではドメイン層・ユースケース層について触れています。

# DDD(ドメイン駆動設計)とは

> ドメインの専門家からの入力に従ってドメインに一致するようにソフトウェアをモデル化することに焦点を当てるソフトウェア設計手法である。
>[ドメイン駆動設計](https:

元記事を表示

go基本構文メモ

すぐ見れるようにメモしておく

## for
“`go
for i := 0; i < 10; i++ { sum += i } ``` ## if ```go if x < 0 { return sqrt(-x) + "i" } ``` ### if short style ```go if v := math.Pow(x, n); v < lim { return v } ``` ### if and else ```go if v := math.Pow(x, n); v < lim { return v } else { fmt.Printf("%g >= %g\n”, v, lim)
}
“`
https://go-tour-jp.appspot.com/flowcontrol/7

## Switch

### switch
“`go
switch os := runtime.GOOS; os {
case “darwin”:
fmt.Println(“OS X.”)
case “linux”:
fmt.Print

元記事を表示

OTHERカテゴリの最新記事