Go関連のことを調べてみた2020年03月10日

Go関連のことを調べてみた2020年03月10日

めんどくさめのinterfaceを満たすgoのmockライブラリを選定する

今回は、

* interfaceがinterfaceを返す
* 返り値がメソッドチェーン的に自身を返す

…ような若干めんどくさいタイプのinterfaceをmockすることにする。

## mockしたい仕様

“`go:base.go
package example

import “context”

type SampleRepository interface {
Save(ctx context.Context, sample Sample) error
FindByID(ctx context.Context)
Where() SampleRepositorySearchSpec
}

type SampleRepositorySearchSpec interface {
IDIn(id …int) SampleRepositorySearchSpec
NameLike(name string) SampleRepositorySearchSpec
Find(ctx context.Context) (SampleList, error)

元記事を表示

最低限の Go package の作り方・公開方法

自作した Go の package を公開する方法を書いていきます。
実運用する package を公開する際は、テストを書いたりしてください。

# 自分の GOPATH のありかを知る

“`
$ go env GOPATH
/Users/[username]/go
“`

# hello だけを返す package を作成する

“`
$ mkdir -p [得たGOPATH]/src/github.com/[username]/hello
$ cd [得たGOPATH]/src/github.com/[username]/hello
$ go mod init github.com/[username]/hello
$ touch hello.go
“`

“`go
package hello

func Hello() string {
return “Hello”
}
“`

# 公開する

“`
$ git init
$ git remote add origin [GitHub上で作成したリポジトリのURL]
$ git add .
$ git com

元記事を表示

GO言語のポインタについて(勉強中)

今回はGO言語のポインタについて投稿させていただきます。

大学時代にC言語を学んだ際に、私は大苦戦したポインタですが、
GO言語で改めてポインタについて学び、重要性などを感じました。

# ポインタについて

変数のアドレス(番地)を格納する変数です。
自分たちが用いる変数がメモリ上のどの番地(アドレス)にあるかを
数字(16進数)で表記します。
ポインタを用いる事によってある関数から別の関数へ値を変更や更新をすることができます。

# GO言語でのポインタの書き方

まずは、自分の用いた変数のアドレスを出力していきます。

“`GO
package main

import “fmt”

func main() {
test := “Hello World!”

// 変数nameのアドレスを出力
fmt.Println(&test)
}
“`

実行すると16進数が出力されます。
次は、アドレスから自分の用いた変数を出力します。
ポインタの変数に対しては「*」を付けます。

“`GO
package main

import “fmt”

func main() {

元記事を表示

Ubuntu18.04にGoをinstallする作業ログ

# 記事の目的
Ubuntu18.04にgo-langをinstallする作業ログ。

# Ref
https://github.com/golang/go/wiki/Ubuntu

# 作業ログ
“`bash:bash
$ sudo add-apt-repository ppa:longsleep/golang-backports
$ sudo apt update
$ sudo apt install golang-go
$ go version
go version go1.14 linux/amd64
“`

元記事を表示

Golangでのtime packageのいろんな使い方まとめました

# 概要
golangでtime objectを利用してあれこれデータを操作したりすることがあり、その時に調べたことややったことをまとめました。

# 目次
– stringからtime.Timeへ変換
– stringからtime.Timeへ変換(Timezoneを考慮)
– time型objectのTimeZoneのみを変換する
– 日付から特定のTimzoneの00:00:00を作る
– 〇〇前、〇〇後の時刻を取得する
– 2つの時刻を比較する (差分、Before、After、Since、Until)
– 2つの時刻から間の日付リストを作る
– 2つの時刻からその間の特定の曜日の日付リストを作る

# stringからtime.Timeへ変換
“`
dateLayout := “2006-01-02”
dateTimeLayout := “2006-01-02 15:04:05”
dateTarget := “2020-01-28”
dateTimeTarget := “2020-01-28 13:14:15”

dateObject, _ := time.Parse(dat

元記事を表示

Pub/Sub 用の Functions のコードを Github で管理する

## 手順
### 1. Github のリポジトリに Functions のコードを準備する
サンプルコードは Pub/Sub で公開されたメッセージと属性を出力するだけの単純な関数。

“`go:example/function.go
package example

import (
“context”
“encoding/json”
“log”

“cloud.google.com/go/pubsub”
)

// User JSONデコード用の構造体.
type User struct {
Name string `json:”name”`
}

// HelloPubSub Pub/Subからトリガーされる関数.
func HelloPubSub(ctx context.Context, m *pubsub.Message) error {

// メッセージの出力
var user User
if err := json.Unmarshal(m.Data, &user); err != nil {
log.Fatal(err)
}
log.Pri

元記事を表示

Go+GraphQLでCRUD API構築(Mac) -その1-

# はじめに
客先でCRUD用APIを`GraphQL`で構築した際の知見を整理したいと思います。
不要と思われる手順は随時読み飛ばして下さい。
何かの参考になれば幸いです。

# 前提条件

– 開発OS:MacOS High Sierra
– 開発言語:Go(v1.12.3)
– API:GraphQL
– APIフレームワーク:gqlgen(v0.11.1)
– DB:MySQL
– DBフレームワーク:gorm

# 開発環境の整備
プロジェクト作成、Go拡張ライブラリのインストール、DB環境等の整備を行います。

## プロジェクトの作成
本説明では`$GOPATH/src`の直下にプロジェクトディレクトリを作成します。
プロジェクト名は`crud_api`とします。

“`
cd $GOPATH/src
mkdir crud_api
“`
※$GOPATH環境変数はGoのインストールディレクトリを指します。
各自お使いの環境に合わせて設定してください。

## Go拡張ライブラリのインストール
– gqlgen
– gorm
– MySQLドライバー

を順次インストー

元記事を表示

Botが雑談に応えられるようにするWEB APIを公開してみた話【個人開発】

# 対象読者
– チャットボット等を初めとする「対話型」のサービスに興味がある方
– チャットボット等の開発に興味がある方
– チャットボットに雑談を話させたい方
– 対話システムと人間の対話に興味がある方

# チャットボットに必要な「雑談力」

チャットボットを初めとする「対話型」のサービスが様々な場面で活用されている昨今ですが、対話型サービスの開発で非常に厄介なのが、「**ユーザからの問いかけに応答するためのセリフを用意しきれない**」問題です。ある程度シチュエーションや用途が限られる場合や、サービス提供者が会話の選択肢を与えるなどしない限り、対話型サービスは無数のユーザ発話を想定して開発をしなければなりません。とりわけ、ユーザがチャットボットに対して行う「雑談」はこの際たる例です。無数にある雑談のバリエーションに対応するには非常に大きいコストがかかりますが、対応をしないと下記の例のように「**すみません、違った言い方で話しかけてみてください**」のような応答を繰り返す味気ない対話型サービスになってしまいます。

“`
Chatbot: 「他に何かできることはありますか?」
U

元記事を表示

GoのEchoを自動リフレッシュしてくれるスクリプト

# はじめに
GoのEchoを少し触っていて、Flaskのように変更適用時に自動でリフレッシュしてくれる機能があれば便利だなと思いました。特に、ソースコードに影響を及ぼさずに外部から環境を構築することが、ミスを減らすために重要だと感じ、シェルスクリプトを書きました。コイツは、カレント以下の変更を検知するようにしてあるので、`./module/`等の変更にも対応してくれます。

まあまあ便利なものができたなと思っているので、よかったら使ってみてください。

# 実行環境
`fswatch`を使います。

“`bash:
# Mac
$ brew install fswatch
# Ubuntu
$ sudo apt install fswatch
“`

# シェルスクリプト
`Makefile`で`make run`を設定していれば、当スクリプトを同一ディレクトリに配置してそのまま実行すると良いです。

“`bash:autoreloader.sh
#!/bin/bash

function cleanup()
{
app_pid=`/bin/ps -fu $USER| gr

元記事を表示

goxygenをつかって、Go + Front Framework + MongoDB構成のWebアプリテンプレートをかんたんに作成する

## 前置き
githubの[Trending Go repositories](https://github.com/trending/go)を見ていたところ、**goxygen**という面白そうなテンプレート作成ツールがあったので、使ってみました。

リポジトリは下記です。
https://github.com/Shpota/goxygen

リポジトリのトップページに、

*Generate a modern Web project with Go, Angular/React/Vue, and MongoDB in seconds?*

とあるように、コマンド一発叩くだけで、MariaDB + golang + FrontFW(Angular or React or Vue)構成のWebアプリの骨子が出来上がるみたいです。

## インストール
READMEに記載の通り、`go get -u github.com/shpota/goxygen`にて取得します。

## goxygen起動
`go run github.com/shpota/goxygen init [appna

元記事を表示

[Golang] ターミナルの入力とPipe処理の入力を区別する

# 概要

CLIを作る時に、ターミナルからのインプットとPipe処理からのインプットの区別が必要になったのでまとめる

目次
1. ソースコード
2. 実行結果
3. 原理と実装詳細
4. 参考文献

## ソースコード

“` main.go
package main

import (
“fmt”
“io/ioutil”
“os”

“golang.org/x/crypto/ssh/terminal”
)

const (
TERMINAL = “terminal”
PIPE = “pipe”
)

func main() {
isTerminal := terminal.IsTerminal(int(os.Stdin.Fd()))
switch isTerminal {
case true:
var stdin string
fmt.Scan(&stdin)
fmt.Printf(“type: %s, text: %s\n”, TERMINAL, stdin)
break
case false:
stdin, _ := iout

元記事を表示

GoでClean ArchitectureでのAPIを実装したときにハマったInterfaceの呼び出し方

# はじめに
今回はGoとClean Architecutureの復習を兼ねて、ゼロからAPIを実装したときに詰まった部分を備忘のためにここに記載します。Clean Architectureならびに利用したフレームワークのbeego自体については、あまりふれないので参考文献をご覧ください。

# 詰まった部分
Interface層であるControllerで、構造体を作成する際にどうやってInterface(継承)をわたせばいいのかわかりませんでした。
具体的には、関数`NewStatusController`に渡す引数`appConfigInterface`の構造体と具体的な値です。
渡すべき引数は、作成したInterface(継承)だと思っていたのですが、Interface(継承)を渡すということに、直感的に「?」が生まれました。

“`Go:status.go
package controllers

import (
“yamamon/flathand-bookmark/interfaces/inside”
“yamamon/flathand-bookmark/useca

元記事を表示

Adafruit Trinket M0でTinyGo(シリアル通信編)

#はじめに
[前回](https://qiita.com/quadnine/items/cfe161e126d4391a8753)に続き、今回はTinyGoとMacとの間でシリアル通信してみる
#セットアップ
###MacでTTYデバイスを確認
“`
$ ls /dev/tty.usb* [/Users/takaaki]
crw-rw-rw- 1 root wheel 18, 40 3 8 15:55 /dev/tty.usbmodem14101
“`
Adafruitが繋がっているTTYデバイス名を確認しておく
#実行コード
“`go:main.go
package main

import (
“time”
)

func main() {
i := 0
for {
time.Sleep(time.Millisecond * 1000)
print

元記事を表示

Go で Slack Bot を作る (2020年3月版)

シンプルな Slack Bot を Go 言語で作ってみます。
順を追って作り方を解説していくので「サンプルコードだけ見たいよ」という方は [こちら](#終わりに) に記載されているものをご参照ください。

## 作るもの

下図のように Bot に対しメンションをつけて `ping` と送ると `pong` と返してくれるだけのシンプルなものです。

![slackbot1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586035/dca85675-4c76-0be8-6cec-44d3b853b62b.png)

Slack からのイベント受信には [Events API](https://api.slack.com/events-api) を使用します。同様に Slack からのイベントを受信する方法としては WebSocket でやり取りする [RTM API](https://api.slack.com/rtm) があり、こちらであれば App 側から Slack に接続しにいくのでサーバー

元記事を表示

[Golang] windows用にtouchコマンドを作ってみた

# 概要

windowsでtouchが使えないので、以下の機能を持つtouchコマンド作ってみた。

1. 複数ファイルを一度に作る (例) touch file1 file2 file3
2. 既存ファイルは上書きしない

もっと綺麗に書ける案があれば教えてください。
[githubレポジトリ](https://github.com/youk-h/golang-cli/tree/master/touch)

## mainコード

mainコード

“`main.go

package main

import (
“errors”
“flag”
“os”
“sync”
)

func main() {
flag.Parse()
execute(flag.Args())
}

func execute(fileNames []string) {
wg := sync.WaitGroup{}
for _, name := range fileNames {
wg.Add(1)
go

元記事を表示

PermutationとBST

# Go Data Structures: Binary Search Tree
https://flaviocopes.com/golang-data-structure-binary-search-tree/

# Generate all permutations
https://yourbasic.org/golang/generate-permutation-slice-string/

元記事を表示

Go バイナリファイルの読み書き

# Go バイナリファイルの読み書き

今回は、Goで固定長と可変長なデータがあるバイナリファイルを読み書きしてみたいと思います。

## やりたいこと

複数個ファイルを1つのバイナリファイルにする。(結合)

バイナリファイルを複数ファイルに書き戻す。(分割)

## データ構造

下記のデータ構造を1つのファイルとして扱い、連結していく。

Offset: 00 01 02 03 04 05 06 07
00 ファイル名サイズ
(4 byte 固定: BigEndian)
ファイルサイズ
(4 byte 固定: BigEndian)
08 ファイル名
(可変長: Lit

Golang mockery/testifyで高階関数をmockする

golangでテストを書く際、[vektra/mockery](https://github.com/vektra/mockery)による[stretchr/testify](https://github.com/stretchr/testify)で使用できるmockの自動生成が非常に便利なのですが、双方クイックリファレンス以外の細かいドキュメントがあまり存在せず特殊な関数をmockしようとする結構悩みます。

最近調べまくったもので**「無名関数で書かれた高階関数のmock」**はズバリの解決方法が検索してもtestifyのissueくらいしか出てこなかったので同じく悩める人のためにここに残しておきます。

# ポイント かつ 結論
* 引数を元にmock内の処理を独自に書きたいなら[Call.Run] (https://godoc.org/github.com/stretchr/testify/mock#Call.Run)を活用する
* mockの戻り値を動的に変更したいなら[Call.Return](https://godoc.org/github.com/stretchr/te

Go Windows GUI Walk examples

# Go Windows GUI Walk examples

GoでWindowsのGUIを作るときは、
`lxn/walk` というpackageを使っています。

## lxn/walk

GitHub – lxn/walk: A Windows GUI toolkit for the Go Programming Language
https://github.com/lxn/walk

上記のリポジトリ内に `examples` というフォルダがあり、
いろいろなコード例が入っています。

https://github.com/lxn/walk/tree/master/examples

“`text
./examples
├─actions
├─clipboard
├─databinding
├─drawing
├─dropfiles
├─externalwidgets
├─filebrowser
├─gradientcomposite
├─imageicon
├─imageview
├─imageviewer
├─img

[Go]1行加えるだけで interface の実装を強制するテクニック

## 本記事の目的

Go の interface を使って抽象的にオブジェクトを扱いたいときにメソッドの実装漏れってないでしょうか?
抽象化したい構造体が多くかったり、interface のメソッドの定義を変更した場合に簡単に発生しちゃうことだと思います。

今回はその問題を起こさないために、Goコンパイラに interface の実装漏れを伝えてもらえるようになる簡単なテクニックを共有します。

## 説明

具体例に `Do()` というメソッドを実装するだけで `Doer` になれる interface を定義してみました。
`Person` は `Doer` の `Do()` メソッドを実装しているので `Doer` です。

https://play.golang.org/p/W9Gd3gZKY2z

“`go
type Doer interface {
Do()
}

type Person struct {
Name string
}

func (p Person) Do() {
fmt.Printf(“My name is %s. I am Doer!!!!