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

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

Go言語とSQLiteでユニットテスト

Go言語とデータベースSQLite3とユニットテストについて調べた2022年7月時点の情報をメモします。

## Go1.18.3をインストール
[Go言語のwebサイト](https://go.dev/)からインストールしました。
“`
MacBook-Pro ~ % go version
go version go1.18.3 darwin/arm64
“`
## SQLite 3.37.0をインストール
[SQLiteのwebサイト](https://www.sqlite.org/download.html)からインストールしました。
Windowsの場合は、実行ファイルsqlite3.exeをgoファイルと同じフォルダにコピー。
“`
MacBook-Pro ~ % sqlite3
SQLite version 3.37.0 2021-12-09 01:34:53
“`
## gccをインストール
後ほどドライバプログラム等に利用するので、MacOSはXcode、Windowsはtmd-gccをインストール。

## go.modファイルを作成
プログラムを作成する

元記事を表示

go install でハマったこと

不覚にも `go install` でハマった。。。
結論、**[公式ドキュメント](https://pkg.go.dev/cmd/go#hdr-Compile_and_install_packages_and_dependencies)** にちゃんと記載されているが、具体例が一切無く分かりにくい。
なので備忘録を残す。

# バージョンが異なる複数のパッケージを同時にインストールできない
**複数のパッケージをインストールする場合、全て同じバージョンを指定する必要がある。**
そうしなければ`all arguments must have the same version`と言われる。。。
“`
$ go install github.com/go-delve/delve/cmd/dlv@latest golang.org/x/tools/gopls@v0.9.1
=> go: golang.org/x/tools/gopls@v0.9.1: all arguments must have the same version (@latest)
“`

> If the ar

元記事を表示

Go言語で初めてWebアプリを作る際に役立ちそうな参考文献リンク集(日/英)

この記事はGo言語の基礎文法をざっくり抑えた人が、Webアプリを作るのに役立ちそうな文献をまとめたものです(2022/07/19時点)。

## 1. 公式web記事
### [Writing Web Applications / go.dev](https://go.dev/doc/articles/wiki/)
– `net/http`や`html/template`のパッケージを使ってGUIのwebアプリを作る

### [Tutorial: Developing a RESTful API with Go and Gin](https://go.dev/doc/tutorial/web-service-gin.html)
– 基本的なRESTful APIをGOとGinで作る

### [Tutorial: Accessing a relational database](https://go.dev/doc/tutorial/database-access)
– RDBMSをGoで使う際のチュートリアル

## 2. 書籍
### [Goプログラミング実践入門 標準ライ

元記事を表示

Go と Rust で実装されたライブラリを最適化してみた

以前に移植した Go と Rust のライブラリを最適化したので手順や結果をまとめてみました。

https://qiita.com/sg0hsmt/items/04ecd4bc8ef7be06f75b

この記事では pprof などによるプロファイリングをしていません。
最適化の手順や測定方法についてもより良いものがあると思います。

※ ベンチマークの値は記事作成時 (Go 1.18.4, Rust 1.64.0-nightly) のものなのでコミットログと一致していません。

## 短い結論

– 今回のケースではメモリ割り当て回数の削減が重要だった。

## 最適化対象のライブラリ

最適化対象は日本語の文章を与えると適切な改行位置を推測してくれる [BudouX](https://github.com/google/budoux) というライブラリを Go と Rust に移植したものです。

https://github.com/sg0hsmt/budoux-go

https://github.com/sg0hsmt/budoux-rs

## ベンチマークを追加する

元記事を表示

golangでsqlxを利用してDBアクセスする際のtimeout設定方法と、transaction利用での注意

## はじめに

– 本記事の確認環境は以下
– go: 1.17.2
– sqlx: v1.3.5
– サンプルコードについて
– サンプルコードに対するエラーハンドリングは省いています。実際に取り扱う際にはエラーハンドリングしてください。
– 実際に取り扱う際にエラーを扱わない場合は、MustExecなどのMustがついた関数を利用ください。

## 基本的な使い方

`context.WithTimeout()`を使います。以下のようにtimer付きのcontextを取得。扱っているcontextがあるなら、`WithTimeout`の第一引数に指定します。
また、`cancel()`は処理の終了時に実行しておく必要があります。

“`golang
ctx, cancel := context.WithTimeout(context.Background(), 1 * time.Minute)
defer cancel()
“`

sqlxでは、通常使うSQL実行用の関数に対して、その関数にcontextの引数を追加した関数が用

元記事を表示

GoでTodoアプリを作る(超初学者)

# GoでTodoアプリを作る
Goに関して超初学者ですが、Udemyの講座を参考にしながらTodoアプリを作ってみたので、アウトプットを兼ねた解説を本記事に書かせていただきました。ただ、超初学者ということもあり多々誤りがあると思いますがコメントなどで指摘していただけると嬉しいです。
Udemyの講座(https://www.udemy.com/course/golang-webgosql/)

# 実際のアプリ
herokuでデプロイしたので、実際に触ってみてほしいです。
URL(https://agile-beyond-46818.herokuapp.com/)
内容はザ・todoアプリって感じです。

# configの設定
“`Go:config.go
package config

import (
“log”
“todo_app/utils”

“gopkg.in/go-ini/ini.v1”
)

type ConfigList struct{
Port string
SQLDriver string
DbName string
LogFile strin

元記事を表示

【#33 エンジニア転職学習】Go WebApplications Handler

# はじめに
富山県に住んでいるChikaといいます。
毎日投稿を目標に、バックエンドエンジニア転職に向けた学習内容をアウトプットします。

使用しているGoのUdemy教材後半部分である、
Webアプリ作成演習を学習していきます。

バックエンドエンジニアになるまでの学習内容は以前投稿した以下の記事を基にしています。

https://qiita.com/Chika110/items/ef54dddd565a0193ef44

# 本日の学習内容
本日はGoのwebアプリ用標準パッケージ、アプリ開発に向けての準備等を学習しました。

* templateキャッシュ
* **Handler <--Topics!** * ビットコインについて * config, log のini設定 # Handler ```go func makeHandler(fn func(http.ResponseWriter, *http.Request, string)) http.HandlerFunc {

元記事を表示

Go言語でstring型の値を保持した配列をstrings.Joinしようとしたらエラーが発生

# 発生したエラー

Go言語で`string`型の値を保持した配列をカンマ区切りで結合したい時に、以下のエラーが発生

“`go
package main
import “fmt”
import “strings”
import “strconv”

func main(){
var numbers[1000]string
for i := 0; i < 1000; i++ { numbers[i] = strconv.Itoa(i+1) } //誤り fmt.Println(strings.Join(numbers, " ")) } ``` ```terminal # command-line-arguments ./Main.go:12:29: cannot use numbers (type [1000]string) as type []string in argument to strings.Join ``` # 解決策 [`strings.Join`](https://pkg.go.dev/strings#

元記事を表示

go の知らなかった仕様

# これは何?

まあタイトルのとおり。
知らなかった文法・仕様・書き方がいくつかあったのでメモ。

# 型の別名定義

下記の、 `newNameOfString`。

“`go:go1.18
// = があると、C の typedef 相当。別名。
type newNameOfString = string

// = が無いと、同じ内容の別の型。
type somethingLikeString string

func (s *newNameOfString) fuga() {} //invalid receiver type *string (basic or unnamed type)

func (s *somethingLikeString) fuga() {}

func piyoFunc() {
s := “hoge”
var nns newNameOfString = s
var sls somethingLikeString = s // cannot use s (variable of type string) as somethingLikeStr

元記事を表示

【Golang】クリーンアーキテクチャなどを参考にフェーズにあった構成を採用してみた

# はじめに

クリーンアーキテクチャやヘキサゴナル、オニオンといろんなアーキテクチャがあって、頭がこんがらがります。
ぶっちゃけみんな言ってることは一緒で同じことを違う切り口から言ってるだけのような・・・

今回、複数のモジュールを作成したので、その中でもライトなものとヘビーなものの2つのアーキテクチャの構成を備忘録も兼ねてまとめておくことにしました。

インフラについてはこちらにまとめています。

https://qiita.com/yoshinori_hisakawa/items/23dad9d4c65d13c1b785

# 作ったのはどんなプロダクトか?
作成したプロダクトの概要としては
**「顧客のwebアプリ上でサーベイを配信する」** ことが出来るプロダクトです。

もちろんただ配信するのではなく以下の機能などもあります。
– 高精度なユーザーの属性ターゲティング
– 適切なタイミングで配信するための行動ログターゲティング
– 広告配信システムのようなフリークエンシーなどの多数の機能

![image.png](https://qiita-image-store.s

元記事を表示

GolangでCognito認証をしてトークンをjwt形式にする

## できること
認証はuserPool、認可はIdentitiyPoolで行われ、それぞれ別のリソース

### 認証
– Cognitoで管理されているユーザー情報で認証ができる
– 外部プロバイダー(Azure、Google、Facebook)と連携が可能
– ユーザー認証が成功すると、トークンが発行され、アプリケーション側でトークンの検証を行うことで認証機能をつくることができる
– UserPoolで行われる

### 認可
– 一時的な権限を与える
– チケットを渡すイメージ
– Cognitoではグループや属性ごとにIAMRoleを割り振ったりすることができる
– IndentityPoolで行われる

## Cognito設定
– `ALLOW_ADMIN_USER_PASSWORD_AUTH`にチェックが必要
– AppClient作成時に、ClientSecretを使うのチェックを外す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293481/e0e599e6-1

元記事を表示

【#32 エンジニア転職学習】Go WebApplications http/template

# はじめに
富山県に住んでいるChikaといいます。
毎日投稿を目標に、バックエンドエンジニア転職に向けた学習内容をアウトプットします。

使用しているGoのUdemy教材後半部分である、
Webアプリ作成演習を学習していきます。

バックエンドエンジニアになるまでの学習内容は以前投稿した以下の記事を基にしています。

https://qiita.com/Chika110/items/ef54dddd565a0193ef44

# 本日の学習内容
本日はGoのwebアプリ用標準パッケージを中心に学習しました。

* ioutil
* http.ListenAndServe
* **http/template <--Topics!** * http.Redirect # http/template 各ハンドラーからHTMLファイルを読み書きを可能にするメソッド等が入っているパッケージです。フロントエンドとバックエンドの連携が見れたので、少し感動です。 * `template.ParseFiles(File名)`で指定ファイルのテンプレートを作成 * template.Execute

元記事を表示

Go generics で指定された型のオブジェクトをインターフェイスとして返す

# これは何?

最近 Go を書く機会があって。

generics 関数内で引数型のインスタンスを作れなくて苦労したので、やりたかったこと、書いてみて駄目だったこと、うまく行ったコードを記す。

# やりたいこと

インターフェイス `Hoge` があり。`Hoge` を実装するクラスが `FugaType` 他多数あり。

“`go:go
hogeCreator := CreateHogeCreator[FugaType](arg)
hoge := hogeCreator()
“`

のように使う generics な関数 `CreateHogeCreator` が書きたかった。

### トライアル

まずは素朴に

“`go:go1.18
func CreateHogeCreator[T Hoge](arg HogeInitArg) func() Hoge {
return func() Hoge {
v := T{} // invalid composite literal type T compiler(InvalidLit)
v.Init(arg)

元記事を表示

【#31 エンジニア転職学習】Go WebApplications DB操作

# はじめに
富山県に住んでいるChikaといいます。
毎日投稿を目標に、バックエンドエンジニア転職に向けた学習内容をアウトプットします。

本日より使用しているGoのUdemy教材後半部分である、
Webアプリ作成演習を学習していきます。

バックエンドエンジニアになるまでの学習内容は以前投稿した以下の記事を基にしています。

https://qiita.com/Chika110/items/ef54dddd565a0193ef44

# 本日の学習内容
本日はアプリ開発演習前の各ソフトウェアインストール、GoでのDB操作を中心に学習しました。

* 必要ソフトウェアインストール
* **GoでのDB操作 ←Topics!!**

# GoでのDB操作
標準パッケージであるsqlパッケージを使用しました。DBMSはsqlite3です。
以下ポイントをまとめます。
* importでは”github.com ~ go-sqlite3″の前に`_`を付けて、一緒にbuildしてコンパイルするようにしておく
* SQLインジェクションを防ぐために、各SQL文のvalue指定には`?`を使

元記事を表示

JavaScriptのforEachをGoで再現する

Goでは標準でJavaScriptのforEachのような配列の中身をコールバック関数で操作する機能が無いため自力で実装する必要がある。

# 今回再現する元のJavaScriptのコード
元のコード

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach

“`js
const array1 = [‘a’, ‘b’, ‘c’];

array1.forEach(element => console.log(element));
“`

# Goで再現したコード
rangeの中身即時関数を配置する形で再現した。
“`go
package main

import “fmt”

func main() {
array1 := [3]string{“a”, “b”, “c”}

for _, v := range array1 {
func(element string) {
fmt.Println(element)
}(v)
}
}

元記事を表示

Goを触る②

[こちら](https://qiita.com/iskn19/items/a603e7a56283df819965#%E5%A4%89%E6%95%B0)の続き

# 変数
関数はfuncで定義

“`go
func add(hoge int, fuga int) int {
return hoge + fuga
}
“`
“`{“` 前の型で戻り値の型を宣言
“`return“` で戻り値を設定

戻り値が複数の場合は型名は “`(,) “`で設定する必要がある

“`go
func addMinus(x int, y int) (int, int) {
return x + y, x – y
}
“`
ブランク変数を使って必要な値のみ取得する
“`go
package main
import “fmt”

func main() {
var a string
_ , a = hoge(“sss”,”sssssss”)
fmt.Println(a)
}
func hoge(x string, y string) (string, st

元記事を表示

Go言語でunit testをしたい

# はじめに
最近Go言語を最近初めてTDD的な個人開発を行いたかったので自分用のメモとしてGo言語のunittestの書き方をまとめました。

# Go言語でのunittestの書き方
#### testファイルの作成
まずは、テストしたい関数と同階層に`<ファイル名>_test.go`というファイルを作成しましょう。今回は`Hello.go`をテストする`Hello_test.go`を作成しました。
“`
.
├── Hello.go
└── Hello_test.go
“`

#### `Hello_test.go`の記述
続いてテストコードを書きましょう。`Hello()`に名前を渡すと`Hello, <名前>!`と帰ってくるプログラムをテストします。
“`Hello_test.go
package main

import (
“testing”
)

func TestHelloName_名前出力のテスト(t *testing.T) {
name := “abemaru”
want := “Hello, abemaru”
msg, err := Hello(n

元記事を表示

簡潔なGoと簡単なJavaのどちらを選択するか

最近 Go言語を個人的に勉強しているのですが、そのときに思ったことを Java と比較しながら書いてみようと思います。

# Go言語とは

皆さん、そもそも [Go言語](https://go.dev/)って知っていますか?
Go言語はGoogleが開発したオープンソースのプログラミング言語です。「Go」や「Golang」と呼ばれます。

特徴としては、「簡潔な記述ができる」、「軽量な並列処理が可能」などがあげられます。

Go言語は色々なところで利用されており、Web だと API サーバの実装に利用されることが多くなっています。
また、クロスコンパイル(Windows/Mac/Linux 用のコンパイル)が可能であるため、CLI ツールの作成などに利用されることも多々あります。有名どころだと「[docker](https://github.com/docker/cli)」の CLI なんかが go 言語で作成されています。(先程のリンク先を見てみると、「.go」ファイルがちらほらありますね。)

# 簡潔な記述ができるとは?

元記事を表示

Go言語でディレクトリ内のファイルを取得する方法

# はじめに
ディレクトリ内のファイル一覧を取得する方法を調べると、3つ見つかったので備忘録として残しておきます。

# 前提
確認のため、最小構成で実行しています。今回は以下のような場面での使用を想定しています。
“`terminal
% tree
.
├── input
│ ├── abc.jpeg
│ ├── folder
│ │ └── in_folder.jpg
│ └── test.jpg
└── main.go
“`

# 方法
### `ioutil.ReadDir`
`ReadDir`で指定したディレクトリを読み込み、ファイル名でソートし、表示されます。サブディレクトリ内のファイルは表示されません。
“`main.go
package main

import (
“fmt”
“io/ioutil”
)

func main() {
files, _ := ioutil.ReadDir(“input”)

for _, f := range files {
fmt.Println(f.Name())
}
}
“`

“`

元記事を表示

go で unix timestamp を zone指定のTime型に変換するメモ

# 実装

“`go
jst, _ := time.LoadLocation(“Asia/Tokyo”)
dt := time.Unix(1657616356, 0).In(jst)
“`
# 参考

https://pkg.go.dev/time#Unix

https://pkg.go.dev/time#Time.In

https://qiita.com/yyoshiki41/items/3acfe3c03b5a3a1e7592

元記事を表示

OTHERカテゴリの最新記事