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

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

【Go】GinでURLからパラメーターを受け取る2つの方法

# 概要

Ginを使用したAPI開発などでURLからパラメーターを受け取る際、
パラメーターの種類によって受け取り方が異なるのでまとめました。

クエリパラメータ
`http://example.com/user?id=123`

パスパラメータ
`http://example.com/user/123`

# 受け取り方

“`go:クエリパラメータの場合
router.GET(“/user”, func(ctx *gin.Context) {
id := ctx.Query(“id”)
})
“`

“`go:パスパラメータの場合
router.GET(“/user/:id”, func(ctx *gin.Context) {
ctx.Param(“id”)
})
“`

以上です。

元記事を表示

並行実行するテストで環境変数を設定しているコードを指摘するGoの静的解析ツールを作った

本記事では、自分が静的解析の勉強のために作成したツール`parallelenv`の紹介をします。

## 並行実行するテストでは、環境変数を設定してはいけない
Go1.17より、テストごとに環境変数を設定するためのメソッドとして`testing`パッケージに`t.Setenv`が追加されました。Go1.17以前ではテストが終了しても環境変数が破棄できない`os.Setenv`を使用するほかなかったため、かなり便利になりました。

“`go
// v1.7以前
err := os.Setenv(“LANGUAGE”, “go”)

// v1.7以降
t.Setenv(“LANGUAGE”, “go”)
“`

ここで、**テストで環境変数を使用する上で注意があります。**
`t.Parallel`でテストを並行実行するようにしていると、並列で動作した場合にテスト動作中の環境変数の寿命の扱いが破綻してしまい、参照する環境変数の値がめちゃくちゃになってしまいます。

上記のような想定外の動作を防ぐために、`t.Setenv`の中では一つのテスト関数内で`t.Setenv`と`t.Par

元記事を表示

goでChatworkにメッセージを送るサンプル

“`golang
package main

import (
“net/http”
“net/url”
“strings”
)

func main() {
roomID := “xxxxxxxxxx”
apiUrl := “https://api.chatwork.com/v2/rooms/” + roomID + “/messages”
apiToken := “xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx”
ChatworkMessagePost(apiUrl, apiToken, “testmessage”)
}

func ChatworkMessagePost(apiUrl, apiToken, message string) error {
values := url.Values{}
values.Set(“body”, message)

req, err := http.NewRequest(
“POST”,
apiUrl,
strings.NewReader(values.Encode()),
)

元記事を表示

【備忘録】Golangでenum風に利用する

### Golangでenum風に利用する。
Golangではenum型が提供されていないため、実装を工夫する事でenum風に利用する事ができます。

“`golang:main.go
package main

import “fmt”

type Animal int

const (
Unknown Animal = iota
Dog
Cat
Horse
Lion
Tiger
Rabbit
)

func (e Animal) Names() []string {
return []string{
“unknown”,
“犬”,
“猫”,
“馬”,
“ライオン”,
“トラ”,
“兎”,
}
}

func (e Animal) String() string {
return e.Names()[e]
}

func main() {
fmt.Printf(“動物の名前は? %+v\n”, Dog)
fmt.Printf(“動物の名前は? %+v\n”, Cat)
fmt.Printf(“動物の名前は? %+v\n”, Ti

元記事を表示

WebTransportでもWarp(超低遅延配信)がしたい!

# 1秒未満の超低遅延配信が見れます
[デモサイト](https://demo-webtrans.tokishirazu.llc/warp-demo/index.html)、最新のChromeでのみ動きます。[Big Buck Burmy](https://peach.blender.org/)をストリームで繰り返し配信しています。
[ソースコード](https://github.com/alivelime/sample_webtransport/tree/master/warp-demo) : サーバー側のソースはGoのみです。(aioquicがやっぱり不安定?) 環境構築周りのファイルはないです

既知の問題
– ビットレートは500kです (GPU付きインスタンスは高いから仕方ないよね)
– 同一のブラウザで複数開くと挙動がおかしくなるかもしれません

gRPCのstream方式でCSV出力処理を実装する

# はじめに
マイクロサービス方式の開発で選定されることが多いgRPCを用いてCSV出力処理を実装してみました。

# gRPCの通信方式

* Unary RPCs
シンプルな通信方式。1つのrequestに対して1つのresponseが返ってくる方式になります。gRPCの通信方式の中で一番REST方式に近いものになると思います。
* Server streaming RPCs
クライアントからの1つのrequestに対して、サーバーから複数のresponseを返すことができる通信方式になります。サーバーからクライアントに向けてサイズの大きいファイルなどを送信したい場合に使うことが多いと思います。
* Client streaming RPCs
クライアントからの複数のrequestに対して、サーバーから1つのresponseを返す通信方式になります。クライアントからサーバーに向けてサイズの大きいファイルなどをアップロードする際に使うことが多いと思います。
* Bidirectional streaming RPCs
クライアントからの複数のrequestに対して、サーバーから複数

元記事を表示

[go入門]Pythonと比べてgoに親しむ[スクレイピング]

# goでスクレイピング

、初見の`go`でスクレイピングプログラムを書いてみます。

## 環境
– MacBook Pro 2021 14inc
– macOS Montrey 12.0
– go version 1.182

## インストール
今回はバージョン管理のことは考えず、`homebrew`でインストールします。

“`bash
$ brew install go
“`

インストール確認

“`bash
$ go version
go version go1.18.2 darwin/arm64
“`

作業ディレクトリを用意したら

“`bash
go mod init ディレクトリ名
“`

を実行しておきましょう。モジュールを使用する際に必要になります。

## 通信部分
スクレイピングの最初の工程はurlからhtmlを獲得することです。
goでは組み込みモジュールの`net/http`が用意されています。

“`go
res, err := http.Get(url)
“`

Pythonなら
“`python
requests.get(

元記事を表示

Lambdaでgoを取り扱う

## Functionを作る

“`handler.go
package main

import (
“context”
“fmt”

“github.com/aws/aws-lambda-go/lambda”
)

type MyEvent struct {
Name string `json:”name”`
}

func tes(ctx context.Context, name MyEvent) (string, error) {
return fmt.Sprintf(“Hello %s!”, name.Name), nil
}
func main() {
lambda.Start(tes)
}
“`

## Zipを作る
– LambdaでGoを扱う場合、go buildしたバイナリファイルをzipにしてLambdaFunctionへアップロードする必要がある

“`
go mod init go-lambda
go get github.com/aws/aws-lambda-go/lambda
go mod tidy
GOOS=linux go bui

元記事を表示

Twitter Oauth1.0認証方法メモ [golang]

## Twitter開発者登録
1. プロジェクト作成
1. アプリ作成
1. API KeyとAPI Secretを控えておく(ドキュメントではConsumer KeyとConsumer Secretと記載されている)
1. Setting画面からOAuth1.0aを有効化する
1. App permissionsを変更する(投稿処理はRead and write)
1. Callback URI/Redirect URLを設定する
1. 認証画面でユーザーが認証実行した後に遷移するURL

## Go言語での実装

**認証画面URLの生成**
“`go
import (
“net/url”

“github.com/dghubble/oauth1”
“github.com/dghubble/oauth1/twitter”
)

// oauth1のconfig作成
conf := &oauth1.Config{
ConsumerKey: [ConsumerKey],
ConsumerSecret: [Consume

元記事を表示

google-cloud-go の使ってみた操作まとめ

前から Google Cloud Storage には興味があったのでラーメンの写真を記録するサービスを作るのに使ってみました。機能ごとにもリンクを貼りますが、ひとまず公式ドキュメントとリポジトリは以下になります。

**実行環境**
“`
go: v1.18
cloud.google.com/go/storage: v1.22.0
“`
https://pkg.go.dev/cloud.google.com/go/storage

https://github.com/googleapis/google-cloud-go

※ 全体を通してエラーハンドリングは省略しています。
## 事前準備:クライアントの作成
クライアントの作成に使用するため、事前に GCP のアカウント作成と鍵ファイルをダウンロードしておきます。

今回はダウンロードした鍵ファイルを引数にとり [WithCredentialsFile] を使用します。(https://pkg.go.dev/google.golang.org/api/option#WithCredentialsFile)

“`
// これ

元記事を表示

LeetCodeのRoman to Integer を解いてみた

## LeetCodeを解いた動機
最近転職活動をしているのですが、面接のコーディング試験の出来が良くなくLeetCodeを解くように勧められました。
また個人の課題として開発進捗が遅いことがあって、LeetCodeの答えには擬似プログラミングがあるので合わせて練習したいなと思いました。
## 問題内容
こちら参照
https://leetcode.com/problems/roman-to-integer
## 自分で書いた擬似プログラミング
今回メモを消してしまったため、次回以降記載

## 自分で書いたコード

“`golang.go
func romanToInt(s string) int {
symbolArray := map[string]int{
“I”: 1,
“V”: 5,
“X”: 10,
“L”: 50,
“C”: 100,
“D”: 500,
“M”: 1000,
}
var splitS = strings.Split(s, “,”)
returnInt := 0

isSkip := false
for i, _

元記事を表示

【備忘録】Golangで日付の操作を実施する。

## 日付の操作
“`golang:main.go
package main

import (
“fmt”
“time”
)

func main() {
n := time.Now()

// fmt.Println(n.Format(“2006-01-02 15:04:05”))
year := n.Format(“2006”)
month := n.Format(“2006-01”)
day := n.Format(“2006-01-02”)
hour := n.Format(“2006-01-02 15”)
min := n.Format(“2006-01-02 15:04”)
sec := n.Format(“2006-01-02 15:04:05”)
fmt.Println(“year: “, year)
fmt.Println(“month: “, month)
fmt.Println(“day: “, day)
fmt.Println(“hour: “, hour)
fmt.Println(“min: “, min)
fmt.Prin

元記事を表示

GoでCRUD処理のREST APIを作ろう〜Reactを添えて〜

# はじめに
– 参考文献にも掲載しています以下記事を自分の勉強用にアレンジしてまとめ直したものになります。こちらの記事の方がハイレベルな実装になっていますが、もう少し簡素化してGoでAPIを作る大枠を理解したいと思ったのが執筆の動機です。そのためフロント側は簡単な説明のみです。ご了承ください。

https://dev.classmethod.jp/articles/go-sample-rest-api/

– バックエンド側はDockerを使用していますが、環境構築方法について本稿では触れません。こちらは以下記事をちょろっとカスタムして作っています。

https://zenn.dev/ajapa/articles/443c396a2c5dd1

– 網羅的な説明はしていないので、まずリポジトリをざっと見て処理の流れを追ってもらった上で読み進めていただいた方が読みやすいと思います。README.mdにも起動方法を記載しております。**“`masterブランチ“`は記事よりも手を加えてしまっているので、“`for_qiitaブランチ“`を参照ください。**

https://

元記事を表示

自分の得意なプログラミング言語でSymbolブロックチェーンを動かす方法

Symbolブロックチェーンはプログラミング言語を問わずスマートコントラクトが実装できるように設計されています。ところが、現在リリースされているsdkアルファ版はJavascriptとPythonのみサポートです。では、他の言語ではまだアプリ開発できないのでしょうか?と言われればそうでもありません。

**組み込みされたデジタル装置で署名**したかったり、**マルチシグ化した連署者アカウントの署名をサーバ側で機械的に実施**したり、**IoTなどほぼ単一のトランザクションを定期的に実施**したり、複雑なことは必要ないユースケースが実はたくさん眠っているかもしれません。

ここでは、そういった「あとはSymbolブロックチェーンにトランザクション投げるだけなんだが」といった方を対象にトランザクションの作り方を解説します。
なお、トランザクションの送信以外(例えばモザイクの生成やマルチシグの組成など)はウォレットなどを利用して準備する前提で進めます。

後記:
Symbol/NEMのコアチームからのSDKについての考え方を転載しておきます。
> 私たちは、コミュニティが(SDKではなく)直

元記事を表示

Golangでform dataから受け取った画像をS3にアップロード

# はじめに
GolangでAPIサーバーを構築しており、APIで受け取った画像データをS3にアップロードする処理を実装したので、方法を共有しようと思います。初心者Golangerなので受け取った画像をリサイズなどせずにそのままアップロードする方法しかわからなかったので、その点は悪しからず。むしろ方法をご教示いただきたい所存。。。S3以外の処理は省略します。

# 完成コード
“`golang:s3Handler.go
func (app *Application) imageUpload(w http.ResponseWriter, r *http.Request) {
err := godotenv.Load(fmt.Sprintf(“./%s.env”, os.Getenv(“GO_ENV”)))
if err != nil {
log.Fatalln(err)
}
ak := os.Getenv(“AWS_ACCESS_KEY”) // .envのAWS_ACCESS_KEY
ask := os.Getenv(“AWS_SECRET_ACCESS

元記事を表示

Go製のORM である Facebook / ent を使ってみたらなかなかイケてた話

# はじめに
Facebookが開発しているGo製のORMであるentを業務で使い始めたので、基本的な構文などをまとめます。

# 導入
– CRUD操作についての確認
https://entgo.io/docs/crud

– validatorの定義方法の確認
https://entgo.io/docs/schema-fields/#validators

– migrationの実行方法及びversioned migrationの調査
https://entgo.io/docs/migrate#auto-migration
https://entgo.io/docs/versioned-migrations#generating-versioned-migration-files
https://entgo.io/docs/versioned-migrations#apply-migrations

– association(entだとedge)の定義方法の確認
https://entgo.io/docs/schema-edges/

# datetimeを更新しようとした

元記事を表示

Github ActionsでGolang & gRPCのテストを実行する

# はじめに
golangとgRPCを用いたapiの自動テストを実行するための設定手順です。

# protoc のセットアップについて

CIコンテナ内で `protoc` コマンドを利用できるようにするためのセットアップをおこなった際に、少しハマりどころがあったので説明をしておきます。

以下の様に自前でprotocの環境構築を行うと、protocコマンド実行環境整備完了後に、なぜかMySQLの`connection refused`エラーが発生した。

* MySQLのエラー

“`sh
curl: (7) Failed to connect to 127.0.0.1 port 3307: Connection refused
“`

* protoc実行環境を自前で整備しようとしているjob

“`yml
– name: Set up protoc
run: |
sudo apt-get update && sudo apt-get upgrade -y
sudo apt-get install -y c

元記事を表示

【Go】VSCodeでGo言語の開発環境を整えてみよう【Golang】【主にWindows・初心者向け】

#### Visual Studio Code(VSCode)でGoによる開発しよう

 クラウドやコンテナ界隈でもよく聞くGo言語。最近入門したので備忘録を兼ねて、このエントリではVSCodeを使ったGo開発環境構築の手順を記してみます。
 以下、主にWindowsを想定していますが他のOSでもそれほど変わりませんので、適宜読み替えてください。

余談ですがGo公式のブログには[Go’s New Brand](https://go.dev/blog/go-brand)記載のカラーや[Go fonts](https://go.dev/blog/go-fonts)記載の公式Goフォントなどもあり、スライド資料作成や画像作成などに使えます。ロゴやマスコットのゴーファー君も透過PNGの画像が用意されていてありがたいです。

#### Go言語のインストール手順

 ネット上でも各所に載っていますが、この記事でもまとめてみます。

https://go.dev/

– 公式サイトの[Downloads](https://go.dev/dl/)ページから、Windws/Mac/Li

元記事を表示

【備忘録】Golangで文字列型(YYYY-MM)から月を取得する

“`go:main.go
package main

import (
“fmt”
“strconv”
)
func main() {
// YYYY-MM形式から月を保存する。
str := “2021-04”
str2 := str[5:]
month, _ := strconv.Atoi(str2)
fmt.Println(“month: “,month)

str = “2021-12”
str2 = str[5:]
month, _ = strconv.Atoi(str2)
fmt.Println(“month: “,month)
}
“`

“`shell:実行結果
~/go/src/array_slice $ go run main.go
month: 4
month: 12
“`

元記事を表示

【備忘録】GolangでMapを利用する。

## GolangでMapを利用する。

“`go:main.go
package main

import “fmt”

func main() {
// ユーザIDと名前のMapを作成する。
userIDToNameMap := map[int]string{123: “tanaka”, 234:”takeru”, 345: “kkfactory”}
fmt.Println(“userIDToNameMap: “,userIDToNameMap)

// Keyに対するValueを取得する。
fmt.Println(“userIDが123の値は”, userIDToNameMap[123])

// 要素を追加する。
userIDToNameMap[456]=”takeshi”
fmt.Println(“userIDToNameMap: “,userIDToNameMap)

// Valueの値を更新する
userIDToNameMap[123]=”kouji”
fmt.Println(“userIDが123の値は”, userIDToNameMap[12

元記事を表示

OTHERカテゴリの最新記事