- 1. 整数型に ‘c’ が代入できるそれぞれの事情
- 2. Go [O1o1o0] 目指せ!第14回UEC杯コンピューター囲碁大会<本編>
- 3. バックグラウンドでの定期実行処理をゴルーチンで回す際の注意点
- 4. Go言語のチャネルで空のデータを送受信したいときは構造体を使うと良い
- 5. RailsコードをGoで書き直して、FFIを使ったらメモリリークした話
- 6. [Go]テストコード
- 7. Four keys を計測する CLI ツールを作った
- 8. はじめてのGo Modules
- 9. wfs – Go で書き込み可能な io/fs
- 10. Goの構造体をJSON形式で出力するいくつかの方法
- 11. GoでGormを利用してmigrateしたがDBの制約が反映されない
- 12. GoのテストでJSONのレスポンスから値を取得して比較したい
- 13. GORMを使用してMySQLに接続し、データベースの作成・削除とCRUD機能を実装する
- 14. 【Go】Go言語の入門ーコメント、変数
- 15. GCPのWorkbenchにgoを入れる
- 16. Golangで関数にメソッドを生やす
- 17. 【Go】Go言語入門①ーGo言語の第一歩
- 18. GOLangでフィボナッチ数を計算した
- 19. go installしたバイナリをscratchイメージで動かす場合の注意点
- 20. Go(gin)のAPIテストでテストが止まってしまい終了しない
整数型に ‘c’ が代入できるそれぞれの事情
# これは何?
https://qiita.com/Cowsisland/items/71248bdd081089b7ba09
という記事で
“`c:c
int a;
a = ‘c’;
“`が問題なく動いている話や [素晴らしいコメント](https://qiita.com/Cowsisland/items/71248bdd081089b7ba09#comment-732ca0b2d7c2a7be908d) があって面白かったので、記事にしてみた。
# それぞれの事情
## C言語
C 言語の場合、そもそも `’c’` の型が `int` である。
なので“`c:c
int a;
a = ‘c’;
“`は、わりと面白くない。
## C++ / C# / D / Java
C++ の場合、 `’c’` は `char` となっている。なので
“`c++:c++
int a;
a = ‘c’;
“`とした場合、`char` から `int` への暗黙の変換が発生する。この変換はほぼ必ず(`sizeof(int)==sizeof(char)`
Go [O1o1o0] 目指せ!第14回UEC杯コンピューター囲碁大会<本編>
# Step [O1o1o0g1o0] はじめに
? Step の変な数字の説明
? [電脳向量表記](https://qiita.com/muzudho1/items/fdbf31e41dd8c247081f)
? 練習編を読み終わってるものとする
? [Go [O1o1o0] 目指せ!第14回UEC杯コンピューター囲碁大会<練習編>](https://qiita.com/muzudho1/items/cea62be01f7418bbf150)
? また、技術的でない内容を含むブログを別の場所に 開設する
? [目指せ!第14回UEC杯コンピューター囲碁大会☆(^q^)<その2>](http://grayscale2.dou-jin.com/go/%E7%9B%AE%E6%8C%87%E3%81%9B%EF%BC%81%E7%AC%AC%EF%BC%91%EF%BC%94%E5%9B%9E%EF%BC%B5%EF%BC%A5%EF%BC%A3%E6%9D%AF%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E
バックグラウンドでの定期実行処理をゴルーチンで回す際の注意点
強化月間なので、今回もGoの記事を上げていきます。
https://qiita.com/official-events/ae80b010f51f7018891a
# はじめに
アプリケーションで長時間の処理を実行する際、以下のような処理を挟むことがあると思います。
– メイン処理途中に同時並行で定期的に流す処理(例:処理中ログの表示)
– メイン処理完了時に流す処理(例:完了ログの表示)定期実行処理はメインの処理の裏で同時に流したいので別のゴルーチン内に実装しますが、気を付けないと**完了時処理より後に定期実行処理が流れてしまいます**。ハマるとたまにしか再現せず厄介なので、備忘録としてまとめました。
# 定期実行処理でハマったこと
以下の3つの処理を流すことを考えます。
– メインとなる処理(長時間かかる)
– メイン処理中に流す定期実行処理(処理中ログの表示)
– メイン処理完了時処理(完了ログの表示)定期実行処理はメイン処理をブロックしてほしくないのでゴルーチンに追い出します。
“`go
func longProcess() {
// 実際には何か長い
Go言語のチャネルで空のデータを送受信したいときは構造体を使うと良い
## 概要
Go言語において空の構造体は**メモリサイズが0**であるという特徴があります。
この特徴を利用したい瞬間がいくつかあるため紹介しようと思います。## 並行処理
Go言語で並行処理を行う際、とくにデータを送る必要はないが信号を送りたいというタイミングがあります。
そういった場合には空の構造体が良く使われます。“`go
package mainimport “fmt”
func send(ch chan<- struct{}) { ch <- struct{}{} ch <- struct{}{} close(ch) } func main() { ch := make(chan struct{}) go send(ch) for c := range ch { fmt.Println("receive : ", c) } } ``` 当然、空の構造体を送受信しているだけなので出力は下記のようなものです。 ```text {} {} ``` 空の構造体はメモリサイズが0であるためパフォーマンス的にも優れています。 ## ma
RailsコードをGoで書き直して、FFIを使ったらメモリリークした話
先日、[速度改善のためRailsコードをGoで書き直して、FFIを使ってみた](https://qiita.com/t_mapico/items/9eadf5bee5561c3fb589) という記事を書いたのですが、
このコードがメモリリークを起こしてしまいました。。golang初心者のため、C.Cstringがgoのメモリ解放の管理から外れているいうことを把握していませんでした。。
“`
return C.CString(string(resultJSON))
“`
となっているとこを deferで解放するようにしました。“`
ret := C.CString(string(resultJSON))
defer C.free(unsafe.Pointer(ret))return ret
“`メモリリークしないか1時間くらい動かしてチェック
“`
end_time = (Time.now + 60 * 60).to_i
while (Time.now.to_i < end_time) # ObjectSpaceはデフォルトが
[Go]テストコード
# 1. テストコードの実装に必要なこと
– テストコードを書くファイルについて
– ファイル名: “xxx_test.go“とする
– ファイルの配置: テスト対象関数のパッケージのディレクトリ
– テストコードファイルの記述
– “package“ディレクティブでテスト対象関数のパッケージを指定
– 標準出力のテストの場合
– 対象関数に対するテストは、引数なしの“ExampleXxx“という名前の関数で記述する
– 標準出力以外のテストの場合
– “import“ディレクティブでテスト“testing“パッケージを指定
– 対象関数に対するテストは、引数が“t *testing.T“である“TestXxx“という名前の関数で記述する# 2. テストコードの実装
## 2.1. 前提
以下のような構成・内容のモジュールが存在するとして、各関数に対してテストコードを実装する場合を例にする。**ディレクトリ・ファイル構成**
“`
go_test_code
Four keys を計測する CLI ツールを作った
# はじめに
Four keys とはソフトウェア開発の生産性を測定するのに利用される以下の4つの指標のことである([参考](https://www.devops-research.com/quickcheck.html))。
– デプロイ頻度(Deployment Frequency) ソフトウェアのデプロイ頻度
– 変更リードタイム(Lead time for changes) ある変更をソフトウェアに適用してから、その変更がリリースされるまでの時間
– 障害修正時間(Time to restore) ソフトウェアに障害が発生してから、その障害が修正されるまでにかかった時間
– 障害率(Change failure rate)ソフトウェアのデプロイのうち障害が発生したデプロイの割合これらの指標を簡易に測定するための CLI ツールを作成した。
https://github.com/hmiyado/four-keys
この記事では、この CLI ツールについて紹介する。
# 使い方
## インストール
[Releases](https://github.com/hm
はじめてのGo Modules
初めてGoの開発案件にアサインされたのですが、前担当から引き継いだGoのバージョンが1.10なのに対して今回の開発では1.18だったので色々戸惑いました。
その際Go Modulesって何?となって調べたので備忘録。# Go Modules
– Go1.11以降で利用できる依存パッケージ管理ツール。
– go mod init [モジュールパス] と go mod tidyでgo.modとgo.sumを作成してソースコード内でimportに記載してる外部パッケージのダウンロードと依存関係の処理を行ってくれる。
– Go1.10まではGOPATH モード (GOPATH mode)でコード管理を行なっており、コード管理とビルドをGOPATHで指定されたディレクトリ下で行っていた。Go1.11以降はモジュール対応モード (module-aware mode)を使用することで任意のディレクトリでコード管理とビルドが行えるようになった。## 前提
– Go 1.18
– 環境変数GO111MODULEは on 又は未指定
– MacOS Monterey 12.5.1#
wfs – Go で書き込み可能な io/fs
## wfs とは
[jarxorg/wfs](https://github.com/jarxorg/wfs) で開発している Go標準 の io/fs を拡張したライブラリです。 現在は以下のファイルシステムをサポートしています。
– osfs
– memfs
– s3fs
– gcsfs## 開発の動機
Go で S3 や GCS を使うほとんどのプロジェクトで、クラウドストレージにアクセスするためのインタフェースを新しく定義し、開発用にローカルファイルシステムの実装、テスト用にメモリ上での実装をして切り替えれるようなコードを書いてきました。
Go1.16 から登場した io/fs は今のところ読み取り専用で、書き込みについては [proposal: io/fs: add writable interfaces](https://github.com/golang/go/issues/45757) などで議論されていますが簡単には進まなそうです。
その Issue でも紹介されている afero や billy は非常に優秀ですが S3 に対応していなかったりして微妙
Goの構造体をJSON形式で出力するいくつかの方法
## はじめに
Goの構造体をJSON出力する方法をまとめてみました。
### 検証方法
以下のようなPerson構造体をJSON出力していきます。
“`go
type Person struct {
Name string
Age int
gender string
}
“`また、JSON出力した結果を見やすくするために、`Mrashal`ではなく`MrashalIndent`を使ってフォーマットしたものを出力するようにしています。
“`go:main.go
package mainimport (
“fmt”
“encoding/json”
)func main() {
p := Person{
Name: “Mike”,
Age: 20,
gender: “male”,
}m, _ := json.MarshalIndent(p,””,” “)
fmt.Println(string(m))
}
“`## 方法1: そのままMarshalする
まずは、特に何もせずにそのまま出力すると以下のような
GoでGormを利用してmigrateしたがDBの制約が反映されない
# はじめに
Goのテストを書いていた時にメールアドレスが一致したらエラーを返すテストを書いていました
なのになぜか200の成功ステータスが返ってくるので調べたところレコードが作成されていました
Gormで設定したユニークが効いていないようです# 問題
以下のようなコードでテーブル定義を書いていました
“`go:user.go
Email string `gorm:”size:256 , not null , unique” json:”email”`
“`しかしこれでは`non nul`や`unique`の制限がついていませんでした
MySQLで`desc users;`を確認してもやはり制約はついていません
# 解決方法
以下のように変更することで解決しました
“`go:user.go
Email string `gorm:”size:256;not null;unique” json:”email”`
“`なんとなくで書いていたようです
テストを書くまで気づきませんでした# おわりに
公式ドキュメントをしっかりみるようにすれば解
GoのテストでJSONのレスポンスから値を取得して比較したい
# はじめに
Goのテストを書くときに、レスポンスのBodyの内容を比較する際に以下のようなコードを書いていました
“`
assert.Equal(t, w.Body.String(), “{\”msg\”:\”pong\”}”)
“`しかし、この中の要素を取得してテストを書く機会が訪れたのでまとめます
# 問題
` bcrypt`を利用して、レスポンスのBodyにはいっている暗号化されたパスワードを取得して、それを複合して比較して同じことを確かめるテストを書こうとしました
そこでレスポンスから暗号化したパスワードのみを取得する必要がありました
# 解決方法
以下のようにすることでレスポンスからパスワードのみを取得することができました
“`go:controller_test.go
req, _ := http.NewRequest(“POST”, “/sign_up”, body)
req.Header.Set(“Content-Type”, “application/x-www-form-urlencoded”)
w := httptest.
GORMを使用してMySQLに接続し、データベースの作成・削除とCRUD機能を実装する
# 概要
[GORM](https://gorm.io/ja_JP/)を初めて使用したので、基本的な使用方法をアウトプットのため投稿する。■ Go version
go1.15.7
■ MySQL version
5.7.37## GORMを導入する
以下のコードで必要なパッケージをインストールすることができる。
“`
go mod init [任意の値]
go get -u gorm.io/gorm
go get -u github.com/go-sql-driver/mysql
“`# テーブルの作成
以下のコードでテーブルの作成・削除が可能であった。### GOのコード
“`migrate.go
package mainimport (
“gorm.io/driver/mysql”
“gorm.io/gorm”
)type Data1 struct {
gorm.Model
Title string
Content string
}func main() {
dsn := “[ユーザー名]:[パスワード]@tcp(
【Go】Go言語の入門ーコメント、変数
# はじめ
Go言語を勉強しはじめました。
ポイントをメモします。# コメント
インラインコメント
“`go
// コメント
“`
複数行コメント
“`go
/*
コメント
コメント
コメント
*/
“`# 自動整形
goファイルを自動整形してくれる
“`go
$ gofmt [file-name]“`
# 実行する時の入り口
実行する時、最初に呼び出す関数はmain関数である。“`go
package mainfunc main(){
//main関数内に処理内容を記入する
}“`
# 変数
## 変数宣言と代入
“`go
var 変数名 データ型 // 変数宣言
変数名 = 値 // 変数に値を代入//例
var num int
num = 10
“`注意点
– 変数を宣言した時点に、デフォルト値を代入される。 intとfloatの場合、デフォルト値は0である。
– データ型が自動推測されることができる。“`go
var num = 10 //numのデータ型はin
GCPのWorkbenchにgoを入れる
# はじめに
GCPのWorkbench(JupyterLab)にgoを入れたので備忘録として残します
Jupyter環境であれば同様の手順で入れられるかと思います。
goをgcpのワークベンチでインタラクティブに実行したいというニーズはほぼない気はしますが、そんなニッチな誰かの役に立てれば# goをインストール
go**インストール**
“`
cd /usr/local
wget https://dl.google.com/go/go1.14.2.linux-amd64.tar.gz
tar -C /usr/local -xzf go1.14.2.linux-amd64.tar.gz
rm -rf go1.14.2.linux-amd64.tar.gz
“`パッケージインストール先のディレクトリ作成
“`
sudo mkdir /var/www
sudo mkdir /var/www/go
sudo chown -R jupyter /var/www/go
“`パスを通す
“`
vim ~/.bash_profile以下を追加
export PATH
Golangで関数にメソッドを生やす
# ある日
関数の型をdefined typeで定義していたとき、ふと思いました。「Golangはdefined typeで型を定義して、その型にメソッドを定義できる。一方関数がファーストクラスオブジェクトな言語であり、関数の型もdefined typeで定義できる・・・、なら関数の型にもメソッドを定義できるのでは?」と :thinking:
# 試してみた
“`golang
package mainimport “fmt”
type F func() int
func (r F) Add(i int) F {
return func() int {
return r() + i
}
}func (r F) Inc() F {
return r.Add(1)
}func (r F) Calc() int {
return r()
}func main() {
var f F = func() int { return 1 }
fmt.Printf(“%d\n”, f.Add(2).Inc().Calc())
}
“`できました :co
【Go】Go言語入門①ーGo言語の第一歩
# はじめ
**Mac** でgo言語を勉強しはじめました。
自分の成長を記録したいので、記事をアップロードしました。macOS Big Sur : 11.6.1
# インストール
HowmebrewでGoをインストールする。
“`
$ brew install go
“`### バージョン確認
インストールをしてから、バージョンを確認する
“`
$ go version
go version go1.19 darwin/amd64
“`# goファイルを作成
テストファイル(hello.go)を作成する。
“`
$ touch hello.go
“`hello.goファイルに下記のソースコードを記入する。
“` go
package mainimport “fmt”
func main() {
fmt.Println(“hello world!”)
}
“`
編集してから、実行する。# 実行
## 実行方法1
ビルドして実行する。
“`
$ go build hello.go
“`
同じディレクトリにバイナリデータ(h
GOLangでフィボナッチ数を計算した
## はじめに
直近Go言語を勉強していますが、なんか数学問題を解けてみまたいため、[フィボナッチ数](https://ja.wikipedia.org/wiki/%E3%83%95%E3%82%A3%E3%83%9C%E3%83%8A%E3%83%83%E3%83%81%E6%95%B0)を計算できるロジックを作成しました。## 環境
window 10
VSCode## Target
以下の結果を出力する
“`
フィボナッチ数:(0,1,1,2,3,5…)
“`簡単に回帰関数を利用して、作りました。
“`go:package.go
package mainimport “fmt”
func fibonacci() func(x int) int {
return func(x int) int {
if x < 2 { return x } f := fibonacci() return f(x-2) + f(x-1) } } func main() { f := fibonacci() for i := 0; i
go installしたバイナリをscratchイメージで動かす場合の注意点
# TL; DR
– webサーバー等netパッケージを使っているバイナリを `go install` する場合は `CGO_ENABLED=0` をつける
– 付けないと `no such file or directory` と出てしまう
– netパッケージをimportしたバイナリはダイナミックリンクでビルドされてしまうのが原因# はじめに
[gRPC UI](https://github.com/fullstorydev/grpcui) [^1]のバイナリをマルチステージビルドしたら、`no such file or directory` と出て実行できませんでした。
“`bash
$ docker build .
Sending build context to Docker daemon 9.216kB
…
Successfully built 53b474247144
$ docker run -it –rm 53b474247144
exec ./grpcui: no such file or directory
“`# 原因
Go(gin)のAPIテストでテストが止まってしまい終了しない
# はじめに
GoのAPIテストを書いていて問題が発生したのでまとめます
ネットを調べたところ同じ現象が起きていなかったので、初心者の方の参考になればと思います# 問題
ginで作成したAPIに対してリクエストが200返ってくるか確かめるコードを書いたのですテストが終わらず止まってしまいました
“`go:main.go
package mainvar router *gin.Engin
func setupRouter() *gin.Engine {
r := gin.Default()
r.GET(“/ping”, func(c *gin.Context) {
c.String(200, “pong”)
})
r.Run(“:8080”)
router = r
}func main() {
r := setupRouter()
}
“`“`go:main_test.go
package mainimport (
“net/http”
“net/http/httptest”
“testing”“github.com/s