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

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

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

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

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

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

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

元記事を表示

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

元記事を表示

GoとSpannerでフラグをビット管理

## はじめに

ふと大量のフラグを持っているテーブルを見かけて、どうにかできないかなーと考える機会がありビットで管理することで保守性が高くなるのではと思い考えの整理とアプトプットのため記事を書きました。

## 利用言語/ツール

– Go
– Spanner

## サンプルコード

https://github.com/boxkot11p/bit-flag-pattern

## bool値でのフラグ管理

テーブル定義を行い際にフラグを持たせるとすると下記のようなパターンが一般的だと思います。

“`sql
CREATE TABLE Users (
UserId STRING(64) NOT NULL,
Name STRING(128) NOT NULL,
EntranceNormalFlag BOOLEAN NOT NULL,
EntranceSpecialFlag BOOLEAN NOT NULL,
EntrancePremiumFlag BOOLEAN NOT NULL,
) PRIMARY KEY(UserId);
“`

カラムが何の意味を持っ

元記事を表示

Golangのデータフレームライブラリでデータの結合処理

Golangのデータフレームライブラリ [QFrame](https://github.com/tobgu/qframe)を扱っています。

高速でメソッドチェーンができるのが気に入っているのですが、込み入ったことをしようとすると複雑なコードを書かなければならなくなり、割と大変でした。

この記事では2つのデータフレームの結合を行いたい場合のなんとかやってみたコードを書きました。

サンプルデータのtestpidとteststockを左結合したいです。
要するに、teststockに品名と型式の情報をtestpidから持ってきたいのです。

“`go
package main

import (
“fmt”

“github.com/tobgu/qframe”
)

var (
testpid = qframe.New(map[string]interface{}{
“品番”: []string{“AAA-100”, “AAA-200”, “AAA-300”, “BBB-100”, “BBB-210”},
“品名”: []string{“製品1”, “製品2”, “製品

元記事を表示

【Go】mapや構造体を読みやすい形で標準出力させたい!!

# はじめに

こんにちは、ken です。お仕事ではよく Go を書いています。
突然ですが、コーディングをしているときに「この変数がどんな状態なのか確認したい」と思って、一時的に標準出力することってありますよね。
例えば WebAPI を呼び出すとき、レスポンスがどんな形で送られてくるのかを見たくなる機会は少なくないはずです。
しかし、ただ `fmt.Println` をするだけだとちょっと見にくいときがあります。今回はそれを見やすくする方法を先輩から教えていただいたので紹介したいと思います。

# fmt.Println だけだといかに見にくいか

まず、`fmt.Println` だけでの出力がいかに見にくいかを示します。
例として [PokeAPI](https://pokeapi.co/) という ポケモン の情報を呼び出す API を叩いてピカチュウの情報を取り出し、それを `fmt.Println` で標準出力します。

“`go
package main

import (
“bytes”
“encoding/json”
“fmt”
“io”
“net/ht

元記事を表示

【Go】log.Printとlog.Printlnの違い (実はどちらも改行される)

# はじめに
こんにちは、kenです。お仕事ではよくGoを書きます。
突然ですが、みなさんは`log.Print`と`log.Println`の違いを即座に答えられますでしょうか。

**「log.Printは末尾に改行が入らなくて、log.Printlnは改行が入るんでしょ…」**

私もそう思っていたのですが、実は`log.Print`と`log.Println`はどちらも末尾に改行が差し込まれます。

では一体この2つは何が違うのでしょうか。この記事はそんな小ネタの紹介をしたいと思います。

# ほんとに`log.Print`にも末尾に改行が入るの?
**「`log.Println`の『`ln`』は末尾に改行が入るという意味の『line』から由来しているのでは…?」**

そう信じて疑わない人もいるはずなので実例をお見せしようと思います。
次のコードを実行したときには何が出力されるでしょうか。
“`go
package main

import (
“fmt”
“log”
)

func main() {
fmt.Println(“logパッケージ”)
log.Prin

元記事を表示

Go言語を学んでみる #1

Go言語を使ってシステム開発してみたいと思ったので、まとめてみる。

参考: https://hnavi.co.jp/knowledge/blog/go/

# Go言語とは
– Googleが開発したサーバサイド言語
– シンプルかつ高速な処理が可能
– YouTubeやメルカリの開発で使用されていて、近年注目が集まっている言語のひとつ

# インストール方法
下記リンクからインストーラをダウンロードしてインストール
https://go.dev/dl/

# 学習方法
とりあえず基礎は公式サイトを見てみるのがいい感じ。
https://go.dev/learn/

「Tour of Go」から、ブラウザ上で学習ができる。日本語にも対応。大変便利。

ロードマップのリンクもメモ。英語ができる人はこのロードマップから勉強するのがいいかも。

https://github.com/Alikhll/golang-developer-roadmap/blob/master/i18n/ja-JP/ReadMe-ja-JP.md

ということで次回から実際に公式サイトで学習したことをいろいろメモ

元記事を表示

Telnetが話題になってたのでGoで受信して表示するをやっていきした日記

# いきさつ

https://forest.watch.impress.co.jp/docs/serial/yajiuma/1528962.html

Twitter経由でこんな記事を見かけました。

ある社団法人が公告を行う際に、Telnetという伝統的な技術を使用されたようです。
ターミナルにアドレスとポート番号を打ち込むと、ニフティサーブみたいに文字がパラパラと浮かび上がってきて非常にノスタルジーな気分が味わえました。

今回、皆さんが注目されたのはセキュリティの方、具体的には暗号化通信が堅牢でなかったため指摘が多数相次ぎ、法人側が迅速に修正した、という点と、Telnetの是非だったと思うんですけど、僕は

### え!!!なんじゃこれ!すげぇぇ!どうやって受信してんの!?

という部分だったので、Telnetの正体の興味もさながら、Goの練習に簡単な受信ツールを作ってみました。

### Telnetについてのメモ

・Telnetは伝統的な遠隔通信プロトコルである。IPを使い通信を行う
・SSHと同様に遠隔操作を行う事を目的としているが、SSHと異なる点はTelnet自

元記事を表示

OTHERカテゴリの最新記事