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

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

Go のテストでプロジェクトの特定箇所のディレクトリをフルパス指定する

Go のプロジェクトで、デバッグと、コマンド実行時のテストの挙動の違いが発生して、原因が、カレントディレクトリの違いということに気づいた。VSCode のデバッガでデバッグを実行するときは、プロジェクトルートをワーキングディレクトリにしているが、通常実行すると、現在テストのソースがあるディレクトリがある場所がカレントになる。

この場合、どうやって解決したらいいだろうか? という小ネタを調べたのでメモしておく

# ファイルの現在位置を取得する

`runtime.Caller` は、関数実行のファイルやライン行数を取得するための関数。この関数を利用して現在のファイルパスを取得する。

“`go
_, testSourceFilePath, _, _ := runtime.Caller(0)
“`

# 相対パスを取得する

Win/Mac/Linux のファイルのパスの違いが気になるので、ライブラリで処理する。結局こんなメソッドを書いた。すると、プロジェクトルートからの相対パスを渡すと、そのパスの絶対パスを返すようになる。

“`go
func GetTargetPath(t

元記事を表示

Ebitenで作ったHello WorldをiOS端末で表示させる その2

## はじめに
[前回(Ebitenで作ったHello WorldをiOS端末で表示させる その1)](https://qiita.com/krile136/items/eb46bb5ead9ddddd46fd)の続きです。
今回は、前回作ったMobile.frameworkを読み込んで実機で動かすところを解説します。
Xcodeの作業メインになるのでかなり画像多めです。

## 作業内容

#### 1. 新規プロジェクトの作成
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489761/9a02f953-7f80-15ce-14d1-3e3836866155.png)
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489761/c28c99a4-0576-36f1-0666-7502dd1c9de8.png)
![3.png](https://qiita-image-store.s3.ap-north

元記事を表示

Ebitenで作ったHello WorldをiOS端末で表示させる その1

## はじめに
Ebitenは素晴らしいことにmobile対応もしているため、作ったゲームをiOS/andoridで動かすことができます。
とはいえ、コマンド一発で全てが完了するわけではなく、ebiten側の準備、iOS用ファイルの書き出し、Xcodeの準備をする必要があります。
まずはいつものHello worldをiOSの実機で表示させるためのサンプルコードと手順を解説する第1弾としてebiten側の準備とiOS用ファイルの書き出しを説明していきます。

## 参考にしたもの
やっぱり公式の[go-inovation](https://github.com/hajimehoshi/go-inovation)に倣って作業するのが一番です

## ディレクトリ構造
.
├── hello
│ └── hello.go  // hello worldを表示させるコードが書かれている

├── mobile
│ └── mobile.go  // mobile用にhello.goを呼び出す
│ └── tools.go &em

元記事を表示

GoでCLIのTODOリストを作成した時の振り返り

https://dondakeshimo.github.io/tech-blog/blog/how-to-develop-toco-cli/

の転載です。

# 目次
* [開発管理や開発ルール](#sec1-0-0)
* [GitHub](#sec1-1-0)
* [GitHub Flow](#sec1-2-0)
* [GitHub Projects](#sec1-3-0)
* [英語](#sec1-4-0)
* [CI/CD GitHub Actions](#sec1-5-0)
* [設計](#sec2-0-0)
* [ディレクトリ構造](#sec2-1-0)
* [クリーンアーキテクチャ](#sec2-2-0)
* [テスト](#sec2-3-0)
* [コーディング](#sec3-0-0)
* [Makefile](#sec3-1-0)
* [Value Object](#sec3-2-0)
* [GoDoc](#sec3-3-0)
* [Table Driven Test](#sec3-4-0)
* [ライブラリ選定](#

元記事を表示

依存関係逆転の原則(DIP)を使ってテストしやすいコードを書いてみた

# はじめに

依存関係逆転の原則を使用して、外部サービスに接続が必要だけど、接続部分はモックを使用してロジックだけ簡単にテストコードを実行できるコードを作ってみました。
作成プログラムはS3にファイルを転送する処理を作成して、転送する部分は別でモックを用意してテストコードを書くのを容易にしてみました。
ソースはgolangになっております。

# 依存関係逆転の原則を使用する理由

## テストがしやすい
外部サービスに接続する処理のテストコードを書こうとすると、外部サービスを接続する準備が必要になります。
ただロジックだけ確認したい場合は、外部と接続している処理と同じ型を返すモックを代わりに作成し、テストコード実行時はそのモックを呼んで簡単にテスト実行を可能にします。

## 変更に強くなる
例えば、元々S3にファイルを転送する処理があって、新しく他のサーバーにファイルを転送する処理を加えた時、S3にファイル転送するソースに影響がないように変更を加えられる。

# 実際のソース

## ディレクトリ構成

factoryでs3 or test用のモックのftp用のインスタンスを

元記事を表示

CLIでTODO管理を行うツールを作ったので紹介させてください

https://dondakeshimo.github.io/tech-blog/blog/introduce-todo-cli/

の転載になります

# TODO管理ツールを作りました
https://github.com/dondakeshimo/todo-cli

todo-cliというTODO管理アプリを作りました。
こちら、Go製になります。

モチベーションは大きく3つあり、以下それぞれについて述べていきます。

## TODO管理はCLIでやりたい
TODOリストにタスクを加える行為は記憶容量を多少減らしてくれたり、作業再開の際にスムーズに導入できるようにといった目的だと思いますが、そのリターンに対して面倒臭さが勝ってしまうことが往々にしてありました。
自分はキーボードで操作可能なものは全てキーボードで操作すべきという強迫観念にも似た信条を持っており、マウスやタッチパッドに手を伸ばすという行為はそれだけで多少の心象的ハードルを乗り越える必要があります。
そのため、タスクの管理におけるコストを極力下げるためにはCLI操作でサッとタスクを残しておき、またその作業に戻った時に

元記事を表示

Go言語の特徴

静的型付け言語(⇔動的型付け言語)である。

学習コストは低い

Google製である。

Linux,macOS,Windows,Android,iOSに対応

高速である。
コンパイル言語である。

並行処理が優れている。
Goroutine

Webサーバ開発
モバイルアプリケーション開発
ツール開発

ロブ・パイク氏(UNIX)&ケン・トンプソン(UNIX&C言語)が設計した。

時代に合わせて書きやすくしたC言語がGo言語

元記事を表示

付け焼き刃でFargateにgoでマイグレーション&シード

## 目的

go-ginで開発しているときにFargateに無理やりマイグレーション&シードを行いたかった感じです。

ただlayerが多すぎて肥大化しているので、あまりおすすめしません。
本当はfargateで新しいタスク立てたり、code pipeline使うべきなんでしょうけど、急いでいるのでこれで。

## ファイル

以下fargateにデプロイするようのDockerfileです。
migrationとseedディレクトリにmain.goが入っているのでそれをbuildしてalpineのほうのイメージに移動させます。

“`Dockerfile
FROM golang:latest as builder

ENV CGO_ENABLED=0
ENV GOOS=linux
ENV GOARCH=amd64
COPY . /go/src/backend

WORKDIR /go/src/backend

RUN go get github.com/line/line-bot-sdk-go/linebot && \
go get github.com/joho/godote

元記事を表示

ubuntu 21.04 に apt で golang をインストール

# ubuntu 21.04 に apt で golang をインストール

[こちら記事](https://qiita.com/m-tmatma/items/dff66b3e294293115661) で `ubuntu に apt で golang をインストール` で go のインストール方法を説明しましたが、

ubuntu 21.04 では標準リポジトリで対応できるようになったみたいなので共有します。

“`
sudo apt install -y golang-go
“`

元記事を表示

copier.Copyで変更できない構造体間のコピーには中間構造体を用いるとよい

# 対処方法

“`go
package main

import (
“fmt”
“github.com/jinzhu/copier”
)

// 変更してはいけない START

type Domain struct {
Name string
Age int
Weight float32
BodyHeight float32

}

type OutSider struct {
Name string
Age int64
BodyWeight float64
Height *OutSiderHeight
}

type OutSiderHeight struct {
Height float64
BodyHeight float64
}

// 変更してはいけない END

// ポイントはコピー先と全く同じ名前、型の構造体にすること
type Middle struct {
Name string
Age int
Weight float32 `copier:”BodyWeight”`
BodyHeight float32 `copier:”

元記事を表示

GormからRDSのmysqlデータベースにアクセスするとき

当たり前かもしれませんが、意外と情報がなくててこずったのでここにメモっておきます。

`user`: dbのユーザーネーム
`password`: dbのパスワード
`port`: 3306とかのポート
`dbName`: データベースの名前
`dbURL`: xxxx.xxxx.us-east-2.rds.amazonaws.com のようなrdsのURL

“`sql_handler.go
import (
“os”
“time”

“gorm.io/gorm”

“gorm.io/driver/mysql”
)

// NewSQLHandler …
func NewSQLHandler() *SQLHandler {
user := os.Getenv(“DB_USERNAME”)
password := os.Getenv(“DB_PASSWORD”)
host := os.Getenv(“DB_HOST”)
port := os.Getenv(“DB_PORT”)
dbName := os.Getenv(“DB_DATABASE”)
dbUR

元記事を表示

【プログラム初心者向け】golangのプログラミングノート

# はじめに
golangを学ぶにあたって、基本的な文法をまとめてみました。
超基本的な内容です。随時、アップデートします。ご指摘頂けると幸いです。

# 環境構築(Mac)
“`:homebrewアップデート
brew update
“`
“`:goインストール
brew install go
“`
“`:goバージョン確認
go version
“`

# 実行
“`:hello.go
package main

import (“fmt”)

func main(){
fmt.Println(“おはよう”)
fmt.Println(“こんにちは”)
fmt.Println(“こんばんは”)
}
“`
・Goのプログラムは、何らかのパッケージに属している必要がある
・Goのプログラムは、そのうち1つは、必ずmainパッケージに属している必要がある
・ここでは、プログラム内で使う「fmt」というパッケージをインポートしている
・fmtパッケージをインポートすることで、fmtパッケージの中にある関数などを使えるようになる
・fmtパッケージには

元記事を表示

Go gin でチェックボックス取得

# ginでチェックボックスを取得・表示
大したものではないですが、一応調べる必要があったので記載してみます。
参考になれば幸いです。

“` html

   

趣味

 
 
 
 
 
 
 
 

“`

まずフォーム自体はこんな感じですね。

元記事を表示

errors.Warpf => xerrors.Errorf全置換正規表現

vscodeでいきなり `すべて置換` を選ぶと $1 が変な結果になるので1件ずつ確認しながら実行してください。

“`
search : errors.Wrapf\(err,\s”([^”]+)”\)
replace: xerrors.Errorf(“$1: %w”,err)
“`

結果:

“`:go
return errors.Warpf(err, “failed to xxx”)
=>return xerrors.Errorf(“failed to xxx: %w”, err)
“`

“`
search :errors.Wrapf\(err,\s`([^`]+)`\)
replace: xerrors.Errorf(`$1: %w`,err)
“`

結果:

“`:go
return errors.Warpf(err, `failed to xxx(“cccc”)`)
=>return xerrors.Errorf(`failed to xxx(“ccc”): %w`, err)
“`

元記事を表示

Interfaceを満たしているかcompile時に確認

# Overview
ライブラリのコードを読んでいたところ、
`var _ Setter = (*Cmd)(nil)`
こんなコードがあったので、[effective go](https://golang.org/doc/effective_go)をもとに、なんの意味があるのか確認。

# Detail
[Interface Checks](https://golang.org/doc/effective_go#blank_implements) のセクションに記載がある。

– `Cmd` structが、`Setter` interfaceを満たしているか確認。もし`Setter`の実装が変わり`Cmd`の実装も変更していないと、`var _ Setter = (*Cmd)(nil)` の部分でcompilerによりエラーになり`Setter`の実装が変わったことが気づける。
– blank identifier(`var _ Setter`) にする理由は、`setter`にキャストする`(*Cmd)(nil)`を使わないため。そのためcompilerのエラーをださせないので、

元記事を表示

とりあえずバージョン管理しつつGoを利用してみる

Go言語を触って見たかったのでローカルで環境を作成しました。
その際に行ったことを備忘録として残しておきます。

# 環境設定
今回はgoenvを利用してGoのバージョンを管理していきたいと思います。
(普段はrbenvを利用しているので馴染みのあるenv系のソフトにしました)

### goenvのダウンロード
まずはgoenvのダウンロードです。

“`
$ brew install –HEAD goenv
$ goenv -v
goenv 2.0.0beta11
“`

`–HEAD`をつけているのはgoenvの2系を利用するためです。
2021/7/12現在、普通にインストールすると1系になってしまい、goのバージョンが`1.12beta`までしか利用できません。自分は1.16以上で利用したかったので上記のようにしています。

### goenvのPATHを通す
自分.bashrc`を利用しているのでbashrcに以下を追記します。

“`bash:.bashrc
export GOENV_ROOT=$HOME/.goenv
export PATH=$GOENV_R

元記事を表示

ebitenでキャラクターを十字キーで動かす

## はじめに
[前回の記事](https://qiita.com/krile136/items/0d88650a9ea578ee7484)でキャラクターをその場で足踏みさせることができたので、今度は十字キーで動かせるようにします

## 動きの仕様
1. キーを押している間にそのキーの方向へ移動
2. 斜め移動の時の向きは、先に押したキーの向きとする(左上への斜め移動の時、左→上と押したら左向とする)
3. キーを離した時、最後に向いていた方向でニュートラルの姿勢になる
4. 斜め移動と縦や横の移動の速さは同じとする

### 1. キーを押している間にそのキーの方向へ移動
これは十字キーを押している間に、キャラクターの表示位置を押したキーに沿って動かしてやれば良いです。

### 2. 斜め移動の時の向きは、先に押したキーの向きとする
保持している矢印キー情報がない場合で、最初に押されたキー情報を保持しておき、そのキーが離されたら保持していたキー情報をリリースする。
そうすることで、上→左 と押して左上に移動するときは上向きという情報が保持され、左→上通して左上に移動するときは

元記事を表示

【Golang】ベンチマークで “no test files” と出てしまう。テストはあるのに。

> Golang でベンチマークが簡単にできるというので、`go test -bench ./subpackage/…` と打ったら “no test files” と言われてしまう。
> `go test ./subpackage/…` でテストは走る。

[「”golang” test bench “no test files”」とググって]()も、`go help test` を見ても、なんかゴチャゴチャしてわからなかったので、自分のググラビリティとして。

## TL; DR (今北産業)

1. ベンチを走らせる時の構文が間違っています。

“`
go test -bench <正規表現> <テストのパス> <その他のオプション>
“`
1. ベンチを走らせるには `-bench` オプションが必要で、引数も必要。
– 引数は正規表現でマッチした関数のみを走らせるために必要です。すべてのベンチを走らせたい場合は `.` と指定します。
1. `.

元記事を表示

Amazon S3にある画像のExif情報の削除&向きを自動調整してアップロードするGoのLambda関数

# 概要
S3に格納されているオブジェクト(JPEG画像)をコピーした際に起動するLambda関数。
Lambda関数の処理としては、コピーした画像を読み込んで向きを自動調整し、Exif情報を削除した上でS3にアップロードしている。

# 環境
go1.16.5を使用。
Lambdaのランタイムは `go1.x` 。
# ソースコード

“`go
package main

import (
“bytes”
“errors”
“io”
“log”
“os”

“github.com/disintegration/imaging”

“github.com/aws/aws-lambda-go/events”
“github.com/aws/aws-lambda-go/lambda”
“github.com/aws/aws-sdk-go/aws”
“github.com/aws/aws-sdk-go/aws/session”
“github.com/aws/aws-sdk-go/service/s3”
“github.com/aws/aws-sdk-go/serv

元記事を表示

Netlify FunctionsをGoで記述する

# Netlify FunctionsをGoで書く
AWS lambdaを使う感覚でFaasを使いたい場面がありました。
ただ、AWS lambdaを使うのは少し荷が重い(従量課金制なので万一ミスしたときが怖い)ので、Netlify Functions上でGoを動かしました。

## 手順

1. NetlifyとGitのホスティングサービス上のリポジトリを紐づける
1. 紐づけたリポジトリのSitesでFunctionsのディレクトリを設定
1. GoでFunctionを作成
1. Functionsのビルドの設定(Netlify.toml、Makefileの記述)
1. pushを行い,Functionsが起動しているかを確認する

リポジトリの紐づけ

![image.png](https://qiita-image-stor

元記事を表示

OTHERカテゴリの最新記事