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

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

【Go】APIサーバを構築する② ~データの作成(Create)/更新(Update)/削除(Delete)~

#はじめに
前記事の続きでデータの作成、更新、削除の処理を追加しました。

https://qiita.com/suzuki0430/items/f4396a337209cd1e37b7

#実装
各処理の実装内容について記述します。

##削除(Delete)
まずは`routes.go`にルートハンドラーを追加します。

“`go:routes.go
router.HandlerFunc(http.MethodGet, “/v1/admin/deletemovie/:id”, app.deleteMovie)
“`
処理の内容を`movie-handlers.go`に記述します。
パスパラメータを取得するとき、`strconv.Atoi(params.ByName(“id”))`でidの型をStringからIntに変換することに注意します。

“`go:movie-handlers.go
func (app *application) deleteMovie(w http.ResponseWriter, r *http.Request) {
params := httpro

元記事を表示

Goで動くフロントエンドが作れるSSRライブラリkyotoを使ってみた話

# 注意
本記事は試しに使ってみた程度の記事です。

今回使用した[kyoto](https://github.com/kyoto-framework/kyoto)は開発初期であり、今後も多くの変更が予定されているようです。本記事はv0.2を使用しています。

https://github.com/kyoto-framework/kyoto/milestone/3

# [kyoto](https://github.com/kyoto-framework/kyoto)とは

kyotoはSSR(Server Side Rendering)のライブラリです。

https://github.com/kyoto-framework/kyoto

[ドキュメント](https://kyoto.codes/prologue/)にあるMotivationを以下に引用します。

> **Motivation**
> Main motivation is to reduce usage of popular SPA/PWA frameworks where it’s not needed becau

元記事を表示

MongoDBのfindで配列フィールドの登録数を不等号条件でfilterしたい

## 概要
MongoDBではフィールドに配列の型を持てますが、その登録数をfindで条件にしたい時もあるかなと思います。
特定の数(例えば配列の中に1個登録)を条件にしたい場合は、[$size](https://docs.mongodb.com/manual/reference/operator/query/size/)のオペレーターを使用すれば大丈夫ですが、1個以上とか不等号を使いたくなる場合もありますよね。ただ、`$size`は数値型しか設定できないので、例えば`array_field : { $size: { $gt : 1 }`のような指定は不可となります。
では、このように不等号を使いたい場合は、どのように対応すれば良いのかというのをメモ書きします。

## 対応方法
[Is there a way to query array fields with size greater than some specified value?](https://www.mongodb.com/community/forums/t/is-there-a-way-to-query-arra

元記事を表示

Golangに入門してみた

# Golangに入門してみた

最近、転職活動をしているときにgRPCについての話があり、あまり詳しく知らなかったのでハンズオンしたいな、と思いどうせならgRPCの醍醐味である別言語間での通信を実現してみたいなと思い、現在使えるJavaScript, Python, Rubyに加え、流行のGolangを用いてAPI作ってみたいなと思い、Glangのtutorialをやってみました。

そこで、とりあえずGolangのfor文 + if文を使って平方根を求めるエクササイズがあったので、それをググりながら書いてみた。そこまで難しくないし、ヒントも出されているので、5分くらいで終わったのですが、その回答を載せます。答えは見てないので、非効率なプログラム書いているかもしれませんが、まぁいいでしょう。

## エクササイズ内容

こちらのページのエクササイズを行いました。
https://go-tour-jp.appspot.com/flowcontrol/8

![](https://storage.googleapis.com/zenn-user-upload/99d4cb256a76-2

元記事を表示

GoでのWeb Framework選択時にルーティングの問題でGinを諦めてしまった人へ

## 前置き
久しぶりに記事を書いています。(結構雑にですが)
なんで書く気になったかというと、あまりに嬉しい修正が入っていたことに気が付いたからです。
恥ずかしながら結構前のアップデートだったようですが、12月中頃に気付きました・・・

GoでAPIサーバを作成する際にWAFの選択肢は様々だと思います。
`go-swagger`を使ってみようかなんて考えたり、`Echo`と`Gin`ってどっちが良いんだろうと悩んだり。

ちなみに僕は過去に`Gin`を選択したり、WAFというかRouterとして`gorilla/mux`を使用したりもしていました。

そして`Gin`についてはRouterのPathの記述というか、ルーティングに悩まされることがありました。

いくつかそのような記事も見かけたので気になる方は検索してみてください。

上記のようにPathが柔軟に作れないことで一定数`Gin`を選択肢から外してしまった方もいるのでは無いでしょうか。

今回はそんなルーティングに難があったGinでかなり問題が解決されていた部分について書いていこうと思う。

## 前提
– go versi

元記事を表示

[golang error] go: gopkg.in/yaml.v2@v2.2.2: unknown revision v2.2.2

### 状況
Dockerでgolangとmysqlの環境構築

### エラー内容
“`
go: gopkg.in/yaml.v2@v2.2.2: unknown revision v2.2.2
go: error loading module requirements
“`

### さきに結論
– version (1.17)にupdateしましょう
– [上記をすでに試した場合](#自分の場合)

### より詳しく

結論の繰り返しになりますが
versionを更新することで解決できます
*参考にしたissueは[こちら](https://github.com/go-yaml/yaml/issues/791)*

解決できてない方は自分と同じ場合かもしれないので
先にお進みください

### 自分の場合

Dockerfile

“`
FROM golang:1.17

WORKDIR /go/src/github.com/mahiro72/todo_api_pra
COPY . .

ENV GO111MODULE=on
“`

そもそも**version

元記事を表示

multipass + docker on Mac

# Mac でのDocker環境構築

いよいよ DockerDesktopの猶予期限がくるので、移行しました。
下記どちらでコマンドをうっているのか分かりづらいので セクションタイトルに Macで実行する場合は “on Mac”、 仮想環境のUbuntuで実行する場合は ”on Ubuntu”と入れる

## multipass (ubuntu の仮想起動環境)インストール on Mac
https://multipass.run/
1. 上記からmac用binaryをDownload
2. installer を起動

## multipass でubuntu:latest(20.04) 起動 on Mac
あとからmemory, disk sizeを変更するのがとても大変なので最初から必要な分指定する。目的としてkubernetesのローカルデバッグをkindを使用して動かすので以下のようにmemory 10G, disk 20G, cpu core 4 程度は最低必要。

“` shell
% multipass launch –name ryujidev -m 10G –

元記事を表示

【Go】APIサーバを構築する① ~データの読み取り(Read)~

#はじめに
Go学習の一環として、簡単なAPIサーバを作成してみました。

その他のGoの記事については以下をご覧ください。

https://qiita.com/suzuki0430/items/6674ffa239dc539e0fd7#%E3%83%9D%E3%82%A4%E3%83%B3%E3%82%BF

https://qiita.com/suzuki0430/items/dc82131e5e26e2cf3ae0

#実装
DBにmovies, genres, movies_genresテーブルを作成し、指定したIDのmovieを取得するようなAPIをつくります。

movies
![スクリーンショット 2022-01-07 21.41.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/92ef94ef-8163-7b74-ad69-0cf08ff42ed8.png)
genres
![スクリーンショット 2022-01-07 21.41.41.png](https://qii

元記事を表示

【Golang】go path / go get / go install / go mod tidyについて

## はじめに
Go1.17のエコシステムをまとめました。
意外に情報が少なく、私がGoを学ぶ上で最初に苦戦した領域でした。
もし間違いがあれば優しくご指摘いただけると幸いです><

## GOPATHについて

GOPAHTのデフォルトは`~/go`。この下に `src/` `bin/` `pkg/`という3つのディレクトリがある。
### `bin/`
mainパッケージをビルドしたバイナリーファイルが格納される。コマンドとして実行できる。
(mainパッケージはビルドするとコマンドになる!!コマンド=実行可能なファイル)

### `src/`

Goのソースコードが格納される。かつてはこのディレクトリ以下で開発する必要があった。GitHubからダウンロードしたライブラリもかつてはここに配置されていた。

### `pkg/`

ダウンロードしたパッケージのソースコード(ビルド前)が格納されるディレクトリ。コマンド以外(つまりmain pacakge以外)のビルド済のバイナリーファイルが置かれる場所でもある。mainパッケージ以外の名前のパッケージをビルドすると`hoge.

元記事を表示

Go の気になったコミット (2021 年 12 月)

[golang/go](https://github.com/golang/go) の master ブランチに行われたコミットから個人的に気になったものをリストにしたものです。

前回作成したリストはこちら。

https://qiita.com/sg0hsmt/items/c3c3523e4f0fe6b69320

軽く説明を追加していますが勘違いや誤りがあるかもしれません。

## Topic

https://go.dev/blog/go1.18beta1

– Go 1.18 Beta 1 がリリースされました。 :rocket:

## Commits

### 2021-12-02

https://github.com/golang/go/commit/08ecdf7c2e9e9ecc4e2d7c6d9438faeed2338140

弱いメモリ一貫性モデル (メモリ参照命令が任意に並び変えられる) のアーキテクチャで実行した場合に GC が nil アクセスする不具合が修正されています。
関連 Issue を見ると以前から CI で発生していたようです。 [^1] [

元記事を表示

カフェでプログラミングしてる風(でも何もやってない)Go(クソ)コード

# 概要
[こちら](https://qiita.com/3S_Laboo/items/660883a0184dabaea65b “こちら”)と[こちら](https://qiita.com/YottyPG/items/e988ebacab94a8f4645f “こちら”)の記事を拝見し、学び始めの言語を使うにはちょうど良さそうだと思ったので、Goで作ってみました。

# 見た目
こんな感じで、ただただ何かをダウンロードしているだけの人間になります。
数秒程度であれば周りの目を誤魔化せるはず、、、、
![go_cofe.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521898/1f1f4d8b-dbef-8306-4a35-2402921fc003.gif)

# 実装
“`go
package installs

import (
“fmt”
“math/rand”
“time”
)

func PrintInstall() {
// 時刻からランダムなシード値を設定
rand.S

元記事を表示

S3にCSVファイルをアップロードしたらDynamoDBに書き込んでくれるLambdaをGolang1.xで書いてSAMでデプロイする

GoでLambdaを書いてる記事が意外と少なかったので、備忘録を兼ねてさくっとまとめます。
ハマりどころもメモ程度にいくつか併記したので、別途ググってみてください。

完成したコードは最後にあります。
また、DynamoDBのテーブルは「アプリ内のお知らせ機能で新しいお知らせを打つために、データのCSVをバッチ処理でDynamoDBに書き込む」という目的でつくったものです。
後半でそんな感じの記述が出てきますので、それぞれの用途に応じてよしなに読み替え書き換えてください。

# 諸々のバージョン

“`:go.mod
module hoge

go 1.16

require (
github.com/aws/aws-lambda-go v1.27.1
github.com/aws/aws-sdk-go v1.42.25
)
“`

Goは1.16である必要はなく、動かしたいものが動くバージョンであればOKです。
aws-sdk-goのREADMEには「Go1.5で`go get`するならちょっと注意が必要だよ」みたいな注意書きがあるので、少なくとも1.5以上なら動くのでしょう

元記事を表示

【Go】http.Client に独自ルート証明書を追加する

次のようなコードになります。
実行するディレクトリに独自ルート証明書ファイルとして `my-cacert.pem` があることを想定しています。

“`go
package main

import (
“crypto/tls”
“crypto/x509”
“fmt”
“log”
“net/http”
“os”
)

func main() {
pem, err := os.ReadFile(“my-cacert.pem”)
if err != nil {
log.Fatal(err)
}

caCertPool, err := x509.SystemCertPool()
if err != nil {
log.Fatal(err)
}

if !caCertPool.AppendCertsFromPEM(pem) {
log.Fatal(“failed to add ca cert”)
}

defaultTransport, ok := http.DefaultTransport.(*http.Transport)
if !ok {

元記事を表示

Go Modulesの使い方

## v2以上のバージョンを持つライブラリのimport
[golang/goのWiki](https://github.com/golang/go/wiki/Modules#semantic-import-versioning) に書いてある通り、v2以上ではモジュールのパスに `/vN` をいれる必要がある。これを読むだけだとわかりにくいのだが、具体的には、importする際に `import “github.com/k0kubun/pp”` のかわりに

“`go
import (
pp “github.com/k0kubun/pp/v3”
)
“`

とする必要がある。`/v3` なしで書くとgo.mod内で `v3.0.1+incompatible` とかになってしまう。

k0kubun/ppのリポジトリがディレクトリをv3で開始していたり、ブランチにv3を持っていたりといったことをする必要はない。

## go mod tidy

“`bash
go mod tidy
“`

をやるとgo.modがいい感じになる。使わなくなったものを消したい時などに使うと

元記事を表示

Go のジェネリクスを使って map と filter を実装してみた

C# の LINQ、JS の map, filter など、多くのプログラミング言語には一般的なコレクション操作が提供されています。
一方、Go にはそういった機能・ライブラリはありません。しかし、Go1.18 で導入されるジェネリクスを使えばこういった一般的なコレクション操作を実装できるのでは?

### やってみた
`myMap` と `myFilter` を実装してみました。

“`go
package main

import “fmt”

func myMap[T1, T2 any](s []T1, f func(T1) T2) []T2 {
var ret []T2
for _, v := range s {
ret = append(ret, f(v))
}
return ret
}

func myFilter[T any](s []T, f func(T) bool) []T {
var ret []T
for _, v := range s {
if f(v) {
ret = append(ret, v)
}
}
return r

元記事を表示

【GO】base64形式で受け取った画像をGCSにアップロードする

# はじめに
画像をGCSアップロードする際、画像をフロント側から
1. **「multipart/form-data」**で受けとる記事は多くはあったのですが、
2. **「Base64(json)」**で受け取るものが見当たらなかったので、こちらを実装してみました。:relieved:

### 本記事のゴール
「**GO**を使って、フロント側から**base64**で受け取った画像をGCSにアップロードすること」

### 動作環境
go 1.17

# 目次

– [準備](#準備)
– [ソースコード](#ソースコード)
– [解説](#解説)
– [補足](#補足)
– [参考サイト](#参考サイト)

# 準備
### jsonKeyの取得
取得した~~~.jsonをルート直下に配置します。(どこでも良いです)

“`markdown
main.go
gstorage.go
~~~.json
“`

細かい取得手順は割愛します。自分は以下記事を参考にさせていただきました:slight_smile:
[Google Cloud Storageの接続設定](https:

元記事を表示

Exercise: Loops and Functions

## 概要

Goのチュートリアル「A Tour of Go」で、[関数とループを使って平方根の計算を実装する課題](https://go-tour-jp.appspot.com/flowcontrol/8)があったので記念に記録します。 時間的には5分程で解きました。「強い」エンジニアの」方々からしたら亀の歩みですね。

## 初期コード

“`exercise-loops-and-functions.go
package main

import (
“fmt”
)

func Sqrt(x float64) float64 {
}

func main() {
fmt.Println(Sqrt(2))
}

“`

## 完成コード

“`exercise-loops-and-functions.go
package main

import (
“fmt”
“math”
)

func Sqrt(x float64) float64 {
z := 1.0

for i := 1; i <= 10; i++ { z -= (z*z - x) / (2

元記事を表示

IntelliJ Go Pluginを設定する

IntelliJ Go Pluginは起動直後はまともに動かないので設定が必要。

## GOROOT
* Languages & Frameworks > Go > GOROOT

Goがインストールされたprefixをいれる。macOSだと `/usr/local/opt/go/libexec` が自動的に指定されるのでそれをセットする。

## GOPATH
* Languages & Frameworks > Go > GOPATH

GOPATHをいれる。僕はGOPATHはHOMEなので `$HOME` にあたるパスをセットする。
Go Modulesを使っている場合は「Index entire GOPATH」のチェックは外しておいた方がいいらしい。

## Go Modules
* Languages & Frameworks > Go > Go Modules

go.mod を使っているリポジトリでインデックスが動くようにするには、Enable Go modules integrationにチェックをいれる。Environmentは空のままでも動く。

元記事を表示

自分用GoでAPIを作る前に作るHttpClientラッパー

Go で API を作るときは実際にサーバを起動して HTTP で叩くテストを作りたいので HTTP で叩くのを簡単にする自分用ツール。認証を回避できない環境で Swagger とか POSTMAN を手作業でAuth通して叩くのは面倒なので Go Test 上で認証して叩くことができる。おまけでレスポンスの Unmarshalもできる。[GitHubはここ](https://github.com/turanukimaru/knocker)。
いつでもAPIが叩けると精神衛生上良いし、フロントからエラー報告が来た時もすぐ検証ができる。
GitHub にアクセスできない仕事場が稀に良く有るので貼り付けさせてください。

使い方

“`Go

// ここまで省略。 Server を起動しておいてから以下を実行するテストコードを書く。
// サーバー接続情報を作る
k := Knocker{“127.0.0.1”, 8080, “”}
// シンプルな Get ただし認証が通らない。b は res.Body の文字列
t.Run(“Required authorization toke

元記事を表示

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

![Go 言語スプレッドシートライブラリ:Excelize 2.5.0 がリリースされました](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144042/37b9bc8f-77d5-70d4-3eaa-d34086abc3e7.png)

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

場合によっては、既存の Excel ドキュメントコンテンツの読み込み、新しい Excel ドキュメントの作成、既存のドキュメント(テンプレート)に基づく新しい

元記事を表示

OTHERカテゴリの最新記事