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

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

Go言語 パッケージ

## Package
Goのプログラムは、全て何らかのパッケージに属する。
Importによって指定することにより、対象のパッケージが使用できるようになる。
また、1つのパッケージ内で、複数のソースコードファイルを使用してプログラムを定義できる。
変数や関数の頭文字を大文字にすれば、他のパッケージから参照出来るようになる。

## Code
“`Go
package main

import (
“fmt”
“./calculation”
)

// Main function
func main() {

// Calculation with functions in the calculation package
add := calculation.CalcAdd(10, 5)
sub := calculation.CalcSub(10, 5)
multi := calculation.CalcMulti(10, 5)
div := calculation.CalcDiv(10, 5)

// Output Value
fmt.Printf(“A

元記事を表示

goで実装した関数をpythonから呼び出す

# やりたいこと

下図のようにGoで記述した関数をPythonから呼び出します。

まずはGoプログラムをビルドして共有ライブラリ(※)を作成し、ビルドした共有ライブラリをPythonから呼び出します。
※ Linuxだと共有ライブラリ`.so`、Windowsだとダイナミックライブラリ`.dll`。

![イメージ図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/705474/7828f3da-acb2-d688-5724-530b60686929.png)

# 1. 共有ライブラリを作成

まずはGoでスクリプトを記述します。
記述する上でのポイントは以下です。

– package名はmainにする
– main関数を記述する
– 特殊コメントの`export`を記述する

“`go:test.go
// package名はmainにする
package main

import (
“fmt”
“C”
)

func main() {
// main関数を記述
}

元記事を表示

M1MacでGo/Ginの環境を作った過程

# はじめに
もともとWindowsユーザーだったけど、2022年01月からM1Macに変えました。
ただでさえ新しいガジェット(Mac)なのに、最新チップ(M1)でやったことない言語(Go)のさっき知ったフレームワーク(Gin)の環境を準備しようとしているんだから大変に決まってるよね。
だって記事がないんだもの。

そして、この記事はただの記録用です。
自分がこの後沼にハマる(確信)時に何をしたかを覚えておくためです。

**だからこの記事正しくないと思うよ!**

## 諸々のバージョン
Go: 1.18
OS: MacOS
チップ: M1

## Goのダウンロード&インストール
(やめればいいのに)最新verをインストールしました。
**go1.18.darwin-arm64.pkg**
です。

![スクリーンショット 2022-04-11 1.01.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/437352/e9f27a3e-f255-a169-96a0-2bca011dd3d1.pn

元記事を表示

Lambda function URLsをTerraformでお手軽構築する

# はじめに
4/7に突如登場したLambda function URLs。
ついにAPI GatewayやALBを介さずにLambdaが直接HTTPサーバの機能を持ったので、お手軽に利用する幅が拡がることだろう。
今回は、実際どれだけお手軽になったか、どんなことが制約になり得るかを実際に構築しながら考察をしてみたい。

なお、事前知識としては以下を想定している。

– TerraformでLambda Functionを作成した経験がある
– Lambda Permissionsに関する知識が多少ある

Lambda関数の実装にはGolangを使っているが、基本的なことしかやっていないためそれほど重要ではない。

# 構成図
今回は以下の構成で作成をする。

![構成図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111314/0d20ee3b-7998-c96d-05cf-a48660a19370.png)

– ServerとProxyのLambdaそれぞれにfunction URLsを設定する

元記事を表示

【Go】forループのrangeで要素を更新したいとき、2つ目の変数は使えない

# 概要

`range` が返す変数の仕様で躓いたので、備忘録として残しておきます。
(下記でいう`k`, `v`)

“`go
package main

import “fmt”

func main() {
foo := map[string]string{“key”: “value”}
for k, v := range foo {
fmt.Printf(“foo[%v]: %v”, k, v)
}
}

// => foo[key]: value

“`

# 詳細

## 結論

`range` を使うときは以下の方針で書くのがいいと思います。

– 要素を値を更新したい ⇒ 1つ目の変数を使う
– 要素を更新したくない ⇒ 2つ目の変数を使う

理由は、

– 1つ目の変数は配列, mapのindex, keyであり、この値を使えばループしている配列, mapの要素の実体を指定できる
– 2つ目の変数は1つ目の変数で返されたindex, keyで示される値の**コピー**である(値渡しである)

というGoの仕様があるからです。つまり、2つ目の引数に再代入

元記事を表示

Go言語のキャラクター「Gopherくん」が可愛いので、GO言語始めてみる

タイトルのとおりで、GO言語のマスコットキャラクターであるGopherくんが可愛いのでGO言語始めてみよう思います。

https://go.dev/

# Go言語とは
Googleが作ったWeb系の言語程度の前知識しかありませんでしたので、ちょっと調べてみました。
**以下、全部Wiki調べです。**

1. 静的型付け、C言語の伝統に則ったコンパイル言語、メモリ安全性、ガベージコレクション、構造的型付け、CSPスタイルの並行性などの特徴を持つ
2. Goのコンパイラ、ツール、およびソースコードは、すべてフリーかつオープンソースである
3. Pythonのような動的型付け言語のようなプログラミングの容易性、などの特徴もある
4. Go処理系としてはコンパイラのみが開発されている
5. **マスコット・キャラクターはGopher(ホリネズミ)**

コンパイル言語ということもあり、C言語やJavaに文法は近いらしいです。

**C言語で意識しなければいけないメモリリークなどはガベージコレクションでサポートして、Javaで言うVMは用いないため高速実行が可能**という素敵な言語みたいで

元記事を表示

【Go】DTOの使い方メモ

# はじめに
GoでDTOを使用する方法についてメモ。
以前、NestJSでバリデーションを行ったときにもDTOを利用したので、興味がある方はこちらもご覧ください。

https://qiita.com/suzuki0430/items/894e2da2b44156a2a437

# DTOとは
ドメイン層をインフラ層(DB)から分離したいときに使います。
例えば、以下のようなモデルが定義されているとします。
このとき、DBで`status = “0” or “1”`が管理されているとしても、DTOを使用すれば、ドメイン側では`Status = “active” or “inactive”`などに変換して取り扱うことができます。

“`go:domain/customer.go
type Customer struct {
Id string
Name string
City string
Zipcode string
DateofBirth string
Status string
}
“`

また、ドメインモデルの中にインフラ層のタグが入らないようにする

元記事を表示

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

元記事を表示

OTHERカテゴリの最新記事