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

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

バックエンド初心者の学生がgRPCを触ってみる

## はじめに
初めましての方は初めまして、土佐犬と申します。
今回は`gRPC`をサクッと触ってみようと思います。
~~簡単なスケジュールアプリをフロントバック両方実装します~~
長くなりそうなので記事を分けます。

今度のハッカソンで`gRPC`使ってみよう!!って話になってるんですがいかんせん知識がないのでそのインプットついでに備忘録としてここに残します

## gRPCとは
そもそも`gRPC`ってなんなんでしょうか
`tRPC`のお仲間ですかね(そもそもtRPCも触ったことないんですが…(近いうちに触りたい))

gRPCとは
> gRPC is a modern open source high performance Remote Procedure Call (RPC) framework that can run in any environment. It can efficiently connect services in and across data centers with pluggable support for load balancing, t

元記事を表示

GoでWebアプリケーションを作る(3)ー変数とその定義方法

こんにちは。

今日は「変数とその定義方法」についてです。

変数とその定義方法についての確認と、変数定義に失敗しているソースコードを修正してもらいます。

# 変数の種類

Go言語は、静的型付け言語であるためコンパイル時に変数に紐付いた型の情報に整合性があるか検証されます。 この講義では深く触れませんが、下にGo言語における方の種類について簡単な説明を記載します。 興味のある方は[公式ドキュメント](https://go.dev/ref/spec#Types)を見てみてください。

– 組み込み型
– 整数
– int,int8,int16,int32,int64
– uint,uint8,uint16,uint32,uint64
– uintptr
– byte
– uint8 のエイリアス(別名)です
– rune
– int32 のエイリアス(別名)です
– 浮動小数点
– float32,float64

元記事を表示

Golangの構文木操作ライブラリdstの紹介

dstとは**Decorated Syntax Tree**の略で、GOの構文木(go/astパッケージ)にファイルの情報を付加したものである。
go/astパッケージではスペースやコメントの情報を持たないので、コードを生成するという目的には適さない。

例えば以下の例の場合、コメントの位置情報を持たないので順序が保存されずに出力の際に壊れてしまう。

“`go
code := `package a

func main(){
var a int // foo
var b string // bar
}
`
fset := token.NewFileSet()
f, err := parser.ParseFile(fset, “”, code, parser.ParseComments)
if err != nil {
panic(err)
}

list := f.Decls[0].(*ast.FuncDecl).Body.List
list[0], list[1] = list[1], list[0]

if err := format.Node(os.Stdout,

元記事を表示

goroutineで並行処理しない処理を作った話

# 初めに
goroutineといえばgolangで並行処理を実装するための言語機能ですが、それを使いあえて並行処理を行わず、Timeoutイベントを取るためだけに使ったコードをシェアします

# 背景
とあるDBサービスのデータをバックアップするために、そのDBサービスが提供するコマンドラインツールを使う必要がありました
ですが、いつまで経ってもレスポンスが返ってこないことがありました

その対応として、一定期間レスポンスが返ってこない場合に、中断しリトライするようにしました

なお、初めは全テーブル並行処理で実行したのですが、DBサービス側での制限があるようで安定したレスポンスが得られなかったので、1テーブルづつの実行に変更しました

“`download.go
// download and return to channel
func worker(table string, dt string, ch chan Result) {

err := exec.Command(“コマンドラインツール”,
“-a”, “aaa”,
“-b”, “bbb”).Run()

元記事を表示

GoでCSVの内容をデータベースに保存する

# 概要
CSV出力って結構いろんなシステムに機能として搭載されてますよね。
そんなCSVですが、あるサービスやシステムからCSVファイルを出力して、全く別のシステムやサービスのDBにその情報を保存しておきたいなんてケースがあるんじゃないでしょうか。

GoでCSVを扱うには標準ライブラリの[encoding/csv](https://pkg.go.dev/encoding/csv)があります。
CSVの内容をDBに保存するにあたって構造体にマッピングできた方が処理が楽なのですが、[encoding/csv](https://pkg.go.dev/encoding/csv)ではマッピングに手間がかかるため、今回はサードパーティのライブラリとして[csvutil](https://pkg.go.dev/github.com/jszwec/csvutil)を使ってDBに保存してみます。

# CSVを扱うライブラリ
ちなみにGoとCSVで検索してヒットするライブラリはgocsvとcsvutilが多数だと思います。
今回csvutilを選んだのには、決定的な理由があります。
それは **C

元記事を表示

Go 言語スプレッドシートライブラリ:Excelize 2.8.0 がリリースされました

Excelize 2.8.0 がリリースされました

Excelize は、純粋な Go で記述されたライブラリで、XLAM / XLSM / XLSX / XLTM / XLTX ファイルの読み書きを可能にする一連の関数を提供します。Microsoft Excel™ 2007 以降で生成されたスプレッドシートドキュメントの読み取りと書き込みをサポートします。 高い互換性により複雑なコンポーネントをサポートし、大量のデータを含むワークシートからデータを生成または読み取るためのストリーミング API を提供します。

場合によっては、既存の Excel ドキュメントコンテンツの読み込み、新しい Excel ドキュメントの作成、既存

元記事を表示

GoでWebアプリケーションを作る(2)ーHello, Worldを作る

こんにちは。

今日は「Hello, Worldを作る」についてです。

Go言語の実行方法とコンパイル方法を確認します。

# Goの実行

## Goを動かす

Go言語で作成されたソースコードの実行方法は2つあります。
ソースコードをコンパイル(`go build`)し、実行形式ファイル(.exe等)を実行する方法と、
ソースコードをスクリプト言語のように実行する`go run`コマンドを用いる方法です。

### 以下のコマンドを実行して、Goを動かしてみよう

“`hello/main.go
package main

import “fmt”

func main() {
fmt.Println(“Hello, World!!”)
}
“`
#### 結果

“`
:# TERMINAL 0

$ go run main.go
Hello, World!!
“`

### 以下のコマンドを実行して、Goをコンパイルしてみよう。

“`
$ go build main.go
$ ls
$ file ./main
$ ./main
“`

#### 結果
“`

元記事を表示

ハッカソンでGoを書いた感想

## TL;DR
+ `interface`の管理がちょっと辛かった
+ pub/prvが大文字小文字は罠
+ `enum`が分かりづらい
+ 後置型宣言好き
+ DB系つらい
+ ロガーいいのありませんか!!!!!

Kloudハッカソン#3 コードでつながる夏の友情物語に出場しました。そこでGoをガッツリ書く機会をもらったので触った感想を書きたいと思います。
Context: 普段はRustやTSを書く人間なので、その視点からの感想になります。

## `interface`について
`interface` はGoにおける多態性を実現するための手段の一つで、「外部から見た振る舞い」の一致するものを内部の内容や実装に関わらず同じものとして扱う機能です。
(あまり意味がない比喩を使うが)「掃除」を依頼するサービスがあった時、部屋がキレイになる結果がほしいのであって。手段は何でもいいという場合、家政婦を雇って掃除をしてもらうのもいいですし、ルンバのような掃除ロボットを使用するのも手段の一つでしょう。このような例においては、汚い部屋を掃除する機能を持つものであれば何を使っても良い場合が存在

元記事を表示

Goで簡単なテトリスを作成する

## はじめに

この記事では、Go言語とEbitenライブラリを使用して簡単なテトリスを作成したのでそれについて記載します。
Ebitenは2Dゲーム開発のためのGoのライブラリであり、シンプルで使いやすいAPIを提供しています。

## 目次

1. 必要なパッケージのインストール
2. 定数と型の定義
3. テトリスミノの構造体と関数
4. ゲーム全体を管理する構造体と関数
5. メイン関数

## 1. 必要なパッケージのインストール

まず、Ebitenライブラリをインストールします。

“`bash
go get -u github.com/hajimehoshi/ebiten/v2
“`

## 2. 定数と型の定義

ゲームの設定やセルの色に関する定数と型を定義します。

“`go
import (
“image/color” // 色を扱うパッケージ
“math/rand” // 乱数を扱うパッケージ
“time” // 時間を扱うパッケージ

“github.com/hajimehoshi/ebiten/v2”

元記事を表示

GoでURLの全角・半角空白を処理する

# TL;DR
検索機能などを実装するとき、クエリパラメータで送られてきた検索ワードを一旦配列に落とし込みたい。
けど、ユーザーによって使われるスペースの全角・半角は人それぞれ。

# 方法
1.クエリをデコードする
“`Go
parsedKeyword, err := url.QueryUnescape(keyword)
if err != nil {
return nil, err
}
“`

2.全角をすべて半角に置き換え

“`Go
singleByteKeywords := strings.Replace(parsedKeyword, “ ”, ” “, -1)
“`

3.Splitする

“`Go
keywords := strings.Split(singleByteKeywords, ” “)
“`

元記事を表示

【Go】jwt-goのライブラリをインストールする際の注意点(2023年8月時点)

## 概要
Goでjwtを実装する際に、[dgrijalva/jwt-go](https://github.com/dgrijalva/jwt-go)を使用する実装例が紹介されていると思います。
ただ、`dgrijalva/jwt-go`は2022年5月にアーカイブとなりました。どうやらリポジトリが新しいものに移動したようです。

## 新しいリポジトリ
2023年8月時点において、[golang-jwt/jwt](https://github.com/golang-jwt/jwt)にて開発が継続されていますので、こちらを使用してください。基本的な機能は`dgrijalva/jwt-go`と変わらないと思います。

## インストール時の注意点
[Installation Guidelines](https://github.com/golang-jwt/jwt#installation-guidelines)にある通り、2023年8月時点では`go get -u github.com/golang-jwt/jwt/v5`の形式で、バージョンを指定するようにしてください。
バージョンを

元記事を表示

続:go testのチュートリアルを作ってみた

# はじめに
[以前の投稿](https://qiita.com/taisa1108/items/69bff246a5a4370b9fc7)で紹介したgo-test-tutorialに以下2つのチャプターを追加しました。

– [テストの並列実行](https://github.com/dip-dev/go-test-tutorial/tree/main/chapters/chapter6)[^1]
– [ヘルパー関数と後処理](https://github.com/dip-dev/go-test-tutorial/tree/main/chapters/chapter7)

また、今回のチャプターを作成するにあたり以下メルカリ様の記事を参考にさせていただいています。
`t.Parallel()`メソッドの挙動についてとても分かりやすく解説されているのでぜひこちらも読んでみてください。

https://engineering.mercari.com/blog/entry/how_to_use_t_parallel/

# 進め方
既存と同じように各チャプターディレクトリ内のREADM

元記事を表示

Clean Architecture と Go で(自分なりの)ボイラープレートを作成してみました

# はじめに
Clean Architecture と Go(REST API)でボイラープレートを作成してみましたので、その知見のまとめです。

↓ こちらがボイラープレートです。

[ボイラープレート](https://github.com/Jiei-S/boilerplate-clean-architecture/tree/main/go-rest)

# Clean Architecture とは

DB やフレームワークなどの外部技術に依存せず、ソフトウェアの中核部分(ビジネスを表現する部分)の独立性を高めることで、外部技術の変更に強いソフトウェアを実現することを目的とする。

以下は Clean Architecture の概念図です。図を見ながらポイントを解説していきます。

![clean-architecture.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125540/7a751b6f-b2f3-f606-e28a-a60b781a92d8.jpeg)

## 「関心

元記事を表示

整列する時間を測る

# これは何?

https://qiita.com/fsdg-adachi_h/items/9d91e53d6ff4e5753b05

という記事に関する追加情報

例によって私にはコメントを書くことができないのでこうして記事を書いた。

# データ

バブルソートということで、比較と入れ替えを行う。
比較の回数はデータに依存しないと思う(自信ない)けど、入れ替えの回数はデータに依存するので、データによって処理時間が変わる。

手元で「10000要素を5000回バブルソート」を go で書いたバイナリで実行したところ、

|種|平均(秒)|標準偏差(秒)|
|:–|:–|:–|
|固定|0.05362|0.0014|
|乱数|0.05495|0.0018|

という具合で、データを変えると時間のばらつきが大きくなることがわかる。

今回はバブルソートの時間が知りたいというよりも、なんか時間のかかる処理をさせてその差を見たいということだと思うので、逆順に整列済みのデータを与えるのが良いと思った。

# go の乱数

go の乱数が

“`go:go
// 乱数で配列を初期化

元記事を表示

[Go]インターフェース

# 概要

* [前回](https://qiita.com/hasesiu/items/8c1feaffcb4ff86a0841)の続き
* 今回はインターフェースについて学習
* インターフェースは並行実行と並んで、Go言語の特徴的な(良い意味で)概念とのこと

参考

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

# インターフェース

* Go言語で唯一の抽象型(実装を持たない型)で2つの特徴がある
* メソッドの集合: 実装するべきメソッドを定義する(Javaと同じ概念)
* 型:変数がインターフェースを基盤とする型を持つことで、任意の型の値を代入できる
* `var i interface{}` または、`var i any`とかくことで、任意の値やメソッドを記憶できる。空インターフェースとよぶ。(tsのany型と同じ用途)
* インターフェースも型の一種。er(〜する人)で命名する

“`go:インターフェースの定義
type Stringer interface {
Stri

元記事を表示

Golangで、自動生成ファイルがある場合のパッケージ自動更新

Golangでパッケージを自動更新させたい場合、dependabotやrenovateが選択肢になるかと思います。

ただgRPCなどの自動生成ファイルがあるときは、いろいろと厄介だったのでやったことを残しておきます

# 課題

dependabotはパッケージアップデートを自動で行ってくれるGithub純正のBotです。

> Dependabot は、セキュリティアップデートプログラムを使用してプルリクエストを発行することにより、脆弱性のある依存関係を修正できます。

https://docs.github.com/ja/code-security/dependabot/dependabot-security-updates/about-dependabot-security-updates

とてもありがたいのですが、一つ困ったことがあってdependabotが走ってプルリクが出された際、`go mod tidy`が自動で走ります。これによってgo.modに必要なパッケージの追加と不要なパッケージの削除をしてくれるのですが、自動生成ファイルがあるときには悪さをすることがありま

元記事を表示

「2days ONE CAREER Tech Internship」に参加してきた話

ワンキャリアの「[2days ONE CAREER Tech Internship](https://www.onecareer.jp/events/internship/35554)」に参加してきました!

インターンの内容を振り返りつつ、学んだことや感想などを書いていこうと思います!

# インターンシップ内容

主なコンテンツとしては2つあり、1日目の午前中は**システムデザインインタビュー**、その後はECサイトの**パフォーマンスチューニング**という流れでした。

両方とも基本的に二人一組チームで行い、最後にパフォーマンスチューニングの成果発表を行いました。

メンターの方々から開発における考え方のアドバイスをいただくことができ、
またCTOの方と1on1面談もさせていただくことができ、技術力以外にも学びのあるインターンシップとなりました!

# システムデザインインタビュー

インターンのオープニングや自己紹介・アイスブレイクが終わった後に、システムデザインインタビューが始まりました。

システムデザインインタビューはソフトウェアのシステム設計能力を評価するための面接です

元記事を表示

Goの日付フォーマットは0埋めしない24時間表記を作れない

Goで時刻のフォーマットを作る時に、0埋めしない24時間表記(例えば`6:15`)が作れないことに気づきました。

`06:15`じゃなくて`6:15`じゃないとダメなんだ!というのはレアケースなのかなぁ、とも思ったのですが、画面表示や文章の中に入る場合は0埋めしないケースもそれなりにある気がします。

本記事では、どうして作れないのかという解説と代替方法を紹介します。

## Goの日付フォーマットについて

Goの日付フォーマットについてのおさらいです。
Goの経験者で既にご存じの方は読み飛ばして結構です。

Goの日付フォーマットは独特なことで有名で、アメリカ式の日付表記で各パートを1から順に振ったものが書式文字列となっています(月、日、時、分、秒、年の順)。

例えばこんな感じです。

“`
“Mon Jan _2 15:04:05 2006”
2006-01-02T15:04:05Z07:00
“`

分かりづらいですが、上記はフォーマットして生成された文字列ではなく、**書式文字列**です。
例えば`2006`と書くと、そこが具体的な年に置き換わり、`01`は2桁の月に

元記事を表示

Goにおけるポインタの使い方と使い所のブラッシュアップ

Goにおけるポインタがよくわからなかったので、とりあえず使い方がわかったので、疑問点と一緒にアウトプットしようと思う。何か間違っている点がありましたら、恐れ多いのですがご指摘宜しくお願い致します。

### 記事の目標
この記事を読むことでGoにおけるポインタの概念を理解できる。

## 疑問点
– 使い所はどこか?
– なぜアドレスみたりできるのか、変数など直接取得すればいいのではないか?

(上記二つは調査中。。。)

## 前提知識
ポインタを理解するにはどうやら前提知識が必要そうだ。以下は[こちらの記事](https://zenn.dev/genki86web/articles/a0ae1d57ad1806)から引用させていただきました。以下は変数とメモリとアドレスの説明です。
>- メモリは、1バイト毎に番号がつけられ、区別されています。
>- 変数は実行ファイルになると、番号が割り当てられます。
>- 変数は、メモリ上の該当の番号の区分に格納され、記憶されます。
>- この変数に付与されるメモリの区分番号がアドレス(16進数)です。

“`main.go
func mai

元記事を表示

【Golang】Udemy教材でTodoアプリをつくったときにハマった・勉強になったこと

# はじめに

自分のように同じように躓く人が少なからずいると思ったので、アウトプットも兼ねて記事にしました。

学習時のバージョンは `v1.20.7` です。

“`
$ go version
go version go1.20.7 darwin/amd64
“`

# Go言語を学習しようと思った理由

お盆になって時間ができたので、前から気になっていた Go 言語の勉強をしてみました。

学習する意図としては、これまでバックエンドは Scala しか使ったことがないので、「他のバックエンド言語を知ることで多角的な視点を持つことができるのでは?」と思ったのと、なぜこれほどまでに Go 言語の人気が急上昇しているのか、実際に使いやすさを体験してみたかったからです。

なので、簡単な Todo アプリ開発を通して、言語の特徴や作成背景に興味を持つきっかけになればと思っています。

# ? ハマりポイント

## TODOアプリの config 設定

クッソハマった。

– import するときは go.mod ファイルの module 名を一致させないといけない。

“`g

元記事を表示

OTHERカテゴリの最新記事