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

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

Go標準パッケージtestingを利用したテスト方法

## 概要
Goには標準でtestingというパッケージが用意されている。今回はこれを使用する。
## テストコードの作成方法

テストコードを書くファイルは`_test.go`という形式で命名する。
Goのテストはテスト対象のソースコードと同じパッケージに含める必要がある。
以下のような関数を作成することでテストコードを作成していく。

“`go
func Test対象関数名(*testing.T) {
hogehogehogehoge
}
“`

## 実際のテストコード

`decode()`という関数をテストしている。

“`go
func TestDecode(t *testing.T) {
post, err := decode(“post.json”)

if err != nil {
t.Error(err)
}
if post.Id != 1 {
t.Error(“Wrong id, was expecting 1

元記事を表示

mockery でモックを作成する方法

# はじめに
対応するときに調査に時間がかかったので備忘録として。

# バージョンなど

* Golang >= 1.19 ( 多分、 <= 1.18 でも大丈夫 ) * mockery == v2.15.0 # 方法 ## セットアップ [mockery](https://github.com/vektra/mockery) を参照 ## 自分のコードのモックを作成する ### 前提条件 以下のようなファイル構成。 ```bash . └── internal └── app    ├── container    │   └── container.go    ├── http    │   ├── handler    │   │   ├── health_handler.go    │   │   ├── health_handler_test.go    │   │   ├── send_mail_hander.go    │   │   └── send_mail_ser

元記事を表示

GoでServeHTTPにパラメーターをのっける

session管理にGCPのdatastoreを使っており、ローカルから取得するのに**300ms**ほどかかる。
本番ではもっと早くなるはずだが、middlewareで取得し、認証後またコントローラーで取得してデータを使用していた。
おそらく当初あまり気にならなかったのと、middleware自体の実装に時間がかかり、取得したデータをそのままコントローラーに流す方法がわからなかったのが理由で再取得していたようだ。今回は無駄なものを極力排除したいためその方法を調べてみた。
結果stackoverflowで発見。

https://stackoverflow.com/questions/71046302/how-to-add-parameters-to-servehttp

“`go:middleware.go
func Auth(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
cookie, err := r.Cook

元記事を表示

GoでTDD本の多国通貨やってみた

# この記事の内容

Go言語の学習のため、『テスト駆動開発』[^1]の第Ⅰ部 多国通貨をやってみました。
言語の違いから書籍のとおりにいかないことはあると思いますが、そういった部分も含めて「Goでどのようにできるのか」を学んでいくという趣旨です。
[^1]:https://shop.ohmsha.co.jp/shopdetail/000000004967/

:::note warn
Go、Javaともにビギナーです。
:::

# `testing`パッケージには`assertXXX`が無い

最初のテストで`assertEquals`の代替を探すことになったのですが、`testing`パッケージにはそのようなものはありませんでした。

https://qiita.com/Jxck_/items/8717a5982547cfa54ebc

FAQにも目を通しましたが、「エラーメッセージをきちんと書こう」とか「必要なものはすでにある」というのが理由だそうです。
なるほどと思いつつも「一つのアサーションで3行になるのは長いな」と思うこともありました。そのあたりはテストを工夫したりヘルパ

元記事を表示

Golang 新規プロジェクトのセットアップ

# やりたいこと
滅多にやらないプロジェクトのセットアップ方法の備忘録
とりあえずHello world!を表示するサンプルプロジェクトを立ち上げる
## 環境
– macOS Monterey 12.2.1
– VSCode
– go 1.18
“`sh
$ go version
go version go1.18 darwin/arm64
“`
# プロジェクト作成
## 作業ディレクトの作成
作業用ディレクトリ作成して、移動
“`sh
mkdir sample-project
cd sample-project
“`
## パッケージ管理の初期化
Golangでは基本的に[Go Modules](https://github.com/golang/go/wiki/Modules#quick-start-example)を使用してパッケージを管理する。(Node.jsのnpmやPythonのpipのようなものです。)以前はGOPATHでパッケージ管理していたみたいですが、今はGo Modulesで管理。

モジュールの初期化。
下記コマンドを実行したディレク

元記事を表示

[golang] GormでDISTINCTを使う

# はじめに
GormでMySQLを操作していたところ、DISTINCTを使いたくなった。
[GORMのサイト](https://gorm.io/ja_JP/docs/query.html)をみてやってみたけど上手くいかなかったので、
色々自分で試す。上手くいく方法が見つかったので、そのメモ。

# 結論
Select()の取得対象指定の際に、頭に”DISTINCT “を付与する

# ソースコード
確認時のソースコード

“` go
package main

import (
“fmt”
“github.com/jinzhu/gorm”
_ “github.com/jinzhu/gorm/dialects/mysql”
)

const (
TBL_TEST string = “Test”
)

// 元のテーブル
type Test struct {
Id uint32 `gorm:”column:ID” json:ID`
Name string `gorm:”column:name” json:name`
Age

元記事を表示

1億レコードのテーブルを扱ってみた

仕事で扱うレコード数は多くて1000万くらいだが、過去に1億レコードを扱ったという記事があり、どんなものなのか気になったため、過去に作成したポートフォリオにデータを追加してみた(ToDoアプリ)。なお調べるうちに某企業は130億レコードを扱ったみたいな記事もあり、1億レコードは決してかなり多いレコード数ではないと知った。

# 環境
* Go 1.18
* gorm
* mysql 8.0
# 1億レコード追加
tasksテーブルにレコードを追加すると、早速問題が起きた。
Gormなので“Debug()“を使ってどのようなクエリが発行されているのか確認してみた。

“`sql
[0.000ms] [rows:11] SELECT * FROM `users` WHERE `users`.`id` IN (…)

[1.000ms] [rows:3] SELECT * FROM `fields` WHERE `fields`.`id` IN (…)

[0.534ms] [rows:5] SELECT * FROM `milestones` WHERE `mileston

元記事を表示

動的型付け・静的型付けの簡易的整理と Go 言語の魅力について

# 本記事の目的

* 動的型付け・静的型付けの概念がよくわかってなかったので簡潔に整理した。
* ついでに Go 言語が(個人的に見た感じ)人気な理由についても確認したので、そのメモ。

# 結論

* 動的型付け言語 : 変数などのデータ型の宣言がいらないプログラミング言語
* 静的型付け言語 : 変数などのデータ型の宣言が必要なプログラミング言語

| 種別 | 特徴 | 具体的言語 |
|—|—|—|
| 動的型付け | ・記述量が少なく、簡単に書ける
・解釈の余地がある書き方となるため、複数人での開発だと各コードの意味することが分からず、保守性で物足りないところあるかも | Python, Ruby, PHP… |
| 静的型付け | ・プログラム実行前にバグやエラー箇所を特定できる
・メモリを最適化しパフォーマンス向上させる | Java, C#, Go… |

結論としては・・・
* 生産性をとるなら「動的型付け言語」
* すばやく学んですばやく実装する、とかであればこちらが向いてそう
* 実行速度や保守性をとるなら「静的型

元記事を表示

net/http で学ぶ interface

# 自己紹介
普段はインターン先では Python を使って ML を用いた ソフトウェアの開発をしていますが、エンジニアとして成長するために静的型付け言語を学ぼうと思いました。その第一歩に選ばれた Go を学んでいくにあたり、interface 周りでつまづき、色々調べる中で自分なりに腑に落ちたので共有させていただきます。

– [TL; DR](#tl-dr)
– [⭐️ interface とは](#️-interface-とは)
– [⭐️ http における紛らわしいやつらの違い](#️-http-における紛らわしいやつらの違い)
– [Handler](#handler)
– [HandlerFunc](#handlerfunc)
– [Handle](#handle)
– [HandlerFunc](#handlerfunc-1)
– [⭐️ 実際の関数の流れ](#️-実際の関数の流れ)
– [⭐️ 実装できるのは構造体だけじゃない](#️-実装できるのは構造体だけじゃない)
– [最後に](#最後に)
– [参考](#参考)

元記事を表示

【Go言語】爆速で変数の命名規則を調整するCLIを作る with cobra!!

# 背景
最近Golangの勉強をしています。業務で若干触るもまだまだ表面的な理解しかできていない気がしており、色々手を動かしてもっと慣れたいと思ったのでCLI Applicationから作ってみようと思いました。

Golang roadmapのここです!
Image from Gyazo

今回開発したレポジトリはこちらです。
https://github.com/ishidao0910/valint

# 準備
開発を進めるための準備をします。

1. goのイニシャライズ
1. cobra cliのインストール

ご自身でレポジトリを用意していただくのがいい気がします。
この先何度か出てきて面倒なので、
– ishidao0910: ご自身のgithubユーザー名
– val

元記事を表示

GOで最初につまづいたこと

# GOのパス設定がよくわからない
GOの勉強を始めようとしたが、つまづいたところがあったのでメモがてらに投稿。
## 問題:GOPATHやGOROOTとか何が何かわからない

### $GOPATH
goのワークスペースのルートディレクトリ
GOPATHの中の構造は以下のようになっている
`src/` : Go ソースコードの場所(例: .go、.c、.g、.s)。
`pkg/` : コンパイルされたパッケージコードの場所(例: .a)。
`bin/` : Go によってビルドされたコンパイル済み実行可能プログラムの場所。

### $GOROOT
異なるGoバージョンを変更する必要がないなら気にしなくていい。

### $PATH
インストールしたパッケージのコマンドなどが記述されたバイナリファイルが格納される場所です。コマンドなどはここから参照してくる。

## 結論
私はgoの開発をする際以下のようなディレクトリ構造で開発することにした。
(合っているかはわからないが…)

### 階層構造
“`
home
├──そのほか
go ← ここがGOPATH
├── src

元記事を表示

Go標準パッケージを利用したリクエスト・レスポンスの処理

# net/http

この記事ではGoの標準パッケージであるnet/httpを利用したリクエスト、レスポンスの処理の方法について解説する。
[「**Goプログラミング実践入門 標準ライブラリでゼロからWebアプリを作る」**](https://amzn.to/3UI1wa3)という書籍を参考にしており、この書籍のまとめでもある。

# リクエストの受信

## ListenAndServe

GoにおいてHTTPサーバーを起動させるためのメソッド。
第一引数:ネットワークアドレス。「””」を指定した場合、80番ポートになる。
第二引数:リクエストを処理するハンドラ。nilを指定した場合、DefaultServeMuxが使われる。

“`go
server.ListenAndServe(ネットワークアドレス, ハンドラ)
“`

server構造体を使ってサーバーの設定ができる。ネットワークアドレスやハンドラもこの中で指定できるので、これを使った場合引数はいらない。

“`go
type Server struct {
Addr string
Handler Handler

元記事を表示

GoでWebサーバーを作成する2

# はじめに
GolangでAPIサーバーを作るときに調べたことを自分用のメモとしてまとめます。

## 文法関連
* 命名規則
他パッケージからアクセスできるものは先頭大文字にする

[他言語プログラマが最低限、気にすべきGoのネーミングルール](https://zenn.dev/keitakn/articles/go-naming-rules)
[Golangでの命名規則におけるベストプラクティス](https://zenn.dev/kenghaya/articles/1b88417b1fa44d)

* if文

* for文
[Go言語(golang)のループ for, for..range, foreach, while](https://golang.hateblo.jp/entry/2019/10/07/171630#foreach-for–range)

* append関数
スライスに要素を追加する。
配列の長さを指定しないものがスライス。
C#でいうListみたいなもの。
“`cafes = append(cafes, cafe)“`

[【Go】基本文法④

元記事を表示

NeomuttでGmailにOAuth2.0する(2022版)

# NeomuttでGmailにOAuth2.0する(2022版)

## TL;DR

2020年に書いた内容が
古くなったから
更新した

## まえがき

以前、NeomuttでGmailを利用するための手順を書き、Python2の環境では問題なく動きましたが、Pythonの利用環境整えるのが面倒なので、Golangで書き直しました。

## NeomuttでのOAuth2.0利用手順

### Google Cloud PlatformでOAuthクライアントIDを作成する

##### 1. 以下のURLを開き、Google Cloud PlatformのAPIサービス設定を開きます。

https://console.developers.google.com/apis/credentials

##### 2. [新しいプロジェクト]を作成から、mutt用のプロジェクトを作成します。

Google Cloud Platformのロゴの右側あたりの「▷hogehoge▽」の部分を押すと作れました。

![oauth0.png](https://qiit

元記事を表示

【Golang】1 バイトデータの左シフト(ビットローテーション、循環シフト)

> Go 言語(以下 Golang)で、1 バイトのデータを[左シフト](https://ja.wikipedia.org/wiki/%E3%83%93%E3%83%83%E3%83%88%E6%BC%94%E7%AE%97#%E7%AE%97%E8%A1%93%E3%82%B7%E3%83%95%E3%83%88)させたのち、右側末尾に[ビット・ローテーション](https://ja.wikipedia.org/wiki/%E3%83%93%E3%83%83%E3%83%88%E6%BC%94%E7%AE%97#(%E3%82%AD%E3%83%A3%E3%83%AA%E3%83%BC%E3%81%AA%E3%81%97)%E3%83%AD%E3%83%BC%E3%83%86%E3%83%BC%E3%83%88)させたい。いわゆる、ひとつの[循環シフト](https://ja.wikipedia.org/wiki/%E3%83%93%E3%83%83%E3%83%88%E6%BC%94%E7%AE%97#%E8%AB%96%E7%90%86%E3%82%B7%E3%83%95%E3%

元記事を表示

【golang】net/httpのタイムアウト設定

# 概要
先日golangci-lintのバージョンアップを行ったところ、lintの際に下記のような警告が発生しました。
“`bash
cmd/main.go:134:11: G114: Use of net/http serve function that has no support for setting timeouts (gosec)
if err = http.ListenAndServe(“:8080”, mux); err != nil {
“`
調べてみてなるほどと思ったので備忘録として残します。

# 前提
– go version go1.19.3 linux/amd64
– golangci-lint version 1.50.1

# net/httpのタイムアウト

golangの標準ライブラリのnet/httpでは、デフォルトではタイムアウト設定が存在しません。
つまりデフォルトではタイムアウトが発生せず、リクエストの処理終わりを常に待機し続けることになります。

下記はnet/httpライブラリのServer構造体ですが、`Read

元記事を表示

GO言語で並列実行するサンプルコード。ワーカーのキャンセル機能付き

個人的な備忘録として。

“`golang
package main

import (
“context”
“fmt”
“time”

“github.com/pkg/errors”
)

type Result struct {
Task Task
Err error
}

type Task struct {
Bar int
}

func worker(workerID int, ctx context.Context, taskChannel <-chan Task, resultChannel chan<- Result) { // taskCannelがなくなるまで動作する for task := range taskChannel { select { case <-ctx.Done(): // 親からcancel()が実行された場合、動きを止める fmt.Printf("[%d] got Cancel\n", workerID) return default: fmt.Printf("[%d] do task

元記事を表示

Go言語 go versionが出力されない

お疲れ様です。
go言語を始めようとしたところ出落ちしたので、情報共有します。
“`:開発環境
Apple m1 macbook
macOS 13.0.1(22A400)
“`

# 対処法
1\.どこのファイルにPathを追記するか確認
下記コマンドをターミナルで実行
“`
echo $SHELL
“`
・bashなら、~/.bash_profile
・zshなら~/.zprofile
に追記していくことになります。

2\.該当の設定ファイルにパスを追記
“`
$ open ~/.zshrc
または
$ open ~/.bash_profile
“`
openで設定ファイルが開かれるので、pathを追記してください。
自分はzshrcだったので以下のように追記しました。
※ドキュメントにも該当のPATHを追記しろと明記してあります。https://go.dev/doc/install
“`:zshrcの場合
$ export GO_HOME=/usr/local/go
$ export PATH=$PATH:$GO_HOME/bin
“`
ファイルを追記し

元記事を表示

Google Open Source(Go)ではDeprecated(非推奨)なコードがわかりやすく表示される

netパッケージのソースコードを読んでいると、ファイル内で使われている[syscallパッケージの記述に打ち消し線が引かれていた](https://cs.opensource.google/go/go/+/refs/tags/go1.19.3:src/net/dial.go;l=609;bpv=0;bpt=1)。

![スクリーンショット 2022-11-19 15.26.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261575/0ab12f7b-1ac2-b249-e11f-56e0bc4d080f.png)

他にも、この画像でいうと`Cancel`にも打ち消し線が引かれている。
まあ、なんとなくどういうときに打ち消し線が引かれるのか予想はできるが、軽く調べてみた。

どういうときに打ち消し線が引かれるかというと、そのパッケージやメソッド、型や変数が**deprecated**(非推奨)のとき。

Goでは、`Deprecated:`という修飾を含んだコメントを記述することで、対象

元記事を表示

Tree Maker_Convert Markdown to tree!_WebAssembly&ServiceWorker

https://ddddddo.github.io/gtree/

![web_example.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271313/83d52823-8f74-d5f8-14c3-4110f54110d6.gif)

# これは何か?
Markdown形式の入力を与えると、treeコマンド結果のような表示がされるWeb appです。
以下の4種類の記号が使えます。
`*`, `-`, `+`, `#`

また、出力されるツリーの各階層は、入力となるMarkdownでは半角スペース2つずつインデントすることで表現します。

# このサイトの特徴は?
– Markdownからtreeを生成する処理はGoで書いており、その処理部分はTinyGoでWebAssembly(.wasm)としてコンパイルしています。
– コンパイルされたバイナリはJavaScriptから呼ばれます。
– ServiceWorkerを利用していて、このWeb appを構成する静的コンテンツ(.wasm含む)は

元記事を表示

OTHERカテゴリの最新記事