Go関連のことを調べてみた2019年11月19日

Go関連のことを調べてみた2019年11月19日

【GitHub Actions】Go言語の自動テストからリリースまでを作ってみた

## はじめに

今回作成したのはGo言語リポジトリ用ワークフロー。
GitHubに指定されたタグがPushされた時点でテストを実行し問題が無ければ、クロスコンパイルを実施しリリースまで行う。
以下にアップロードしているので利用したい方はこちらからどうぞ。

– [github-actions-workflows/release_go.yml at master · x-color/github-actions-workflows · GitHub](https://github.com/x-color/github-actions-workflows/blob/master/workflows/release_go.yml)

ワークフローの流れは以下となっている。

1. タグがPushされたことをトリガーにワークフローが起動
1. 依存したモジュールをダウンロード
1. テストを実施
1. テストに合格した場合、リリースプロセスが始動
1. ソースコードをzipにまとめリリース
1. クロスコンパイルを実施し、それぞれ生成物をzipにまとめてリリース

以下が実際のworkfl

元記事を表示

Golang – Custom Zap Log

“`golang

w := zapcore.AddSync(&lumberjack.Logger{
Filename: “app.log”,
MaxSize: 1, // megabytes
MaxBackups: 30,
MaxAge: 30, // days
})

c := zapcore.EncoderConfig{
MessageKey: “msg”,
LevelKey: “level”,
TimeKey: “time”,
NameKey: “logger”,
CallerKey: “file”,
StacktraceKey: “stacktrace”,
LineEnding: zapcore.DefaultLineEnding,
EncodeLevel: zapcore.LowercaseLevelEncoder,
EncodeTime: zapcore.ISO8601TimeEncoder,
EncodeDu

元記事を表示

Golang – How to Get Local Mac and IP Address?

“`golang
//———————-
// Get the local machine IP address
// https://www.socketloop.com/tutorials/golang-get-local-ip-and-mac-address
//———————-

addrs, err := net.InterfaceAddrs()

if err != nil {
fmt.Println(err)
}

var currentIP, currentNetworkHardwareName string

for _, address := range addrs {

// check the address type and if it is not a loopback the display it
// = GET LOCAL IP ADDRESS
if ipnet, ok := address.(*net.IPNet); ok && !ipnet.IP.IsLoop

元記事を表示

【golang】ネストしたstructに値を入れる方法

#概要
ネストしたstructに値を入れる方法と実践での注意点。
#記述方法
基本的には以下のルールで記述が可能。

“`golang:main.go
package main
import “fmt”

type A struct {
AKey1 string
AKey2 string
B
}

type B struct {
BKey1 string
BKey2 string
}

func main() {
// key:valueで記述が可能
var st1 = A{
AKey1: “val1”,
AKey2: “val2”,
B: B{
BKey1: “val3”,
BKey2: “val4”,
},
}

// keyの省略も可能
var st2 = A{
“val1”,
“val2”,
B{
“val3”,
“val4”,
},
}

//宣言してから 変数.key = val でも可能
var st3 = A{}
st3.AKey1 = “val1”
st3.AKey2

元記事を表示

gitコマンドのTypoをGopherくんが教えてくれるコマンドを作ってみた

# 概要

**※この記事を書いている途中に[こちら](https://qiita.com/ramenjuniti/items/fd502b4870f8e4ea87bb)が公開されびっくりしました。(まさかこの内容がピンポイントに被るとは…)**

最近go言語を勉強し始めたので、勉強がてらgitコマンドをgotとTypoしたときに、Gopherくんが教えてくれるコマンドを作成しました。

[https://github.com/aojiru-ts/Got-Gopher-kun](https://github.com/aojiru-ts/Got-Gopher-kun)

こんな感じです↓
![alt](https://github.com/aojiru-ts/Got-Gopher-kun/raw/master/img/ex.gif)

※コマンドプロンプトやPowerShellでは動かないみたいです…

# やったこと

[mattnさんの記事](https://qiita.com/mattn/items/b7889e3c036b408ae8bd)よりGopherくんが

元記事を表示

初見でGo言語Webアプリケーションをやってみる(POST JSON編)

# はじめに
Go初心者が、初見でWebアプリケーションを作るまでの過程をつづっていきます。

[初見でGo言語Webアプリケーションをやってみる(パラメータを受け取る編)](https://qiita.com/yutaka_m03/items/3345977dd0e252a153cd)の続き
今回は、APIでよく使うJson形式のPOSTをやってみます。

# 実装と結果
## 環境
macOS:Catalina
goバージョン:go1.12.9

## サンプルコード
「JSON形式でPOSTをして、同じ値をJSON形式で返す」という実装にしてみます。
JSONと同じ構造を`type xxx struct{ }`で定義してあげれば、変数に入れてくれます。

“`go:post_json.go
package main

import (
“github.com/gin-gonic/gin”
“net/http”
)

func main() {
router := gin.Default()
router.POST(“/post”, PostTest)
router.R

元記事を表示

[golang][xorm]カラム指定は、Select関数+スライスが使いやすい件

# はじめに

ネット上にxormの情報が少ないので、少しでも共有したいと思います。
何かの参考にして頂けると嬉しいです。

# 結論のコード

“`golang
selectFields := []string{
“column1”,
“column2”,
“column3”,
“column4”,
“column5”,
“column6”,
“column7”,
“column8”,
“column9”,
“column10”,
}
session.Select(strings.Join(selectFields, “,”))
“`
※ `session` の部分には、 エンジンの起動などを行なっているという、都合の良い想定です(笑)

# 解説

あまり解説することもないですが、公式の使い方だと、

“`golang
session.Select(“column1”, “column2″,”column2”)
“`

といった感じになるかと思います。
これは、カラムが3つぐらいまでなら、読みや

元記事を表示

[Golang]Uint64をstringに変換するにはstrconv.FormatUint関数が便利な件

# はじめに

ググっていて、「intをstringにキャストする」…といったパターンはたくさん情報があったのですが、「uint64をstringにキャストする」といった情報が少なかったので、共有したいと思います。

# いきなり結論

“`golang:要所
s = strconv.FormatUint(i,10)
“`

i : `uint64` 型
s : `string` 型
コピペで使える全体のコードは以下の通りです。

“`golang:全体
package main
import(
“strconv”
“fmt”
)

func main(){
var i uint64 = 10

s := strconv.FormatUint(i,10)

fmt.Println(s +”abc”) // => 10abc
“`

# 解説

1行目で `uint64`で指定した変数`i` ですが、 `s := strconv.FormatUint(i,10)` ここで、string型にキャストされ `s` に代入されています。
最後に、 `abc` と足し算す

元記事を表示

Goにおける最適なディレクトリ構成はもはやこれだと思う

## はじめに

さも自分で考え付いたかのようなタイトルですが、『Standard Go Project Layout』と『ヘキサゴナルアーキテクチャ』を取り入れただけです・・・:pray_tone2:

大げさなタイトル1回やってみたかった・・・

簡単に記事の趣旨を説明すると、「Goっぽくて」・「DDDもやりやすくて」・「ヘキサゴナルアーキテクチャなので柔軟」なサンプルプログラム作ってみたよって記事です。

トランザクション周りも取り扱います。

## 『Standard Go Project Layout』とは

↓これです。
[Standard Go Project Layout](https://github.com/golang-standards/project-layout)

上記の内容を日本語で簡潔にまとめてくださってる記事もありました。
[Goにはディレクトリ構成のスタンダードがあるらしい。](https://qiita.com/sueken/items/87093e5941bfbc09bea8)

別の記事になりますが、こちらもとても参考になりました。
[Pra

元記事を表示

go langで超簡単な本の感想投稿機能を作成した

“`
番号を選んでください!
[1]レビューを書く
[2]レビューをみる
[3]アプリ終了

“`

ターミナルでこんな表示が出てきて
1を押すと、本のtitle,genre,revieを書く。
2を押すと、保存した本のtitleなどがみれる仕様。

完成コード

“`

package main
import (
“fmt”
“bufio”
“os”
“strconv”
“log”
)

func input()(result string) {
//scannerを使う
scanner := bufio.NewScanner(os.Stdin)
scanner.Scan()
result = scanner.Text()
return result
}

type R1 struct {
title string
genre string
review string
}

func write_review() map[string]string{

fmt.Println(“本のタイトルを入力”)
title := input()
fmt

元記事を表示

slice のメモリ容量比較サンプル

## このページについて

go でよく話題に上がるsliceで事前に容量を渡す場合とそうでない場合で
どの程度パフォーマンスに差分があるか簡単に見れるように試してみました。

## 内容

**サンプルコード**

“`go:main.go
package slices

func AllocationSlice(from []string, to []string) {
for _, item := range from {
to = append(to, item)
}
}
“`

**ベンチマークコード**

“`go:main_test.go
package slices

import “testing”

func StrSlice(num int) []string {
re := make([]string, num, num)
for idx, _ := range re {
re[idx] = “a”
}
return re
}

func BenchmarkAllocationSlice(b *testing.B) {
type a

元記事を表示

AtCoder Beginner Contest 145 参戦記

# AtCoder Beginner Contest 145 参戦記

## A – Circle

1分で突破. 書くだけ.

“`python
r = int(input())

print(r * r)
“`

## B – Echo

3分半で突破. 長さが偶数であることを確認することを忘れなければいいだけ.

“`python
from sys import exit

N = int(input())
S = input()

if N % 2 == 1:
print(‘No’)
exit()

if S[:N // 2] == S[N // 2:]:
print(‘Yes’)
else:
print(‘No’)
“`

## C – Average Length

8分で突破. すべての組み合わせの距離の合計を平均を取ればいいのかなって思って書いたら入力例が通ったので提出したら AC 出たけど、解説を読むとまぐれで通っただけかってなった.

“`python
from math import sqrt

N = int(input

元記事を表示

AtCoder 第二回全国統一プログラミング王決定戦予選 参戦記

# AtCoder 第二回全国統一プログラミング王決定戦予選 参戦記

## A – Sum of Two Integers

2分で突破. 書くだけ. ARC の A 問題ってこんなに簡単だっけかと混乱した.

“`python
N = int(input())

print((N – 1) // 2)
“`

## B – Counting of Trees

68分半で突破. WA 6個. WA2個が中々消えずに WA を重ねてしまった. その2個は0が複数あるやつだった…….

“`python
from sys import exit

N = int(input())
D = list(map(int, input().split()))

if D[0] != 0:
print(0)
exit()

c = {}
for i in D:
if i in c:
c[i] += 1
else:
c[i] = 1

if c[0] != 1:
print(0)
exit()

result =

元記事を表示

Goで簡単なWeb APIを作ってみた

# はじめに
Goで簡単なCRUD操作ができるWeb APIを作ってみました。悩んだところとか勉強が足りないなと思ったところを備忘録として。しょうもないコードでも実際に手を動かしてみて気付くことが多々ありますね…

**GoでWeb APIを作製する方法を解説する記事ではなく、個人的な学習の記録なのであしからず。**

# 結論
– 設計、構成、パッケージやファイル名、関数の命名、関数の切り分け等、そのへんの知識・経験が皆無。 → 「行き詰まったら考える」を繰り返したせいで完成したコードがぐちゃぐちゃ。

– GORMが全然使いこなせない。 → DB操作するのに毎度構造体を作り直したり、値を入れ替えたりして無駄が多すぎる。 DB操作用の関数を切り分けようとしたときにどう分ければいいのか全くわからない。 次はもっと薄めのORMも試してみたい。

全てはアウトプットが足りないということ。
[コードはこちら](https://github.com/bschafh/todoapi)

# ディレクトリ構成
“`
todoapi
├── README.md
├── controllers

元記事を表示

frontendに「nuxtjs/apollo」、backendに「go+gqlgen」の組み合わせでGraphQLサービスを作る

# お題
簡易ToDoアプリ(と言っても、この記事上では単に「ToDoの新規登録」と「登録済みの全ToDoの表示」しか出来ない)を題材として、表題の組み合わせでGraphQL通信ロジックを書くとどんな感じになるかを確認してみる。
※今回はRDBを使った永続化などはしないで、バックエンドからは固定値を返す。

# 前提
Nuxt.jsやGoについては、個人ないし会社での開発経験があり、フロント->サーバの接続は(例えば)Axiosなど使ってRESTでやってたけど、GraphQLに変えてみたいという人が対象。
ただ、「そもそもGraphQLとは?」とか「RESTと比べたメリット・デメリットは?」みたいなことは書かない。(既に記事がいっぱいある。)

また、お題に則り最小限の構造で実装する。
巷で流行りのClean ArchitectureやDDDに即したパッケージ構成とかは考えない。
そのへんは、一度↓みたいな記事を書いた。↓でなく、もっといい記事はググればたくさん出てくる。
[Clean Architecture by Golang(with Echo & Gorm & wire)](h

元記事を表示

Go (Golang) リリース・サポート期限

# リリース・サポート期限

メジャーリリースは、2つ後のメジャーリリースが出るまでサポートされます。

| Version | Release | Support |
|:——–|:———-:|:——-:|
| 1.13 | 2019/09/03 | Yes |
| 1.12 | 2019/02/25 | Yes |
| 1.11 | 2018/08/24 | No |
| 1.10 | 2018/02/16 | No |
| 1.9 | 2017/08/24 | No |
| 1.8 | 2017/02/16 | No |

# リリースノート

### 1.13
Go 1.13 Release Notes – The Go Programming Language
https://golang.org/doc/go1.13

– Go Module Proxy

### 1.12
Go 1.12 Release Notes – The Go Prog

元記事を表示

【Go】sqlmockでupdated_atやcreated_atなどのtimestampにマッチさせる方法

# 前提

ORMにgormを使っていて、sqlmockでテストを書いている。

# 概要

gormはレコードの更新時にupdated_atカラムを自動で更新してくれる。
sqlmockでテストを書くときに期待するクエリを正規表現で書くが、updated_atはどのような値で更新されるかあらかじめ知ることができないため、期待するクエリと実行されたクエリが不一致となりテストに失敗してしまう。

“` bash:エラー出力
does not match actual [time.Time – 2019-11-15 06:29:27.8173492 +0000 UTC m=+0.006968701]”}
“`

↑の例はupdated_atの期待する戻り値として、time.Now()と指定した結果。

# 方法

“` go:example.go

type AnyTime struct{}

func (a AnyTime) Match(v driver.Value) bool {
_, ok := v.(time.Time)
return ok
}

func TestExa

元記事を表示

goを間違えてogと入力してしまった時に、逆さのGopher君が通り過ぎるコマンド

## 概要
go … って打ちたくて og … って間違えちゃうことごく稀にありますよね?よね?
そんな時にいい感じにtypoを注意してくれる og コマンドを作りました!!

???
[github.com/ramenjuniti/og](https://github.com/ramenjuniti/og)
???

slコマンドみたいなやつです笑

## 挙動(2019/11/16にgif修正)

![ezgif-2-273dbef8bf44.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184505/b0fd6e3d-4341-40a7-e46c-cd5aab0f1e7b.gif)
なんと!逆さまなGopher君が通り過ぎます!ただただ通り過ぎます!

![ezgif-2-a1c5e34657c7.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184505/0f98dfd2-52e5-08bc-aaea-8

元記事を表示

GoのHello Worldで詰まった話

# はじめに

今更ながらgolangに手を出してみることに。
本当にしょうもないミスで詰まったけれど、ググっても答えがパッと見当たらなかったので備忘として残しておきます。
(あまりにもしょうがないミスすぎるせい)

# Goのインストール

https://golang.org/
から、Macなのでpkgでインストール

# 早速Hello World

hello.goファイルを作って

“`go:hello.go
package main
import “fmt”

func main() {
fmt.println(‘hello world’)
}
“`

“`shell-session
$ go run hello.go
./hello.go:5:3: cannot refer to unexported name fmt.println
./hello.go:5:3: undefined: fmt.println
./hello.go:5:15: invalid character literal (more than one character)
“`

たっ

元記事を表示

ClusterAPIの変遷 〜v1alpha1からv1alpha2・v1alpha3へ〜

8月末から9月にかけてClusterAPIを触っていたのですが、それ以降の動向を追っていなかったので、まとめてみようと思います。

良くも悪くも、このプロジェクトはまだalphaリリースのみで、ここ2ヶ月でアーキテクチャのレベルでかなり更新されています。
特にv1alpha1からv1alpha2への変遷について追っていきます。

なお、本記事ではClusterAPIの変更部分に着目していきますので、
基本的な構成については言及しません。詳細については[本家レポジトリ](https://github.com/kubernetes-sigs/cluster-api)や[proposal](https://github.com/kubernetes-sigs/cluster-api/blob/master/docs/proposals/20190610-machine-states-preboot-bootstrapping.md)を参照してください。

# The Cluster API Book

[The Cluster API book](https://cluster-api.si

元記事を表示

OTHERカテゴリの最新記事