Go関連のことを調べてみた2021年07月15日

Go関連のことを調べてみた2021年07月15日

【tmux】smugを利用したワークフロー管理及び自動化

– 普段tmuxを利用して複数端末を起動した状態で作業することが多い。
– 非常に便利だが、以下の点を解消するべく調査。
– 定型作業の自動化
– 同様のサーバー接続や複数画面分割等の定型的なtmuxワークフローの手間。
– プロジェクトや作業単位での管理
– 日々行なっている複数作業の内容の把握が難航。
– 調査の結果、複数の類似プロジェクトがあるが比較的導入が容易であろうsmugというツールがあったため、今回は利用方法を記録する。

## 概要
– Go製のtmuxワークフロー管理ツール
– ウィンドウやペイン分割数、起動コマンド等の単一のファイル(yaml)で管理可能。
– 同様のツールにRuby製の[tmuxinator](https://github.com/tmuxinator/tmuxinator)がある。
– [Github](https://github.com/ivaaaan/smug)

## 結果
– 以下のように単一の構成ファイルを作成して、単一のコマンドでペインの分割や起動時のコマンドを管理することが可能。

元記事を表示

【Go】fmt.Printfには改行を入れよう

##概要
先日、db周りの変数を調べるためにfmt.Printfを使って確認していたらfmt.Printfの中身が出力されなくなったので、自分の解決方法を書いておきます。
##解決方法

“`go:main.go
fmt.Printf(“hoge変数の中身=%v”,hoge)//これを
fmt.Printf(“hoge変数の中身=%v\n”,hoge)//こうする(\nを付ける)
“`

初歩的な事だとは思いますが改行とともに何の変数かがわかる文字列も一緒に出力すると分かりやすくていいと思います。

元記事を表示

AtCoder Beginner Contest 196 ~Goの練習~

# [A問題](https://atcoder.jp/contests/abc196/tasks/abc196_a)

## 考察

$x$の最大値から$y$の最小値を引けばよく、$b-c$を出力するのみ。

## コード

“`go
package main

import (
“bufio”
“fmt”
“os”
)

func main() {
scin := bufio.NewReader(os.Stdin)
prout := bufio.NewWriter(os.Stdout)
defer prout.Flush()

// code
var a, b, c, d int
fmt.Fscan(scin, &a, &b)
fmt.Fscan(scin, &c, &d)
fmt.Fprintln(prout, b-c)
}
“`

# [B問題](https://atcoder.jp/contests/abc196/tasks/abc196_b)

## 考察

浮動小数点数であってもおそらく表現できないので、文字列として扱えば良い。

以下では、`.`

元記事を表示

【Go】入門(メソッドとレシーバ)

# はじめに
Go初心者です。
メソッドとレシーバについてまとめてみました。

# メソッド / レシーバとは
メソッドとはレシーバに呼び出される関数のこと。
レシーバとはメソッドを呼び出す側のオブジェクトのこと。

以下のコードだと、
(p Person)がレシーバで、 Greet()がメソッド。

“`golang
type Person struct {
Name string
}

func (p Person) Greet() string {
return “Hi, ” + p.Name
}
“`

# メソッドを使ってみる
メソッドはレシーバで定義した構造体の変数から呼ぶことができる。
下の例では、Person型の変数personが、Greetメソッドを呼んでいる。

“`golang
type Person struct {
Name string
}

func (p Person) Greet() string {
return “Hi, ” + p.Name
}

func main() {
person := Person{Name: “hog

元記事を表示

ebitenで画像の表示を関数化する

## はじめに
先日、この[ゲームエンジンはアートである](https://note.com/hajimehoshi/n/nc09751f2dbf9)という記事を読んで、go言語のことやebitenの設計思想を見ているうちに「これは自分に合ってるかもしれない!」と強く思い手を出してみた。しかしebitenはじめgo言語は触ったことがなく、とりあえず学習として画像の表示を関数化することを目標にした。

## ebitenとは?
go言語で作られた2Dゲームエンジンです。スーパーファミコン風のゲームが作れるみたいですね
設計思想にある「ミニマムな API で実用的な 2D ゲームが作れるかどうか」の部分で、RigidChipsをやっていた頃を思い出し、今回手を出してみることにしました

## インストールとかチュートリアル
公式がとてもよくわかりやすいのでまずは[こちら](https://ebiten.org/)へ

## サンプルの画像が回転するやつのソースコードを見てみる

公式の[ソースコード](https://github.com/hajimehoshi/ebiten/blob/

元記事を表示

ホットリロードツールの作り方(GoCon 2021 Spring)

http://makiuchi-d.github.io/2021/06/13/gocon2021spring-hotreload-tool.ja.html

元記事を表示

Rubyから始めるGo ~ 文法 ~

# はじめに

Rubyを知っている状態で、Goを勉強してみました。

GoはGoogleが開発したプログラミング言語で実行速度が速いのが持ち味らしいです。

# バージョン

| Ruby | Go |
| :—- | :—– |
| 2.7.1 | 1.16.5 |

# 基本形

“`go:main.go
package main

import “fmt” // コンソールに出力する用のパッケージ

func main() {
// コンソールに出力
fmt.Println(“Hello World”)
}
“`

# Rubyで解釈

## 変数定義(例:文字列型)

“`ruby:ruby
message = “Hello World”
“`

“`go:go
// 通常系
var message string = “Hello World”
// 省略形 その1
var message = “Hello World 2”
// 省略形 その2
message := “Hello World 3”
“`

### 論理値型

元記事を表示

【Golang】空の rune をセットする(はたまた rune の初期化)

> 空のルーン文字を返したいが、返り血をあびるし、戻り値で吐血する

“`golang:””で切り返すと返り血をあびる
func Foo() (rune, error) {
err := errors.New(“my error”)

return “”, err
}
// Output: cannot use “” (untyped string constant) as rune value in return statement
“`
“`golang:new()で戻すと吐血する
func Bar() (rune, error) {
err := errors.New(“my error”)

return new(rune), err
}
// Output: cannot use new(rune) (value of type *rune) as rune value in return statement
“`
“`golang:nilても焼いても食えない
func Buzz() (rune, error) {
err := errors.New(“m

元記事を表示

gormとタグの指定

# 概要

Go言語にて、gormを利用してみました。
構造体を利用してORマッピングを行うことができます。

gormでのモデルの宣言は以下。

“` golang
import (
“gorm.io/gorm”
)

type User struct {
gorm.Model
Name string
}
“`

gorm.Modelをフィールドに持つことで、自動的に
“`created_at“`,“`updated_at“`,“`deleted_at“`,“`id“`フィールドを付与してくれます。この場合、主キーは自動的に“`id“`になります。

## タグでの指定
データベースの構造に対応して、各フィールドの設定を変更したい場合、タグを利用します。

“` golang
type User struct {
gorm.Model
ID int `gorm:”column:_id”`
Name string `gorm:”primaryKey column:user_name”`

元記事を表示

Golang で enum 。 enum に多様な属性や振る舞いを効率よく実装したい。

https://qiita.com/ikngtty/items/ad135599a2f92e6035fa

https://qiita.com/kyoh86/items/18b8bfc6ffe045aaf380

自分だったらどうするかな、というのを書いてみました。2つ目の記事でも指摘されているような Switch 文はたしかに書きたくないので、配列のインデックスアクセスにする方法を採用しています。

個人的には `enum` は固有の情報を色々持てるのが嬉しいので、単に「分かりやすい文字列で識別できればいい」というわけではないんですよね。以下の例でも

– 日本語での表現
– 英語での表現
– 次の季節が何か
– 前の季節は何か
– めぐる季節の順序判定

などの機能が `enum` の値に応じてちゃんと挙動を変えて動いてくれるようになっています。

### 使い方:

“`go
hoge := enum.SeasonValueOf(“ほげ”)
fmt.Printf(“‘ほげ’ は ‘%s’ の季節です。\n”, hoge.Ja())

fmt.Println(“—-

元記事を表示

AtCoder Beginner Contest 197 ~Goの練習~

# [A問題](https://atcoder.jp/contests/abc197/tasks/abc197_a)

## 考察

文字列の二文字目以降をスライシングし、その後ろに文字列の一文字目を付け足して実装する。

## 文法

実装時にGoでは2通りのパターンが生まれると思う。

1パターン目は`s[1:]+string(s[0])`とする場合。Pythonの場合は一文字を切り出してもstringなので、このような書き方をすると思う。

2パターン目は`s[1:]+s[:1]`とする場合。文字列のスライシングではstring型のままなので、明示的な型変換の必要のないこちらを競プロでは採用するべきだと思う。

“`go
package main

import (
“bufio”
“fmt”
“os”
)

func main() {
scin := bufio.NewReader(os.Stdin)
prout := bufio.NewWriter(os.Stdout)
defer prout.Flush()

// code
var s string

元記事を表示

Google Cloud Storage を使用した分散ロックはどのように実装されているのか?

次の記事を読んでどのように実装しているのだろうと疑問に思い調べた結果を残しておきます。

https://cloud.google.com/blog/ja/products/storage-data-transfer/implementing-leader-election-google-cloud-storage

以下、本文中では Google Cloud Storage を GCS と表記しています。

## 調査対象

軽く調べたところ冒頭の記事で紹介されていた [hashicorp/vault](https://github.com/hashicorp/vault) 内のパッケージ以外にも類似機能を提供している OSS があったのでそちらも調べてみました。

### mco-gh/gcslock

https://github.com/mco-gh/gcslock

Go で実装されたライブラリとコマンドですがシェルスクリプト実装も公開されています。

mco-gh/gcslock は GCS が備えている [世代番号と前提条件](https://cloud.google.c

元記事を表示

Cloud Tasks API は context に設定したタイムアウトが 30 秒より大きいとエラーになる

[googleapis/google-cloud-go](https://github.com/googleapis/google-cloud-go) を使用して [Cloud Tasks API](https://cloud.google.com/tasks/docs/creating-appengine-tasks#go) の `CreateTask()` 実行したところ 30 秒より大きいタイムアウトは設定できないというエラーメッセージ (`The deadline cannot be more than 30s in the future.`) が返ってきたので調べてみました。

## 同じ問題に遭遇した例がないか探す

エラーメッセージで調べたところ次の Issue が見つかりました。
(クローズされていますが内容を見る限りでは未解決のままです)

https://github.com/googleapis/google-cloud-go/issues/1577

個々のリクエストでタイムアウトを指定したつもりはなかったのですが context に設定したタイムアウトが 30

元記事を表示

[Go] YAMLファイルを埋め込み構造体に読み込む

以前、Go言語でYAMLファイルを埋め込み構造体に読み込もうとした際に、JSONを読み込むのと同じように実装したらうまく読み込めなかったことがあった。
その時調べた内容をまとめておく。

# 結論

このようなYAMLファイルがあった場合

“`yaml
# tmp.yaml
wheels: 4
tons: 10
“`

下記のように構造体の埋め込みフィールドに`inline`タグをつけることで埋め込み構造体に読み込むことができる。

“`go
package main

import (
“fmt”
“os”

“gopkg.in/yaml.v2″
)

type Car struct {
Wheels int `yaml:”wheels”`
}

type Truck struct {
// 埋め込み のフィールドに ‘inline’ タグをつける
Car `yaml:”,inline”`
Tons int `yaml:”tons”`
}

func main() {
truck := Truck{}
b, _ := os.ReadFile(“tmp.

元記事を表示

AtCoder Beginner Contest 198 ~Goの練習~

# 感想

今回は時間がなかったので、内容があまり充実していません。

# [A問題](https://atcoder.jp/contests/abc198/tasks/abc198_a)

## 考察

$i,n-i$で$i \geqq 1$となるように配れば良いので、$n-1$通りが答え。これを出力する。

## 文法

特になし。

“`go
package main

import (
“bufio”
“fmt”
“os”
)

func main() {
scin := bufio.NewReader(os.Stdin)
prout := bufio.NewWriter(os.Stdout)
defer prout.Flush()

// code
var n int
fmt.Fscan(scin, &n)
fmt.Fprintln(prout, n-1)
}

“`

# [B問題](https://atcoder.jp/contests/abc198/tasks/abc198_b)

## 考察

本解説とは異なる方法。

左側に0を付け足すのでは

元記事を表示

【Go】入門(構造体と関数を紐付ける)

Goで構造体と関数を紐付ける方法についてのメモです。

# Goで構造体と関数を紐づける方法

Goでは、class内にメソッドを定義できません。
では、どのように構造体ごとの関数を定義するのか?

“`go
package main

import “fmt”

type Human struct {
Name string
Age int
}

func (h Human) addAge(i int) int {
return h.Age + i
}

func main() {
// インスタンス生成
hoge := Human{
Name: “hoge”,
Age: 20,
}

fmt.Printf(“%#v \n”, hoge)
hoge.Age = hoge.addAge(1)
fmt.Printf(“%#v \n”, hoge)
}
“`

つまり、構造体と関数の紐付けはこのようになります。

“`go
type Human struct {

元記事を表示

Prismaの基本操作(MySQL CRUD処理)

#本記事の内容
TypeScriptやGo言語をサポートしているPrismaの説明です。MySQLのCRUD処理に関した記事となります。
※TBLの作成方法は[マイグレーション編](https://qiita.com/kouji0705/items/945baaeab0a476550c40)を参考にしてください。

#基本情報

更新対象TBL(マイグレーション編で作成済)

![スクリーンショット 2021-07-11 17.01.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/cc33ba59-3684-7f08-9001-6bf50443e481.png)

ディレクトリ構成

“`
~/develop/study/starter $ tree -I node_modules
.
├── package-lock.json
├── pack

元記事を表示

Googleカレンダーで予定を作成したら、別アカウントのカレンダーに「ブロック」予定を作成する

個人用のGoogleカレンダーに予定を登録→平日なら内容に応じて前後30分増やして会社のカレンダーにブロック予定を作成、などを行います。[^zapier]
Google Calendar APIの[Go client library](https://pkg.go.dev/google.golang.org/api/calendar/v3)とApp Engineを主に用いて構築します。
内容をまとめたリポジトリはこちら:

https://github.com/shiraily/gcal-sync

# この記事について

記事内のコードは説明のための部分的なコードなので、エラー処理など完全なものはリポジトリを参照ください。
また、以下を前提として進めます。

– GCP projectが作成済み。以下を利用
– App Engine
– Cloud Scheduler
– Firestore
– Go / Google Cloud SDK

# 事前の設定

### Google Calendar APIの有効化

GCPでAPIを有効化します。[コンソール

元記事を表示

AtCoder Beginner Contest 199 ~Goの練習~

# 感想

今回から[作成したテンプレート](https://qiita.com/DaikiSuyama/items/f82d26399a49eb121004)を利用して問題を解くことにしたが、エディタの補完が突如として効かなくなったのであまり速くならなかった。

また、だいぶGo言語には慣れてきた気がするので、Web開発の勉強にできるだけ時間を割きたいと思い始めた。

# [A問題](https://atcoder.jp/contests/abc199/tasks/abc199_a)

## 考察

$A^2+B^2

元記事を表示

競プロ用テンプレート(Go)

# 前書き

入力の高速化用のコードとそれに付随してimportするパッケージを併せたものをテンプレートとして本記事にまとめます。

また、普段使っているPythonやC++とは異なり、パッケージが充実しているわけではないので、随時必要な関数などを追記する予定です。

# コード

“`go
package main

import (
“bufio”
“fmt”
“os”
)

func main() {
scin := bufio.NewReader(os.Stdin)
prout := bufio.NewWriter(os.Stdout)
defer prout.Flush()

// code
}
“`

元記事を表示

OTHERカテゴリの最新記事