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

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

goquery & chrome driver

https://worklog.be/archives/3422

https://jpdebug.com/p/2334398

https://sites.google.com/chromium.org/driver/

https://chromedriver.chromium.org/downloads

https://qiita.com/libra_lt/items/b1e3ba2c9fc33a23951d

https://qiita.com/isao_e_dev/items/3a0f4e881fc7142ef489

https://gosamples.dev/string-padding/

元記事を表示

Golangはじめて物語(第11話: Gin+time/rateでお手軽に流量制御を行う)

# はじめに
[以前書いたSpringBoot編](https://qiita.com/neruneruo/items/37f0a0181b291eb6ffbd)で触れたとおり、マイクロサービスなシステムを作っていく上で、RateLimitは重要な要素になってくる。
Golangでは標準ライブラリでRateLimitが実装できるものが容易されているので、今回はそれをGinに組み込んで、お手軽に流量制御をやってみよう。

なお、記事執筆時点でGolangのランタイムは1.13を使っている。

# RateLimitライブラリ
RateLimitを行うライブラリは、[公式ドキュメント](https://pkg.go.dev/golang.org/x/time/rate)を参考にしよう。
このライブラリは、[トークンバケットアルゴリズム](https://ja.wikipedia.org/wiki/%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3%E3%83%90%E3%82%B1%E3%83%83%E3%83%88)を用いているので、まずはこの基本を押さえておこう。

元記事を表示

【Go】sqlxの使い方メモ

# はじめに
sqlxというライブラリを使ってみたのでメモ。

# sqlxとは
標準ライブラリ`database/sql`の拡張ライブラリです。
`database/sql`では、DBからとってきたデータをカラムごとにScan(型変換)して構造体にマッピングする必要があるのですが、カラム数が多いとこの部分の記述が非常に苦痛です。
この面倒な作業を勝手にやってくれたりするのが`sqlx`の役割です。

https://github.com/jmoiron/sqlx

↓`database/sql`を使った場合のScan処理の例

“`go:customerRepositoryDb.go
type CustomerRepositoryDb struct {
client *sql.DB
}

func (d CustomerRepositoryDb) FindAll() ([]Customer, error) {
findAllSql := “select customer_id, name, city, zipcode, date_of_birth, status from cu

元記事を表示

Go言語 エラー処理

## エラー処理
Goにおけるエラー処理は、関数の多値返しにて実現する。
関数は処理結果とエラー値を返し、エラー値を確認することにより異常処理の場合を見分ける。
正常処理の場合は、エラー値はnil(Null)である。
異常が起こった場合は、エラー値の中にエラー情報が格納されている。

## Code
“`Go
// 割り算を行う関数
func calcDiv(molec int, denomi int) (result int, err error) {
result = molec / denomi
return result, err
}

func main() {

// 正常に計算される割り算
result1, err := calcDiv(128, 4)
if err != nil { // 正常処理の場合は、errに値が格納されない
log.Fatal(err)
}
fmt.Printf(“Answer : %d \n”, result1)

// エラーが発生する0による割り算
result2, err := calcDiv(128, 0)
i

元記事を表示

Container-Optimized OS用にコマンドを定期実行するコンテナを作ってみた

突然ですが、 GCE の Container-Optimized OS で、定期実行がしたいです。より具体的には、**定期的に Let’s Encrypt の certbot が動かしたい**のです。

調べたところ、

* (アプリケーションサーバとか)使う連中のどこかに cron をインストールして一緒に動かす
* cron をインストールしたコンテナを作ってがんばる
* tasker コンテナを使う

みたいなのが出てきます。一番上はちょっと…と思い、他二つをがんばってみましたが、**なんでか苦労する**のですよね。**たかが定期実行したいだけなのに…**。

だったら雑に、無限ループで `sleep` とコマンド実行をし続けるプログラムを書いちゃうほうが楽じゃないか、と思いました。

# 要件

* Docker コンテナを使って任意のコマンドを定期実行したい
* cron のように「何時何分に実行したい」のではなく、**概ね一定間隔で実行されていれば厳密性は問わない**

全く何も考えずに書くとつまりこういうことがしたい。

“`go:runner.go
packa

元記事を表示

【Go】ロギングライブラリzapの使い方メモ

# はじめに
Goのロギングライブラリであるzapに関するメモです。

# zapとは
構造化メッセージを自由に構築できる、高速なロギングライブラリです。
ベンチマークによると、標準ライブラリ(fmt, encoding/json)やlogrusより高速とのことです。

https://github.com/uber-go/zap#performance

# 実装
以下が初期化のプログラムです。

“`go:logger.go
package logger

import (
“go.uber.org/zap”
“go.uber.org/zap/zapcore”
)

var log *zap.Logger

func init() {
var err error

config := zap.NewProductionConfig()

encoderConfig := zap.NewProductionEncoderConfig()
encoderConfig.TimeKey = “timestamp”
encoderConfig.EncodeTime = zap

元記事を表示

Goのcontext実装にお手本のようなDouble-Checked Lockingが利用されていた話

# `cancelCtx.done`の型変更
Goの標準ライブラリを読んだことがある人ならば、`context`パッケージを読んだことがある人が多いのではないだろうか。

自分もその一人で、`context.Context`の機能自体が好きなのもあるが、`context`パッケージの実装はGoらしさが詰まっていて、十分短い(600秒未満)のでサクッと読めてとても参考になる。

過去3回ほど読み直しているが久しぶりに読み直してみたら、「おっ」と思うような修正が入っていた。

以下の一年前のパッチである。
https://github.com/golang/go/commit/ae1fa08e4138c49c8e7fa10c3eadbfca0233842b

下がdiffの一部であるが、`cancelCtx.done`の型が `chan struct{}`から`atomic.Value`に変更されているではないか。

![スクリーンショット 2022-04-09 0.13.58.png](https://qiita-image-store.s3.ap-northeast-1.amazona

元記事を表示

GolangでPKI入門 – 6

# 1.この記事の対象の人
– Golang で DN (Subject や Issuer) を扱いたい人
– Golang で DN (Subject や Issuer) を扱う[ライブラリ](https://github.com/tardevnull/dnutil)を探している人

# 2.DNとは
DN(Distinguished Name) は X.500 と X.501 で定義されたディレクトリサービスモデルにおいて、そのオブジェクトを一意に識別するための識別名です。X.509 PKI は、ディレクトリサービスモデルを採用しているので、そのオブジェクトの一つである 主体者(Subject)や発行者(Issuer) も、DN によって表現されます。ディレクトリでは、オブジェクトはオブジェクトクラスに基づきエントリとして表現されます。ディレクトリはエントリによるツリー構造で構成され、このツリーは DIT (Directory Information Tree)と呼ばれます。エントリはクラスに基づき複数の属性をもち、属性は属性型と属性値をもちます。このエントリを DIT 内の同一階

元記事を表示

paizaの練習問題でを活用してGoのUnitテストを書いてみた

## 単体テストのやり方のイメージが湧かない
これまで業務でperlを使っていたこともあってテストを手動、かつブラウザの画面上から手動で行なっていたため
Goを導入してからローカルでかつ自動でテストを行うパッケージが標準で用意されていると知っても
– 「どのように使えばいいか」
– 「どういう時に使用するのか」

といったイメージが全く湧かない状態でした。

ともあれ、使ってみなければ一生理解できることなどない!ということでtestingパッケージをまずは使ってみようと考えていたところ、paizaの問題の全部または一部をtestingパッケージでテストしてみることを思いつきました。

初めて自動で単体テストをやる人の足掛かりになれば幸いです。

## 事前のインプット
[みんなのGo言語](https://gihyo.jp/book/2019/978-4-297-10727-7)という書籍を読みました。
Go界隈で有名な人が共著で出版していて、業務で必要なGoの基礎知識が書かれた本で、
テストについてもこの書籍の第6章で取り上げられていました。
章単位で取り上げるほどテストが重要項目

元記事を表示

Go言語 メソッド

## Method
任意の型に特化した関数を、定義する仕組み。
通常の関数と異なる点は、メソッド名の前にレシーバーが必要になること。

## Code
“`Go
// 映画タイトルのための構造体
type Movie struct {
Directer string
Title string
Year int
}

// 映画情報を出力するメソッド
func (m *Movie) infoMovie() {
// レシーバーの変数を介して、値を出力
fmt.Printf(“Title : %s, Directer : %s, Year : %d \n”, m.Title, m.Directer, m.Year)
}

// メイン関数
func main() {

// 映画情報を格納
movie1 := &Movie{
Directer: “Steven Spielberg”,
Title: “Saving Private Ryan”,
Year: 1998,
}

// infoMovieメソッドの呼び出し
movie1.infoMo

元記事を表示

Goのポインタに関して図を用いて説明する

## 初めに
Goのポインタを理解するのに苦戦したため、基本的な内容を自分なりにかみ砕いて投稿する。

■ 実行環境
[The Go Playground](https://go.dev/play/)
■ GOのバージョン
1.18

## 前提情報の整理
### 用語
– メインメモリ(主記憶装置)・・・コンピュータのデータ記憶領域。
– メモリアドレス・・・各メモリに割り振られるメモリのアドレス。
– ポインタ(ポインタ変数)・・・メモリアドレスとその領域の型を格納する変数。
– ポインタ型・・・ポインタの型。(Int型へのポインタ型、string型へのポイント型など)

※ポインタとポインタ変数に関しては、記事によって表現にブレがあるため、必ずしも今回の定義であるとは限らない。

### ポインタは何を実現するものか
メモリアドレスを使用して、メモリにアクセスする手段である。
### なぜポインタに型が必要なのか
型によって必要なバイト数が異なるため。

### 変数とメモリ
コンピュータは、変数が定義された際にメインメモリに変数を格納する。
※本来データ型によって使用する

元記事を表示

goenvとさよならして、goのバージョンを使い分ける

![macOS-12.3.1](https://img.shields.io/badge/macOS-12.3.1-brightgreen) ![go-1.18](https://img.shields.io/badge/go-1.18-brightgreen)

公式からGoの複数バージョンの取り扱い方が発表されていたので、goenvとさよならして公式の方法で運用することにしました。
goenvのアンインストールと複数バージョンのGoの扱い方について公式を引用しつつ記載します。

## goenvのアンインストール方法

アンインストール方法は、goenvのgithubに記載があります。
https://github.com/syndbg/goenv/blob/master/INSTALL.md#uninstalling-goenv

まずは、自分のローカルマシンに設定している環境変数の設定を削除します。
私の場合は.zshrcに記載している以下の3行(コメント入れて4行)を削除しました。

“`zsh
# for goenv
export GOENV_ROOT=”$HOME/.g

元記事を表示

Go言語 構造体

## 構造体
構造体とは、複数の任意の型を、1つの要素にまとめたもの。
さまざまなデータ構造を、1つの「型」として扱うことが可能。

## Code
“`Go
// 監督名のための共通化用構造体
type Directer struct {
Name string
Country string
}

// 映画タイトルのための構造体
type Movie struct {
Directer
Title string
Year int
}

// 受賞タイトルのための構造体
type Prise struct {
Directer
Title string
Year int
}

// メイン関数
func main() {

// スティーブン・スピルバーグ
movie1 := Movie{
Directer: Directer{“Steven Spielberg”, “USA”},
Title: “Saving Private Ryan”,
Year: 1998,
}
prise1 := Prise{
Dir

元記事を表示

Go の気になったコミット (2022 年 3 月)

[golang/go](https://github.com/golang/go) の master ブランチに行われたコミットから個人的に気になったものをリストにしたものです。
タイトルに 2022 年 3 月と銘打っていますが 2 月のコミットも含まれています。

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

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

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

## Topic

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

– Go 1.18 がリリースされました。 :rocket:
– Go 1.19 の開発がスタートしました。 :rocket:

## Commits

### 2022-02-10

https://github.com/golang/go/commit/9cec77ac11b012283e654b423cf85cf9976bedd9

Go 1.18 で追加される `debug.BuildInfo` が提供する関数が変更されました。

htt

元記事を表示

Go言語 ゴルーチン

## ゴルーチン
ゴールーチンと呼ばれる、スレッドを用いて並行処理を行う機能。
関数に「go」を付加することで、その関数は並行的に処理される。

## Code
“`Go
// 素数をチェックする関数
func checkPrime(number int) bool {
isPrime := true
if number == 0 || number == 1 {
return false
} else {
for i := 2; i <= number/2; i++ { if number%i == 0 { isPrime = false break } } if isPrime == true { return true } } return false } // 素数を生成する関数 func primeRoutine1() { i := 0 for { i += 1 if checkPrime(i) { fmt.Printf("PrimeRoutine1 ☆ : %d\n", i) } }

元記事を表示

初心者がGoを学ぶときに気になったことメモ

最近のはやりに乗って、GoとBlockchainの両方をこの動画(シリコンバレーエンジニアの酒井潤さんの「現役シリコンバレーエンジニアが教えるGoで始めるスクラッチからのブロックチェーン開発入門」https://www.udemy.com/course/go-blockchain/
)を見て勉強し始め、ここ最近終了したところなのだが、なんせbackendもblockchainもまるで初心者なもので、この動画を通してGOの理解しにくかった部分を自分なりにかみくだいてアウトプットしていこうと思う。僕のようにバックエンド完全初心者の手助けになれば幸いです

# MarshalJsonって何?

MarshalJsonというのは、構造体→JSON形式に変換することらしい。
(逆にUnMarshalJsonというのは、JSON形式→構造体に変換すること)

しかし、この講座をみていると、少し不思議な書き方をしていた。

“`golang:blockchain.go
type Block struct {
timestamp int64
nonce int
prev

元記事を表示

【Go】XORMでOracle Databaseに接続する

## 概要
GolangのO/Rマッパーで、Oracle Databaseへの接続できるものがないか探してみたところ、[XORM](https://xorm.io/)というライブラリに行き着きました。[こちら](https://gobook.io/read/gitea.com/xorm/manual-en-US/)のドキュメントにある通り、Oracleのドライバー対応は2022年4月現在はexperimentの状態ですが、使えなくもないだろうということで少し試してみました。

## 前提
[mattn/go-oci8](https://github.com/mattn/go-oci8)のセッティングを事前に行なってください。[【Oracle】Mac環境でmattn/go-oci8のライブラリをインストール時「oci.h: No such file or directory」が発生](https://qiita.com/someone7140/items/47bc754040374e2c5c8f)の記事も、参考になるかと思います。

## 実装サンプル(接続部分)
DBの接続部分(エンジ

元記事を表示

GithubActionsとAWS App Runnerで自動デプロイしてみた

## はじめに
最近参加したwebinerにて、AWS App Runnerというものを知ったため触ってみました。

https://aws.amazon.com/jp/apprunner/

簡潔にいうと、
>コンテナ化されたウェブアプリケーションや API を開発者が簡単かつ迅速にデプロイできるフルマネージド型サービスです

とのことです。
GitHubのソースコードをApp Runner上でビルド&デプロイ、またはECRのビルド済みコンテナイメージがデプロイできます。

webinerではGitHubのソースコードからデプロイを行うデモをしており、同じような手順で試したところ、確かにあっさりとサービスが立ち上がりました。
記事にするほどでもないくらいサクッとできてしまったため、折角なので今回はECRのイメージからのデプロイをやってみました。
また、前々からGithubActionsを触ってみたいと思っており、うまく連携させられるみたいだったため取り入れてみます。

## GitHub Actionsとは
https://docs.github.com/ja/actions/lea

元記事を表示

Go言語 マップ

## マップ
連想配列に類するデータ構造。
任意のキーと、任意の値を保持することが出来る。

## Code
“`Go
func main() {
// マップの生成
abcMap := make(map[int]string)
fmt.Println(abcMap)

// 値の代入
abcMap[1] = “A”
abcMap[2] = “B”
abcMap[3] = “C”
fmt.Println(abcMap)

// リテラルを用いた生成
abcdeMap := map[int]string{1:”A”, 2:”B”, 3:”C”, 4:”D”, 5:”E”}
fmt.Println(abcdeMap)

// 要素の参照
fmt.Println(abcdeMap[1])
fmt.Println(abcdeMap[5])

// 要素数
fmt.Println(len(abcMap))

// 要素の削除
delete(abcMap, 2)
fmt.Println(abcMap)

// forによる出力
for i, m := r

元記事を表示

Go言語 スライス

## スライス
可変長配列を表す型。
配列と違い、スライスは要素の追加が出来る。

## Code
“`Go
func main() {
// スライスの生成
tenSlice := make([]int, 10)
fmt.Println(tenSlice)

// 要素への代入
tenSlice[0] = 123
tenSlice[3] = 456
tenSlice[6] = 789
fmt.Println(tenSlice)

// 値の参照
fmt.Println(tenSlice[0])
fmt.Println(tenSlice[1])

// スライスの要素数
fmt.Println(len(tenSlice))

// スライスの容量
fmt.Println(cap(tenSlice))

// 簡易スライス式
fiveSlice := tenSlice[2:7]
fmt.Println(fiveSlice)

// 要素の拡張
elevenSlice := append(tenSlice, 101112)
fmt.Println

元記事を表示

OTHERカテゴリの最新記事