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

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

ざっくり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自

元記事を表示

現場で使いそうなので、GoのAPI入門する

APIの実装やブロックチェーン系のプロジェクトで

Goが現場で使われてるのを良く見るようになりました。

入門しましょう。ChatGPTに書かせます。

# プロジェクトディレクトリと必要なファイルを作成

以下の構造でプロジェクトディレクトリを作成します:

“`bash
mkdir -p go-todo-api
cd go-todo-api
mkdir db
touch docker-compose.yml
touch db/init.sql
touch main.go
“`

# Docker Compose ファイルの作成

docker-compose.yml ファイルに以下の内容を記述します:

“`docker
version: ‘3.8’

services:
app:
image: golang:1.17
volumes:
– .:/go/src/go-todo-api
working_dir: /go/src/go-todo-api
command: go run main.go
depends_on:

元記事を表示

GoでWebアプリケーションを作る(6)ー構造体

こんにちは。

今日は「構造体」についてです。

# 構造体とは

構造体は、任意の定義ずみの型を0個以上まとめることが可能な型です。
例えば、既存の型では収められる量が不足する際に扱います。
int64では、最大約923京`(9,223,372,036,854,775,807)` の京の桁(10^16)まで表せますが、1那由多(10^60)は、表すことができません。
int64をいくつか組み合わせ、このint64は、1の位から。このint64は、垓(がい)の位から。と役割を決めていくことで、1那由多以上を表せる型を定義できます。

## 構造体の定義

Go言語では、`type`から始まる形で、名前付きの型を定義できます。

“`go
type <名称> <型>
“`
構造体の定義は、型部分に、予約された表現である、`struct {}`を用い定義します。
(変数に直接代入する構造体の定義方法もありますが、本講義ではふれません。)
“`go
type <名称> struct {
[<名前> <型>] //要素1
[<名前> <型>] //要素2
#…省略
}
“`

元記事を表示

Go言語でOG:image用の画像を生成するAPIを作成してみた

# はじめに
おそらく、やい、確実にNode.js系のライブラリを使って作成した方が簡単だと思います
Goでももっと簡単に直感的に作る方法はあると思いますが

# リポジトリ

https://github.com/chihiros/example-og-image-api

# まず、はじめにFigmaでレイアウトを決める

1. 1200×630の画像を作成します(なんか1200×630が推奨サイズらしいから)
1. ほか色々とレイアウトを決めましょう
1. フォントの種類・文字の太さ・文字を折り返す長さを決める
1. 今回は910px以上の文字サイズになったら折り返すようにしました
1. タイトル:[` Noto Sans Japanese – Midumu`](https://fonts.google.com/noto/specimen/Noto+Sans+JP) を使っています
1. ユーザー名:[` Noto Sans Japanese – Regular`](https://fonts.google.com/noto/specimen/Noto+S

元記事を表示

Docker imageからDockerfileを抽出する

## 目的
Pullしてきたイメージが中で何をしているのかを確認したい場合があるので、今回はその方法を備忘録として残しておく

## 方法1 (docker history)
“`bash
docker history –no-trunc | tac | tr -s ‘ ‘ | cut -d ” ” -f 5- | sed ‘s,^/bin/sh -c #(nop) ,,g’ | sed ‘s,^/bin/sh -c,RUN,g’ | sed ‘s, && ,\n & ,g’ | sed ‘s,\s*[0-9]*[\.]*[0-9]*[kMG]*B\s*$,,g’ | head -n -1
“`


“`bash
root@shoma:/home/shoma/wireguard# docker history –no-trunc ghcr.io/linuxserver/wireguard | tac | tr -s ‘ ‘ | cut -d ” ” -f 5- | sed ‘s,^/bin/sh -c #(nop) ,,g’ | sed ‘s

元記事を表示

GoでPDFファイルを作成し、Zip化する

## はじめに
標題通り、GoでPDFファイルを作成し、Zip化する記事です。本記事では、PDFをzipに直接保存する事でディレクトリにPDFファイルを保存しない方法です。

## 実装
“`shell:ディレクトリ構成
~/go/src/go_pdf_zip$ tree
.
├── go.mod
├── go.sum
├── main.go
└── sample.zip
1 directory, 4 files
“`

“`go:main.go
package main

import (
“archive/zip”
“bytes”
“fmt”
“io”
“os”

“github.com/jung-kurt/gofpdf”
)

func createPDF() (*bytes.Buffer, error) {
var buf bytes.Buffer

pdf := gofpdf.New(“P”, “mm”, “A4”, “”)
pdf.AddPage()
pdf.SetFont(“Arial”, “B”, 16)
pdf.Cell(40, 10, “

元記事を表示

GoでPDFを作成する

## はじめに
表題通り、GoでPDFを作成する記事となります。

## 成果物
“`shell:ディレクトリ構成
~/go/src/go_pdf$ tree
.
├── example.pdf
├── go.mod
├── go.sum
└── main.go

1 directory, 4 files
“`

“`go:main.go
package main

import (
“fmt”

“github.com/jung-kurt/gofpdf”
)

func main() {
// PDFを新規作成
pdf := gofpdf.New(“P”, “mm”, “A4”, “”)
pdf.AddPage()

// フォントの設定
pdf.SetFont(“Arial”, “B”, 16)
pdf.Cell(40, 10, “Hello World”)

// ファイルに保存
err := pdf.OutputFileAndClose(“example.pdf”)
if err != nil {

元記事を表示

Golangでファイルをzip化する

## はじめに
表題通り、Golangでファイルをzip化します。

## 成果物
“`shell:ディレクトリ
~/go/src/go_zip$ tree
.
├── files
│ ├── pdf1.pdf
│ ├── pdf2.pdf
│ └── pdf3.pdf
├── go.mod
├── main.go

1 directories, 5 files
“`

## 1ファイルのみZip化
“`go:main.go

func main() {
// ZIPファイルの作成
zipFile, err := os.Create(“output.zip”)
if err != nil {
fmt.Println(err)
return
}
defer zipFile.Close()

// ZIPライターの初期化
zipWriter := zip.NewWriter(zipFile)
defer zipWriter.Close()

// PDFファイルをZIPに追加
if err := addFileToZip(“files/pdf1

元記事を表示

GoでGraphQLを導入する

今回は`gqlgen`を使ってGraphQLのサーバーを立ち上げるまでのチュートリアルを作成していきます

– Github: https://github.com/tf63/go-graph-exp

– 実行環境: https://github.com/tf63/go-graph-exp/blob/main/docker/backend/Dockerfile

### GraphQLってどういうもの?
RESTとの違いを示します

REST
– 複数のエンドポイント
– エンドポイントごとに固定のデータを取得
– HTTPメソッドによって実行する処理を決定
– HTTPステータスコードでエラーハンドリング
– 型定義があいまい

GraphQL
– 単一のエンドポイント
– エンドポイントから必要なデータを指定して取得
– query, mutationによって実行する処理を決定
– メッセージでエラーハンドリング
– 型定義が厳密

RESTでは,クライアントが必要なデータを取得するために複数のエンドポイントから過剰なデータを取得していました

GraphQLでは,クライアントは

元記事を表示

[Go]並行処理

# 概要

* [前回](https://qiita.com/hasesiu/items/9d4298826bd7e791bd65)の続き
* 今回は並行処理について学習
* Goの並行処理はシンプルとのこと
* ゴルーチン、チャネル、select等の新しい用語が出てきた

参考

https://www.oreilly.co.jp/books/9784814400041/#

# 並行処理について

* Goの並行性はスレッドのロックによるデータ共有ではない
* Goの並行性のモデルはCSP(Communicating Sequential Processes)
* 独立したプロセス群がメッセージパッシングを使用して相互にやり取りをする仕組みらしい

https://ja.wikipedia.org/wiki/Communicating_Sequential_Processes

* 並行性と並列性は異なる
* 並行性はコードの性質を指し、並列性は動作するプログラムを指す
* 並行処理を実装しても、必ずしも並列で動作するとは限らない
*

元記事を表示

ARMのLXDでlxdcliを用いてgo+python開発環境を作る

## 目的
以前、dockerで同じ様な環境を作ったが開発環境としては物足りない部分があった。LXD上で構築すれば解決すると考えた

## 構築
lxdfile

“`bash
CONTAINERNAME ubuntu-go
FROM ubuntu/23.04

RUN export DEBIAN_FRONTEND=noninteractive
RUN timedatectl set-timezone Asia/Tokyo && hostnamectl set-hostname ubuntu-go
RUN apt-get -y update

RUN dpkg –configure -a
RUN echo “\n\n\n” | apt-get -y install openssh-server
RUN apt-get -y install docker docker.io docker-compose nano curl

RUN echo -e “root:password” | chpasswd
RUN echo -e ‘PermitRootLogin yes’ >> /e

元記事を表示

echo(go-lang)のプロキシをnginxで構築する

## 目的
echoに対するアクセスログを取得したい時に、nginxをプロキシとして構築する。

## 構築
“`conf
server {
listen 80 default_server;
listen [::]:80 default_server;

server_name www.example.com
location /api/ {
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection “upgrade”;
proxy_set_header Host $host;

proxy_pass http://golang:8080/;
}

location / {
root /var/www/html;
index index.html;
}
}
“`

元記事を表示

Golang: agoutiを使用してAKASHIの勤怠ボタンを押せるようにしてみた

## 概要

ブラウザ操作をやってみたかったので、
毎日勤怠管理で使用しているAKASHIのボタンを自動ブラウザで押せるようなアプリケーション作ってみました。

Goを使用した背景は、Goで書きたかったからです笑
実際のコード見たい方がいらっしゃいましたら、別途GitHubのリポジトリ公開しようと思います。

## 実装環境

– macOS Monterey(12.2.1)
– Goland
– go version go1.20 darwin/arm64

## 使用フレームワーク

### 1. agouti

Golangでブラウザ操作してくれるやつ。

https://pkg.go.dev/github.com/sclevine/agouti

“`bash
% go get https://pkg.go.dev/github.com/sclevine/agouti
“`

今回はChromeを使用するので、事前にChrome Driverもインストールしておきます。

“`bash
% brew install chromedriver
“`

### 2. go

元記事を表示

OTHERカテゴリの最新記事