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

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

AtCoder Beginner Contest 210 復習

![IMG_83EFEFFF036C-1.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331393/5bdb97fe-404d-4fff-add3-47e51a5e0ea6.jpeg)
# 感想

今日もコンテストに間に合わなかったので、ダラダラ解いていた。

Dの方針がすぐに思い浮かんだものの、実装に面倒さを感じて他のことに怠けてしまった。

この怠け癖を無くさないと、競技プログラミングだけでなく他のことでも大成できない気がする。

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

## 考察

$n$が$a$以下であるかで場合分けすれば良い。$a$以下の時は$n \times x$を出力し、$a$より大きいときは$a \times x+(n-a) \times y$を出力する。

“`go
package main

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

func main() {
scin

元記事を表示

golangで始めるstate machine

仕事でチャットボットを作る可能性があり、セリフ管理にstate machineが使えるかもということで、golang で state machineを触ってみました。

# state machine とは?
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179800/b6ef245f-fa59-bb4a-5751-4e111a829f09.png)

図のように、ある状態からある状態へ遷移するなどの構造を表したものです。
なので、現在のstate -> 遷移可能なstate -> 次のstateの情報をそれぞれのnodeが持つことになります。

尚正式名称は finite state machine と呼ぶ、 state machine は省略形のようです。

# golangでのFSM

https://github.com/looplab/fsm
今回使ったライブラリは上のものです。

## nodeの生成

“`go
const (
start = “start”
m

元記事を表示

メソッドをもっているかのtype assertion

# Overview
Timeoutのエラーかどうか判別する等で使える。

## ex)
“`go

_, ok := err.(interface{ Timeout() bool })
if ok {
// ex) retry or something
}

return error
“`

元記事を表示

ebitenでキャラクターが歩くモーションを作ってみる

## はじめに
ゲームを作ろうと思ったら、やっぱりキャラクターに動きは必要ですよね。
とりあえず歩くモーションだけでも作りたいですよね。
私は作りたいので、作ってみました。

## サンプルコードのanimationを見てみる
ebitenインストール→サンプルのanimationをみる→めっちゃヌルヌル動くやん。。。
まずはこのサンプルを解析しましょう。

必要なところだけ抽出して解説します。

~~~go
const (
screenWidth = 320
screenHeight = 240

frameOX = 0 // フレーム開始時点のX座標
frameOY = 32 // フレーム開始時点のY座標
frameWidth = 32 // 1フレームで表示する横幅
frameHeight = 32 // 1フレームで表示する縦幅
frameNum = 8 // 表示させる画像の数
)

var (
// イメージの宣言(今回省略したmain関数の中で画像自体の読み込みをしています)
runnerImage *ebit

元記事を表示

AtCoder Beginner Contest 195 ~Goの練習~

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

## 考察

$h$が$m$の倍数になるかを判定するには$h\%m$が0になるかを判定すれば良い。

“`go
package main

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

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

// code
var m, h int
fmt.Fscan(scin, &m, &h)
if h%m == 0 {
fmt.Fprintln(prout, “Yes”)
} else {
fmt.Fprintln(prout, “No”)
}
}
“`

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

## 考察

みかんを$i$個選んだ時の重さは$A

元記事を表示

go-cmpでpanicがおきたら

# 対処方法

“`go
package main

import (
“fmt”

“github.com/google/go-cmp/cmp”
“github.com/google/go-cmp/cmp/cmpopts”
)

type Struct struct {
XXX int
xxx int
}

func main() {
s1 := Struct{ 1, 1}
s2 := Struct{ 1, 2}

opt := cmpopts.IgnoreUnexported(Struct{}) // ここ大事
fmt.Println(“Diff: “, cmp.Diff(s1, s2, opt))
}
“`
[PlayGroundで試す](https://play.golang.org/p/bSXVpa_XKnR)

# もう少し詳しく
どうやら`go-cmp`は、プライベートな変数があるとパニックになってしまうらしい。
実はこのプライベートの取り扱い方でいくつかパターンが用意されている。

+ [プライベート変数は一致しなくてよい場合](#プライベート変

元記事を表示

Pythonしか知らない人がGoに入門した時モジュール管理がわからんかった

## 注意
この記事は 2021/03/16 にGoを始めたときに書いた記事です。
あとからもうちょい修正しようと思って寝かしてたんですが、結局直さなかったので
途中までになりますが、載せておきます。

## Goはじめたい理由
噂によるとGoは動作が速いらしいので、PythonのFlaskで書いてたAPIをGoのEchoで置き換えたい。
大体それだけが理由です。()

## 用意したもの
Windows 10
– Macは持っていないのでとりあえず

Python 3.8.6 windows/amd64
– いつもよく使っているPythonくん
 - 公式サイトからインストーラをダウンロードして実行しただけ

Go 1.15.6 windows/amd64
 - 割と最近入れたGoくん
 - 公式サイトからインストーラをダウンロードして実行しただけ

VSCode
– メインで使っているエディタ

## まずはじめにしたこと

Go 入門 でググってみる。
すると [Go言語の初心者が見ると幸せになれる場所](https://qiita.com/tenntenn/ite

元記事を表示

【GO言語】Twitterで自動いいねbotの作り方

久しぶりに投稿します。
今回はタイムラインに流れてくるツイートに対して、
自動いいねできるコードを作成したので、そのご紹介です。
1ヶ月くらいやるとフォローが減ったりします。

####やったこと
・Go言語で自動いいねbotの作成

####環境
・Go (version 1.158.8)
・WindowsServer2019
 ※実行方法はタスクスケジューラで定期実行してました。

####実装
#####Twiter認証

“`Twiter認証.go
import (
“github.com/ChimeraCoder/anaconda”
)
//Twitterの認証を行うメソッド
func GetTwitterApi() *anaconda.TwitterApi {
anaconda.SetConsumerKey(“XXXXXX”)
anaconda.SetConsumerSecret(“XXXXXXXX”)
api := anaconda.NewTwitterApi(“XXXXXX”, “XXXXXXXX”)
return a

元記事を表示

今更Qラーニングを学習する

## 公開もしてないのに移転しました
https://zenn.dev/ttrsq/articles/83872e7fff4021

元記事を表示

【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/main/examples/rotate/ma

元記事を表示

ホットリロードツールの作り方(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

元記事を表示

OTHERカテゴリの最新記事