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

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

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

元記事を表示

【Go】Google Books APIs を使って書籍検索アプリを作成する

## はじめに
Go学習の一環として、Google Books APIsを活用しての簡単な書籍検索アプリを作ってみたので備忘録として記事にしておきます。

## 目次
[1. Google Books APIs とは?](#google-books-apis-とは)
[2. ディレクトリ構成](#ディレクトリ構成)
[3. 環境構築](#環境構築)
 [3-1. Dockerfile](#dockerfile)
 [3-2. docker-compose.yml](#docker-composeyml)
 [3-3. env](#env)
 [3-4. db/my.cnf](#dbmycnf)
 [3-5. phpmyadmin/sessions](#phpmyadminsessions)
[4. バックエンド側の実装](#バックエンド側の実装)
 [4-1. main.go](#maingo)
 [4-2. Controller](#controller)
 [4-3. Model](#model)
[5. フロントエンド側の実装](#フロントエンド側の実装)
 [5-1. View

元記事を表示

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

こんにちは。

今日からはGo言語を使って簡単なWebアプリケーションを作成します。

# 目的
– あなたがプログラミングを行う際の選択肢として、Goを挙げられる為の第一歩となること
– より、知らない人に知ってもらうことを重要視しています

# 全体の流れの確認
– Goとは
– 特徴
– どこで使われているの?
– Hello, World作成
– 実行
– クロスコンパイルの体験
– 変数とその定義方法
– 変数の種類
– 変数定義方法
– 不具合箇所は、最高の講師に教えてもらおう
– 不具合の修正
– 関数
– 関数の定義
– 関数を書いてみる
– 関数の実行される順番
– パッケージ
– パッケージを使う
– パッケージを作る
– 構造体
– 構造体の定義
– 構造体への関数の関連付け
– 牛丼屋型と、注文する関数を定義する
– Webアプリケーション
– httpを起動する方法
– はじめてのGo言語Webアプリケーシ

元記事を表示

[Go]string、Rune、コードポイント、[]byteの差異について

各概念の説明は参考ページにわかりやすく記述されていますのでそちらをご参照ください。
ここでは、概念の違いに注目して理解を深めることや端的に表現することを目的としています。

## byte型とstring型について

“`go

var scentence string

//スライス作成←scentence[index]はbyte型:1byteごとに区切られる

codePointPre := []byte{scentence[index]} //[]byteにコードポイントが格納される

//バイト配列へ変換←scentence[index:index+1]はstring型

codePointPre := []byte(scentence[index:index+1]) //[]byteにコードポイントが格納される
“`

1.Goが準拠するUTF-8は可変長エンコーディング。
文字列にインデックスでアクセスしたときに得られるbyte値は1byteごとであるので、scentenceは英数字の場合にのみ対応。マルチバイト(かなカタカナ漢字)にはstringをbyteにキャスト

元記事を表示

Go 1.21で注目したい機能

https://go.dev/blog/go1.21

Goの1.21がリリースされましたね!
なんといっても今回特筆すべきはslicesパッケージの登場だと思います
多言語を扱うエンジニアさんはGoのスライスに扱いづらさを感じた方も多いんじゃないでしょうか
他の言語と遜色ない機能が追加、かつ直感的な関数名のものが増えたので自分が嬉しいなと思った物を紹介したいです

# slicesパッケージ

## [Contains](https://pkg.go.dev/slices#Contains)
sのスライス内にvが存在するかをチェックし、存在すればtrueが返ります

“`golang
func Contains[S ~[]E, E comparable](s S, v E) bool
“`

[サンプル](https://go.dev/play/p/_F9v_sScpD_I)

“`golang
m := []string{“taro”, “jiro”, “saburo”}
ok := slices.Contains(m, “jiro”)
fmt.Println(fmt.Sp

元記事を表示

OTHERカテゴリの最新記事