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

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

Go言語のミドルウェア例

**やりたいこと**
条件によって呼び出すハンドラーを分ける。
又、同じ2つのミドルウェアメソッドを呼んでから最後に対象ハンドラーを呼ぶ。
 ・middleware1⇒middleware2⇒handler1
 ・middleware1⇒middleware2⇒handler2

**サンプル**

“`golang
// main.go
package main

import “fmt”

type handlerFunc func(interface{})
type chainHandlerFunc func(handlerFunc)

func main() {
middlewares := []chainHandlerFunc{middleware1(), middleware2()}
c := chainHandler(middlewares)
h1 := handler1()
c(h1)
h2 := handler2()
c(h2)

}

func handler1() handlerFunc {
return func(i interface{}) {

元記事を表示

Go言語 ファイル操作 まとめ

自分はリスキリングとして、Go言語の勉強を本格的に取り組んで、一ヶ月に満たない初心者だ。この記事は、学んだ事が、頭に定着するように、整理して書き残すものである。ここまで解った事として、Go言語を使いこなせるかどうかは、Go言語仕様を理解はもとより、Go言語のパッケージについての知識が大切だと感じた。そこで、設定ファイルの読み込みやログ出力、バッチ処理の基本となるファイル操作について必要な複数のパッケージについて整理を試みた。そのため、特定のパッケージの全機能を網羅するものではない。

## ファイル操作に有用なパッケージ

ファイル操作に活用されるパッケージは、以下の3つがある。これらを組み合わせて、目的の処理を記述すなければらなない。ファイル操作の開始時に必要なOpenとして、C言語では open, fopen の2系統があるが、Go言語では osパッケージに実装された open だけだ。これにより取得されたFile型変数を、bufio と io で利用することになる。

* [os パッケージ](https://pkg.go.dev/os) ファイルのOpen/Close, Re

元記事を表示

Goを始めたときの自分のためのメモ

# ポインタにするか値にするか

正直、現時点では**ポインタにするのは参照渡しにしたいとき**という乱暴な理解。ちゃんと理解すべきだけど、こうすべき!と言う確固たるものを持っている人は少ない気がする。

## 構造体

* 構造体のフィールドに、スライスやmap、ポインタなどの参照型を持つ場合はポインタ
* 変更不可な構造体として、運用する場合は値でも良い(コンストラクタを定義し必ずコンストラクタで生成するようにする、不変なオブジェクトなど)
* 迷ったらポインタ

構造体が値の場合、コピーしたときに参照型ではないフィールドの変更は、コピー元のインスタンスには影響が無いですが、参照型のフィールドの変更はコピー元のインスタンスも変更されます。このようにフィールドによって挙動が異なる状態になってしまうのはわかりにくい。
確かにポインタを意識しない言語で、arraylistやhash的なものは参照型で、メソッドでreturnする必要ないけど、意識するのがめんどいので何でもかんでもreturnするとかよくある。rubyなんかは最後の変数がreturnされるとかあるので、さらに複雑。

##

元記事を表示

GCP AutoMLで解くリンゴとトマトの画像分類

Kaggleにリンゴとトマトの画像を分類するという課題があります。
GCP Vertex AIを用いてこの課題を解いてみます。
また作成したモデルを使って、画像の自動分類器を作成します。

https://www.kaggle.com/datasets/samuelcortinhas/apples-or-tomatoes-image-classification

# データセットをダウンロードする

上記のURLからデータセット(リンゴとトマトの画像)をダウンロードできます。(要ログイン)
データセット中にはモデルの訓練用の `train` と 検証用の `test` が含まれています。

# データセットをアップロードする

画像ファイルをCloud Storageにアップロードします。
あとでVertex AIにとりこむ際に、以下2点が必要です。

1. 画像ファイルそのもの
1. 画像ファイルのパスと、ラベルの対応を示したCSVファイル

CSVファイルの書式は以下のとおりで、1列目がCloud Storage上のパス、2列目がラベルです。

https://cloud.goo

元記事を表示

gRPCに関して簡単にまとめてみた

# 初めに
業務でgRPCを使用する機会があったので学習した内容をアウトプットのため投稿します。
プロトコルバッファに関しては[こちらの記事](https://qiita.com/shint_1/items/f7e9bf03f6b4033ba008)でまとめています。
また、使用する言語はGoを選択しています。

# gRPCとは
gRPCとは、クライアントがサーバーのメソッドを呼び出して通信することができるRPC(Remote Procedure Calls)です。
HTTP/2を使用し、デフォルトではProtocol BuffersをIDL・データのエンコーディングとして用います。
クライアントはスタブというものを用いてサーバーのメソッドを呼び出します。
HTTP/2の使用や通信データのバイナリ化などを用いることで高速な通信が可能です。
下図のようなマイクロサービスで用いられることが多いです。

###### 図

![スクリーンショット 2023-01-08 18.16.35.png](https://qiita-image-store.s3.ap-northeast-1.ama

元記事を表示

Golangのgoto文に関して

### Golangのgoto文に関して興味を持った背景
[こちらの記事](https://www.includehelp.com/golang/goto-aptitude-questions-and-answers.aspx)でコーディングテストの勉強をする際に、恥ずかしながら初めてgoto文を知ったのでこちらの記事でまとめようと思います。
### 具体的にgoto文が使われている箇所
実際にgolangのgithubを覗くと、[こちらの箇所](https://github.com/golang/go/blob/master/src/math/rand/rand.go#L188)などで使われているようです。
“`rand/rand.go
func (r *Rand) Float64() float64 {
// A clearer, simpler implementation would be:
// return float64(r.Int63n(1<<53)) / (1<<53) // However, Go 1 shipped with // return floa

元記事を表示

DDDとは?GOとは?って状態からAPIをつくってみた

# はじめに
Goは未経験。クリーンアーキテクチャは引き継いだプロジェクトで経験したけどよくわかっていない。(引き継いだクリーンアーキテクチャもちょっと読んだ記事とは違う実装をしている気がする。)
MVCはRuby on Railsや.net core MVCで経験あり。
最近、GoでAPIをDDDで開発するという話を耳にすることがあったので、興味を持って試しにやってみた。その時のメモと感想です。

# DI

DDDに入る前にDIをある程度理解していないと挫折する・・・らしい。ので、DIを理解する。
DIを使うことのメリット。

* 外部のDBに依存しないので、変更に強くなる
* ユニットテストがしやすくなる
* 単にコーディングがしやすくなる

そうなんだろうなぁと思う。ただ、チーム開発ではなく一人PJや少数で人の入れ替えのないPJなんかだとあまりメリットを想像できない。
インタフェースを使う側が実装オブジェクトを意識しないで実装できるのは確かだけど、一人PJだともちろん関係ない。実装オブジェクトを意識してる。
ユニットテストがしやすくなるは、その通り。・・・なんだけど、実際のPJ

元記事を表示

デメテルの法則をGoで確認する

### デメテルの法則 is 何
* ソフトウェア設計の一つのプラクティス
* 英語では`Law of Demeter(LoD)` 。最小知識の原則とも。
* 「尋ねるな、命じろ(Don’t ask,tell)」と言い換えることができる
* 部品を使う側は、使われる側の細かい事情を知らなくても使えるようにする、ということ

https://ja.wikipedia.org/wiki/%E3%83%87%E3%83%A1%E3%83%86%E3%83%AB%E3%81%AE%E6%B3%95%E5%89%87

### デメテルの法則に反している例
* あえて使われる側(部品側)のコードは記載していません
* 使う側の気持ちになって処理を確認してみる
“`go
package main

func main() {
// …省略

// 勇者パーティーを生成する
party := NewParty(members)
if len(party.members) > 0 {
// もしパーティーメンバーが一人以上いたら、画面表示用のメンバーを取得する

元記事を表示

Goでローカルパッケージを使う

## 前提
Goでサイト上のパッケージを参照はできたがローカルパッケージ参照に苦戦したのでメモを残します
間違いなどありましたらご指摘いただけるとうれしいです

まずgithubなど外部サイトからimportする方法

例:Githubリポジトリからimport
“`terminal
go mod init github.com/username/repo
“`

## ローカルパッケージ使用の手順
1. ルートのgo.modにreplaceを書く
2. 読み込みたいフォルダ内にgo.modを作成
3. importする
4. `go mod tidy`実行

## 1. ルートのgo.modにreplaceを書く
読み込みたいフォルダへのパス・適当なパッケージ名を書く

“`go.mod
# replace 適当なパッケージ名 => 読みたいフォルダへのパス
# これで”hoge”でimportできる
replace hoge => ./fuga
“`

## 2. そのフォルダにもgo.modを作成
この場合fuga内に作成
中身は空でOK

##

元記事を表示

Google Cloud Platform, Cloud FunctionsでつくるLINE Bot(3)

[前回](https://qiita.com/hsmtkk/items/eef172ae7aa2bce83673)にオウム返しBotの最低限の機能を実装しました。
しかし、今の実装ではLINEプラットフォーム外からのアクセスも受け入れてしまう問題があります。
LINEプラットフォームからのアクセスだけ処理するように実装を改善します。

# 実装方針
[署名を検証する](https://developers.line.biz/ja/reference/messaging-api/#signature-validation)のとおり、以下の値が一致することを確認します。
不一致の場合には、処理を中断します。

1. HTTPヘッダー `x-line-signature` の値
1. ダイジェスト値

– ダイジェスト値 の計算式は以下のとおりです。
“`
Base64(HMAC-SHA256(リクエストボディ、チャネルシークレット))
“`

– LINE Developersのコンソール画面でチャネルシークレットを入手できます。
– チャネルアクセストークンと同様に、Secre

元記事を表示

Google Cloud Platform, Cloud FunctionsでつくるLINE Bot(2)

[第1回](https://qiita.com/hsmtkk/items/ffea53fdae25cb50eddc)でCloud FunctionsとLINE Botを作成し、Cloud Functionsにログの出力されることを確認しました。
第2回では受信したメッセージをそのまま返信する機能(オウム返し)を実装します。

# 完成イメージ

![line-parrot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1950110/4747a1f0-71aa-d6b1-59fa-64482a76d1e0.png)

# メッセージを受信する

受信するWebHookは以下のようなJSONになっています。
[Messaging APIリファレンス](https://developers.line.biz/ja/reference/messaging-api/#message-event)も参考にしてください。

“`json
{
“events”: [
{
“so

元記事を表示

Google Cloud Platform, Cloud FunctionsでつくるLINE Bot(1)

Google Cloud Platform(以下GCP)のCloud FunctionsでLINEのBotを作成します。
プログラミングにはGo言語を使用します。
以下、全4回の予定です。

1. (本記事)LINE BotとCloud Functionsの作成
1. [オウム返しBot](https://qiita.com/hsmtkk/items/eef172ae7aa2bce83673)
1. [セキュリティ強化](https://qiita.com/hsmtkk/items/9dc31403ebdf1f11a0b1)
1. セッション管理(BMI計算Bot)

第1回の目標は以下の通りです。
– Cloud Functionsを作成する。
– LINE Botを作成する。
– Cloud Functions側でアクセスログの出ていることを確認する。

# Cloud Functionsを作成する

HTTPリクエストをログに出力するだけの簡単なCloud Functionsを作成します。
[Cloud Functionsのチュートリアル](https://cloud.googl

元記事を表示

【Go言語】コマンドについて

こんにちは。
新卒入社3年目文系出身のエンジニアです。
今回は、goのコマンドについてお話していきたいと思います。

#### 環境変数の確認
このコマンドを入力すると、goファイルの環境変数を一覧で表示してくれます。
“`
go env
“`
また、環境変数を何かしらの値で変更したいときは、以下のコマンドを使用します。
“`
go env -w 変更したい環境変数名=値
“`

#### ソースコードの整形
インデントの乱れがあるファイルに、「go fmt」を入力すると、
綺麗にコードが整形でき、大変便利です。
“`
go fmt 実行したいファイル名
“`

#### テスト実行
「go test」を入力すると、テスト結果が返ってきます。
「go test -v」を入力すると、テストの結果がさらに詳しく表示されます。
“`
go test
“`
“`
go test -v
“`

#### モジュール関連
開発の最初に以下のようなコマンドを入力します。
“`
go mod init モジュール名
“`
以下のように、go.modというファイル名が出来上がり

元記事を表示

【Go】http.Handlerとか色々整理

## はじめに

Goを学習していると、HandleだとかHandlerだとか色々出てきて混乱するのでその整理。

## 早見表

| 名称 | 分類 | 概略 |
|:-|:-:|:-|
|http.ListenAndServe|関数|プログラムをWebサーバーとして起動|
|http.Handler|インターフェース(型)|ServeHTTPメソッドを持つ|
|http.Handle|関数|Handler型の関数をパターンに応じて実行する|
|http.HandleFunc|関数|func(ResponseWriter, *Request)型の関数をパターンに応じて実行する|
|http.HandlerFunc|型|ServeHTTPメソッドを持つ|
|(f HandlerFunc) ServeHTTP|関数|fを実行する|

## ハンドラーって何?

ドキュメント等を読んでいると頻繁にハンドラーという言葉が出てくるが、これはHTTPリクエストに応じてHTTPレスポンスを返す関数。
GoではServeHTTP(ResponseWriter, *Request)という関数のことであ

元記事を表示

[]byte(“a”, “b”, “c”) でエラーがでる理由わかる?正しい書き方は?

## やりたいこと

文字をバイト型のスライスに入れたいのですが、`[]byte(“a”, “b”, “c”)` はエラーがでます。

“`
too many arguments in conversion to []byte
“`

ふむふむ。引数が多いのか。。
エラーにある通り引数を一つにすればエラー回避できるのですが、どういう仕組みなのかを見ていきましょう。

## `[]byte(変数)` ← 丸いかっこ と `[]byte{変数}` ← 波状のかっこ の違い

### 丸いかっこを使う「型(変数)」は、型変換をする

丸いかっこを使う「型(値)」は、型変換を行う表現です。
(記事にしているのでよかったら見てください。? )

https://qiita.com/yNavS4Ki/items/58dd2771ffa5effa4a40

なので、`[]byte(変数)` は、() 内の変数を、バイト型のスライスに変換する表現になります。

なので、複数の値を渡すのではなく `[]byte(“abc”)` とすれば、エラーはなくなります。
→ string 型 “abc” を

元記事を表示

[Go] 型変換 & 型アサーション の使い方がすぐに思い出せない場合は、こちらから公式サンプルページへ

## 型変換 (Type Conversion)

変数v, 型T があった場合、T(v) は 変数v を T型へ変換します。

“`go
i := 42 // int

// 型(変数) で型変換
f := float64(i) // float
u := uint(f) // uint
“`

A Tour of Go のページ

https://go-tour-jp.appspot.com/basics/13

The Go Programming Language Specification のページ

https://go.dev/ref/spec#Conversions

## 型アサーション (Type Assertion)

インターフェース型i を 型T に変換

“`go
// t, ok := i.(T)

var i interface{} = “hello”

s, ok := i.(string) // s は string 型 で “hello” を保持
fmt.Println(s, ok)
“`

A Tour o

元記事を表示

モンテカルロ法で円周率を求める場合の考え方メモ

勉強会で[問題解決のための「アルゴリズム×数学」が基礎からしっかり身につく本](https://gihyo.jp/book/2022/978-4-297-12521-9)を読んでいる。
モンテカルロ法の節が一回では理解できなかったのでメモ。

## モンテカルロ法とは

– 数値計算の手法の一つ。
– ランダムな数を使う。
– [ジョン・フォン・ノイマン](https://ja.wikipedia.org/wiki/%E3%82%B8%E3%83%A7%E3%83%B3%E3%83%BB%E3%83%95%E3%82%A9%E3%83%B3%E3%83%BB%E3%83%8E%E3%82%A4%E3%83%9E%E3%83%B3 “ジョン・フォン・ノイマン”) が名付けた。
– モナコ公国の都市モンテカルロから取った。
– カジノで有名な都市とのこと。

https://ja.wikipedia.org/wiki/%E3%83%A2%E3%83%B3%E3%83%86%E3%82%AB%E3%83%AB%E3%83%AD%E6%B3%95

## 考え方
– 辺の長さが1の正方

元記事を表示

Goに入門してみた(自分用学習メモ)

会社でなんかGOやるかもしれない…という話を聞き
個人的にも気になってはいたので(シングルバイナリのプログラムをクロスコンパイル出来るという部分)
入門してみることに

# まず、GOとはからググることに(Wikipediaを読んでみよう
https://ja.wikipedia.org/wiki/Go_(%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E8%A8%80%E8%AA%9E)
> Goはプログラミング言語の1つである。Googleにおいて2009年~~設計された
> マスコット・キャラクターはGopher(ホリネズミ)

あのキャラクター、「Gopher」というらしい

>言語の正式名称はGo

GOでもgolangでもなく「Go」だそう

# ふーんって感じなので、まずは基本を学んで見る
https://go-tour-jp.appspot.com/welcome/1

## packages
goのプログラムはパッケージで構成される
プログラムのエントリポイントはmainパッケージ(mai

元記事を表示

2023年だし日本語勉強する

# あけましておめでとうございます(*1)

2023年が明けました!素数の年ですね!(大嘘)

最近勉強をさぼりがちなので、本からインプットを受ける題材でプログラムを組んでみる。
去年影響を受けたのが

+ ゆる言語学ラジオ
+ ずんだもんのRTA

なので、「日本語xずんだもん」に関する物とする。今回は会話の相手をずんだもん化させる。

zundamon
著作権が怖いので、ぼかしてます

会話の中に組み込むシステムなので会話の真ん中にシステムが来るイメージ。

“`mermaid
sequenceDi

元記事を表示

gRPCに入門してみた

## 参考ドキュメント
– https://developers.google.com/protocol-buffers/docs/overview
– https://grpc.io/docs/languages/go/quickstart/

## 必要なツール
– golang
– 1.19.2
– cli
– protobuf
– goenv
– go module
– [google.golang.org/grpc](https://github.com/grpc/grpc-go)
– goのgRPCの実装
– [google.golang.org/grpc/cmd/protoc-gen-go-grpc](https://github.com/grpc/grpc-go/tree/master/cmd/protoc-gen-go-grpc)
– goのgrpcコードの生成ツール

## 環境準備

“`sh
$mkdir $WORKSPACE
$cd $WORKSPACE
$brew install protobuf
$goenv loca

元記事を表示

OTHERカテゴリの最新記事