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

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

AWS S3ライフサイクルによるObject削除

# AWS S3ライフサイクルによるObject削除

特定のオブジェクトをFilterで削除するための方法をJava, Go, C#で残しておく。

## Java

以下はJavaを使用してAWS S3にファイルをアップロードする際にTTLを付与する方法。

### ライフサイクル設定のコード

“`java
import com.amazonaws.ClientConfiguration;
import com.amazonaws.auth.DefaultAWSCredentialsProviderChain;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.*;

public class S3FileUploadExample {

public static void main(String[] args) {
String bucke

元記事を表示

チーム開発参加の記録【2023-06~2023-08】(5) gocronでスケジュール処理し、定期的にバッチジョブを起動してみた

あるオンラインサロンでチーム開発に参加しています。
私はチーム03のバックエンド側メンバーに加わりました。
チーム03のバックエンドは、Go+Gin+sqlc、DBはPostgreSQLを使うことになりました。
チーム開発に参加しながら、私の学習の軌跡を記事にしていきます。

# 本シリーズのリンク

– [チーム開発参加の記録【2023-06~2023-08】(1) Go+Ginで画像をダウンロード/アップロードするAPIを作る](https://qiita.com/kanedaq/items/7c4c91def6590dc94d06)
– [チーム開発参加の記録【2023-06~2023-08】(2) sqlc + jackc/pgx/v5(v5.4.0)を使ってみた](https://qiita.com/kanedaq/items/dcc6b3e50a0b2690033d)
– [チーム開発参加の記録【2023-06~2023-08】(3) sqlc + jackc/pgx/v5(v5.4.1)からPostgreSQLの複合型の配列を使ってみた](https://qiita.co

元記事を表示

負荷ツール vegeta を使って multipart/form-data で画像を送る方法

## はじめに
負荷テストツールの vegeta を使った画像を送る API のパフォーマンステストを実施したときに、
multipart/form-data で画像を送る設定に詰まったので、備忘録として記録します。

## vegeta とは
**あのベジータ**から名前を取った、 golang 製の負荷テストツールです。
https://github.com/tsenart/vegeta

## やり方
### 概要

テキストファイルを作ることで、 vegeta で POST API をテストする際の、パラメータを設定することが出来ます。

### body.txt を作成する

画像のバイナリデータをテキストファイルに入れる際に、 Go で以下のようなコードを書いて、 body.txt を作成します。

“`go
package main

import (
“bytes”
“fmt”
“io”
“io/ioutil”
“mime/multipart”
“os”
)

func main() {
// 送信するバイナリデータ
i

元記事を表示

GraphQL、Go、React、TypeScriptを使ったTodoアプリの開発(バックエンド編)

# はじめに

GraphQLをハンズオンで学ぶためにTodoアプリを作ってみました。
本記事ではpart1として、GraphQLクエリを使ったTodoアプリのバックエンド開発手順をまとめました。

### 使用した技術スタック

言語:Go、TypeScript
ライブラリ:React、gqlgen、codegen、xorm
DB:Postgres

gqlgenとcodegenはGraphQLのスキーマ定義から、それぞれGoとTypeScriptのコードを自動生成してくれるライブラリです。
xormはgoのORMライブラリで、DBにはPostgresを使用しました。

# Todoアプリの概要

Todoアプリの完成イメージはこちらです。本記事ではこのバックエンド部分についてハンズオン形式でまとめます。
※Chromeのプラグインで[GraphQL Network Inspector](https://chrome.google.com/webstore/detail/graphql-network-inspector/ndlbedplllcgconngcnfmkadhokfaal

元記事を表示

【Go】Go+Gin+GORM+PosrgraSQLでAPIサーバつくる

## はじめに
? 文法についてはこちら

https://qiita.com/HiromuMasuda0228/items/65b9a593275f769f6b69

GoでAPIを作ります。
以下など参考になりますが、Goになれてないころに実装してみたら
DB接続等で結構ハマったので、要所を解説していきます

https://qiita.com/ozora/items/0597e52b3f9c1759e292

## ライブラリを入れる
`go install`のほうが良いらしいですが、参考にした資料がのきなみ`go get`なのと、一部うまくいかないものもあったのでコマンドはよしなに。
“`.sh
# gin
go install github.com/gin-gonic/gin@latest
# cors設定
go get github.com/gin-contrib/cors
# postgresドライバ
go get github.com/lib/pq
# ORMapper
go get github.com/jinzhu/gorm
# WebSocket
go get

元記事を表示

【Golang】time.Duration のフォーマット出力【経過秒から H:m:s.ms 形式で出力】

> 経過秒の文字列 “`1472.46s`” を、**”`00:24:32.460`” の書式に変換したい**。

[time.Duration](https://pkg.go.dev/time#Duration) 型は [Stringer インターフェースを実装している](https://pkg.go.dev/time#Duration.String)ため、`fmt.Print` 系で、ある程度のフォーマットをしてくれます。しかし、`Duration.String()` では、**出力の書式が欲しいものと違う**のです。

“`go
timeDur, _ := time.ParseDuration(“1472.46s”)
fmt.Println(timeDur)
// Output: 24m32.46s
“`

“`24m32.46s`” ではなく “`00:24:32.460`” の書式で欲しいのです。

[「golang “time.Duration” 経過秒からフォーマット出力」でググって](https://www.google.com/search?q=golang+%2

元記事を表示

46,000件のテストケースでgo testのビルドを高速化する

# ことの発端
新卒2か月目にして、早速開発者テストで考慮漏れを発生させた私。
「顧客が組んだ計算式の動作を担保するUT(ユニットテスト)を書く」という防止策の対応が急務でした。

無限に増えていくテストケースとの格闘、PICTやテスト手法の学習等、色々あった結果、全ての網羅は出来ないという結論にたどり着きました。
最低限担保する部分を決めてテストケースを出してみると46,000件になりました。
# 46,000件のテストケースを実行しなければならない
今回のテストケースとしては、実行する式、取りうる引数の値、期待する計算結果の3つを保持しておく必要がありました。
保持する方法としては、以下の2つを考えた結果
– protobufを使用する方法
– golangコードを生成する方法

binaryファイルにすると型情報が欠落してしまい上手くテストケースを表せなかったことから、golangコードを自動生成する方法に決定しました。
golangコードで46,000件テストケースを生成する手法は今回割愛させていただきますが、無事テストケースを生成する事はできました。

今回のテストケースを表

元記事を表示

Goのレシーバを理解する

## 想定する読者
Javaはわかる、Goのレシーバをどう使うのか、な人

## 「任意の型に特化した関数」がポイント

以下の記事では、`任意の型に特化した関数を定義するための仕組み`と説明されている
これが全て。

https://qiita.com/HiromuMasuda0228/items/65b9a593275f769f6b69#%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89-method

## つまりクラス
Goには`class`はないが、

`user.Get`、`user.Post`
`address.Get`、`address.Post`のように「まとまり感」を作りたい場合がある

以下のコードで説明する。
語弊を恐れずに、Javaとして読んでみて欲しい。

“`go
// レシーバのための型 → つまりこれがクラスってこと
type usr struct {
memberArg string // メンバ変数
}

// クラスで実装するメソッドの、interfaceを定義
type Usr interface {
Get()

元記事を表示

最近ハマっているGo言語で単体テストを書くまでを整理してみた

# はじめに

単体テストを書くときにパターン化されて作るようになってきたのでここらでちょいと言語化してみようと思い記事にしてみました。(ほぼ自分用のメモです。)

# ライブラリ

## golang/mock (uber/mock)

https://github.com/golang/mock

モック用ライブラリです。2023年6月28日をもって Public archive となってしまいました。

> Update, June 2023: This repo and tool are no longer maintained. Please see go.uber.org/mock for a maintained fork instead.

https://github.com/uber/mock

> This project originates from Google’s golang/mock repo. Unfortunately Google no longer maintains this project, and given the heavy usag

元記事を表示

Go言語とChatGPTで簡単に好きなキャラクターと会話できるライブラリ作った

## はじめに
ChatGPTは様々な応用機能が生まれています。
その中でも個人的にとてもワクワクしたのは、キャラクターと会話できるというものです。
今回は簡単にキャラクターを作るためのGoライブラリを作ったので、実際に試してみました。

## ライブラリ
https://github.com/ryomak/charachat-go

## 実際にキャラクターを作って試す

[Ojichat](https://github.com/greymd/ojichat)のようなキャラクターを作ってみます。

“`go
package main

import (
“context”
“fmt”
“github.com/ryomak/charachat-go”
)

func main() {
personality, err := charachat.
PersonalityBuilder().
WithName(“おじさん”).
WithMe(“おじさん”).
WithUser(“オマエ”).
WithUserCallingOut(“ちゃん”).
With

元記事を表示

ChatGPTめっちゃ痩せたいです

初めまして。HRBrainでソフトウェアエンジニアをしているビクトルと申します。

最近ChatGPTが人気になって、私はChatGPTのAPIを試して遊びたいと思っていました。私を知ってる人は筋トレマニアという印象を持っているのでChatGPTに栄養指導をしてもらおうと思っています。

最初にどんなことを考えましょ

– ChatGPTのAPI権限周りを研究
– [ChatGPTのライブラリを調べ](https://platform.openai.com/docs/libraries)
– ChatGPTのリスポンスとリクエストを研究
– APIのコスト

![Screenshot 2023-06-16 at 14.04.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961977/ce4b9a91-165b-5216-9e0f-23d7dec233cb.png)

😥

今回の目標はシンプルなサービスを作ることだけではなく、爆速で開発をすることです(一週間以内に全部終わりたいです)

元記事を表示

【Golang】Echoのテンプレートレンダリングでちょっとはまった話

https://echo.labstack.com/guide/templates/#template-rendering
上記を参考に実装したがInternal Server Errorが出てしまってちょっぴりつまずいたところの記事。

## 結論だけ知りたい人向け
“`c.Render(http.StatusOK, “index”, nil) // no data passed“`
で本来”index.html”として指定すべきところを”index”として指定していた。
indexとして指定するのであれば、表示させたい箇所(基本的には対象のファイルの全部だと思うが)を
{{define “index”}}と{{end}}で囲む必要があった

## ソースコード
フォルダ構成はこんな感じ
├─public
│ └─views
│ └─ index.html
└─main.go

ソースコードはそれぞれ以下のように記述

main.go
“`
package main

import (
“html/template”
“io”
“net/http”

“git

元記事を表示

gormを使ってみた

### はじめに
WebカメラのサイトのサムネイルのURLを格納しているテーブルを参照し、それぞれの画像をダウンロードして保存するプログラムを作成した。テーブルの参照、更新はgormを使用したが、思ったより使うのがしんどかった。

### 環境
* go 1.17 → go 1.20
* Windows 10
* PostgreSQL 14

### golangのバージョンアップ
プログラムを作る以前にgormのインポートからうまくいかず。
gorm.io/driver/postgresをインポートしようとして、go getしようとしたが、エラー。1.17から1.20にアップデートして解消した。
“`batch
go get gorm.io/driver/postgres
C:\Users\xxxx\go\pkg\mod\github.com\jackc\pgx\v5@v5.3.1\pgtype\builtin_wrappers.go:9:2: package net/netip is not in GOROOT
(C:\Program Files\Go\src\net\ne

元記事を表示

【チュートリアル】GoとGinを使ったRESTful API開発のチュートリアルで詰まったところ

Goの勉強を始め、基本的な文法はさらったので**API**の勉強をしてみたいと思い、以下のチュートリアルをしてみました。

https://go.dev/doc/tutorial/web-service-gin

割と簡単にAPIの実装の仕方を学べたのでおすすめ。
本記事ではわからなかった単語や詰まったところについてまとめておきます。
ぜひ参考にしてください。

# “go mod tidy”と”go get .”の違い

– go mod tidyはモジュールの依存関係を更新するため
– go get .は実際モジュールをインストールするため

go mod tidyコマンドは、**モジュールの依存関係**を解決し、go.modファイルとgo.sumファイルを最新の状態に更新します。
go get .コマンドは、現在のディレクトリにあるパッケージとその依存関係を**ダウンロードし、インストール**ます。

# MustBindWith機能
MustBindWithは、指定されたバインディングエンジンを使用して、**渡された構造体ポインタにデータをバインドする機能**です。

**バイ

元記事を表示

AWSのサポート切れをきっかけに、画像の透かし入れ機能をレガシーシステムからサーバーレスに切り替えた話

# 背景

[こちらの発表](https://aws.amazon.com/jp/blogs/news/tls-1-2-required-for-aws-endpoints/)のとおりAWSでは今後TLSのバージョンが1.2未満の通信を許可しなくなるため、影響を受けるシステムは修正しないと使えなくなります。

長年メンテナンスせずに放置されてきたシステムは簡単には更新できず、画像の透かし入れぐらいの機能なら、サーバーレスで完全に作り直した方が良いのでは?ということで実装してみることになりました。

# 切り替えることによって得られたメリット

## 保守性の向上

大昔から存在する古臭いJavaのアプリケーションをサーバーレスに切り替えたことにより、コードベースが大幅に削減されました。解読することが大変な状態から100行未満の簡単なスクリプトに変わったため、非常に保守しやすくなりました。

## スケールアウト

サーバー上で稼働するWebアプリケーションをサーバーレスに切り替えたことにより、サーバーの負荷、適切なスペックを気にする必要がなく、全てはAWSが管理しているため、*サービス

元記事を表示

Go のエラー処理の良さについて

# はじめに
Go のエラー処理とその特殊なエラー処理のやり方のメリットについて説明します。
この記事を通じて Go のエラー処理の良さを理解して貰えればいいなと思っています。

なお記事の内容は筆者の個人的な考えに基づくところが多く根拠薄い主張が多くなされているのであらかじめご注意ください。

# Go のエラー処理

Go には例外というものがありません[^1]。関数がエラーを起こしたかどうかは返り値で表現します。

例を見ながら説明していきます。

次の `FuncA()` はなにか処理を実行して正常に終了したときには特に値を返さない関数です。ただしエラーが発生する可能性があります。
“`go
func FuncA() error {
if /* 正常ケース */ {
return nil
} else { // エラーケース
return error.New(“error!”)
}
}
“`
この場合、返り値の型は `error` のみで、正常なときには `nil` を、エラー時にはエラーを返すことになります。

Go は多値返却ができます。関数

元記事を表示

Go vs Java: メモリ管理とランタイムの違い

## はじめに
プログラムを書く言語はたくさんあり、それぞれの言語はメモリ管理に独自のアプローチを取ります。この記事では、GoとJavaのメモリ管理とそれぞれのランタイム環境について詳しく解説します。

## メモリの基本
プログラムを実行すると、新しい変数を作るたびにメモリが割り当てられます。このメモリ空間には、変数のデータが保存されます。RustやCなどの言語では、メモリ管理はほぼ手動です。これらの言語では、プログラムが直接メモリを割り当て、後でそのメモリを解放します。

## Javaとメモリ管理
Javaはガベージコレクションを行う言語で、メモリ管理は自動化されています。Java Virtual Machine(JVM)がメモリの割り当てと解放を行います。Javaプログラムを実行すると、JavaバイトコードがJVM内で動作する小さな仮想マシンが作成されます。これは、Javaプログラムが複数のプラットフォームで実行可能にする一方で、実行時のオーバーヘッドを生み出します。

## Goとメモリ管理
GoはJavaと同様にガベージコレクションを行う言語ですが、Javaとは違い、J

元記事を表示

REST APIとは && Goサンプルコード

REST (Representational State Transfer) APIは、Webサービスの設計アーキテクチャの一形態です。RESTは、HTTPプロトコルを通じてクライアントとサーバー間の通信を行うためのソフトウェアアーキテクチャのスタイルです。

REST APIは、リソース(データや機能)を一意のURL(Uniform Resource Locator)で識別し、HTTPメソッド(GET、POST、PUT、DELETEなど)を使用してリソースに対する操作を実行します。クライアントはHTTPリクエストを送信し、サーバーはHTTPレスポンスを返します。

REST APIは、多くのWebサービスやアプリケーションで広く使用されており、データの取得、作成、更新、削除などの基本的な操作を提供します。また、異なるプログラミング言語やプラットフォーム間での相互運用性を可能にするため、標準的なインターフェースとして広く採用されています。

例えば、REST APIを使用して、Webアプリケーションから特定のユーザーのデータを取得する、新しい投稿を作成する、既存のデータを更新するなどの

元記事を表示

【前編】Go + MySQL + React + Docker開発環境構築

### 【本記事の概要】

本記事ではGo + MySQL + React + Dockerでの開発環境を構築を行う記事の前編です。前編ではGo + MySQL + Dockerで構築を行い、後編でReactの設定をしていきたいと思います。前編の完成形は以下の4点を満たした形にしています。

● localhost:8080にて「Hello, World!」と表示される。

● MySQLとの接続ができており、ログに「Connected」と表示される。

● Goの外部パッケージであるEcho・GORMが使用できている

● コードの変更のたび、ビルドが行ってくれるAirが起動している。

### 【フォルダ構成】

前編である本記事では以下のようなフォルダ構成にしております。「front」フォルダについては現時点では必要ありませんが、後編にて使うので今のうちに作っておきます。

※ 「tmp」フォルダはこの後導入するAirを実行すると自動で作成されるのでdockerの立ち上げ前に作っておく必要はないです。

※ 「README.md」についても必須というわけではないです。

“`g

元記事を表示

ちゃんと理解するGo言語開発環境構築:go mod initとその必要性

## はじめに

Go言語(通称Golang)は、高速で堅牢なプログラムを書くためにGoogleによって開発された静的型付けされた言語です。しかし、初めてGo言語に触れるとき、`go mod init` というコマンドに遭遇し、何をしているのか混乱するかもしれません。この記事では、そのコマンドが何であるか、またそれがなぜ必要なのかを詳しく説明します。

## Goモジュールとは何か?

Go言語では、コードのパッケージを整理し、バージョン管理するために**モジュール**という概念が導入されています。モジュールはGoのコードの集合で、特定のディレクトリ内に配置されます。各モジュールは一意の名前を持ち、それを通じて他のモジュールから参照されます。

## go mod initとは何か?

`go mod init` は、新しいGoモジュールを初期化するためのコマンドです。このコマンドを実行すると、モジュール名をパラメータとして受け取り、その名前で新しいモジュールを作成します。さらに、このコマンドは`go.mod`という特別なファイルを生成します。このファイルには、モジュール名とモジュール

元記事を表示

OTHERカテゴリの最新記事