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

Go関連のことを調べてみた2020年06月08日
目次

【Golang】標準パッケージ time

#【Golang】標準パッケージ time
Golangの基礎学習〜Webアプリケーション作成までの学習を終えたので、復習を兼ねてまとめていく。 基礎〜応用まで。

“`
/*
https://golang.org/pkg/time/

const (
ANSIC = “Mon Jan _2 15:04:05 2006”
UnixDate = “Mon Jan _2 15:04:05 MST 2006”
RubyDate = “Mon Jan 02 15:04:05 -0700 2006”
RFC822 = “02 Jan 06 15:04 MST”
RFC822Z = “02 Jan 06 15:04 -0700” // RFC822 with numeric zone
RFC850 = “Monday, 02-Jan-06 15:04:05 MST”
RFC1123 = “Mon, 02 Jan 2006 15

元記事を表示

Golang ポインタを用いるメリット

## ポインタを用いることのメリット

1. ポインタを引数に渡すことで複数の関数間で同じオブジェクトを扱うことができ、そのオブジェクトに対して操作を行うことができる
2. ポインタは比較的に軽く(8byte=64bit)ただのメモリアドレスのため、ポインタを使って大きな構造体を引数に渡すことも可能になる。もし値渡しを行っていると、相対的にさらに大きなシステムリソース(メモリや時間)を毎回のコピーで消費することになる。そのためGolangでは構造体を渡す際はポインタを使うことが推奨されている
3. Go言語のchannel、slice、mapの3つの型はメカニズムを実現するポインタのようなものであるため、直接渡すことができ、アドレスを取得してポインタを渡す必要はない(注:もし関数がsliceの長さを変更する場合はアドレスを取得し、ポインタを渡す必要がある)

元記事を表示

Azure SDK for GoのGitHubのREADMEの日本語訳をv43.0.0に最新化

Azure SDK for GoのGitHubのREADMEを日本語訳していたものを2020年6月2日にリリースされた[v43.0.0](https://github.com/Azure/azure-sdk-for-go/tree/v43.0.0)の内容で最新化しました。

– [GitHub – qt-luigi/azure-sdk-for-go-docs-jp: Microsoft Azure SDK for Goの日本語訳 (original: https://github.com/Azure/azure-sdk-for-go)](https://github.com/qt-luigi/azure-sdk-for-go-docs-jp)

初回の v8.0.1-beta 以来、今回で2回目の更新です。

この活動には元ネタがあって、以前 @ayatokura さんがVSCodeがリリースされる都度、リリースノートの日本語訳をGitHubに公開されていたのを見て「これはよいかも!」と私も始めてみたものです。

– [GitHub – ayatokura/JP-VSCode-Docs

元記事を表示

[Go] ファイルの読み込み方法

ファイルの読み込む方法が色々あったので、まとめる

## 前準備: `sample.txt` の作成
https://www.lipsum.com/feed/html から:

* 5 paragraphs
* 417 words
* 2777 byte

の Lorem Ipsum 文字を取得し保存しておく。
この `sample.txt` を読み込んでいく

## `ioutil.ReadFile` で一括読み込み

* シグネチャ: `func ReadFile(filename string) ([]byte, error)`

一番簡単に読み込める。
ただ、一度に全部読み込んでメモリに入れるので、ファイルが大きい場合にはお勧めしない。

“`go
func main() {
data, err := ioutil.ReadFile(“./sample.txt”)
if err != nil {
log.Fatal(err)
}

fmt.Println(string(data))
}
“`

## `os.Open` 後に `ioutil.ReadAll` で

元記事を表示

Go + Nuxt + GraphQLで簡単カンバンアプリチュートリアル on docker-compose(フロントエンド編)

## はじめに
* Go/Vue/GraphQL初学者が学習用にCRUD操作のできるアプリを作ってみた
* サーバーサイド編とフロントエンド編に分けてその手順を紹介
* ざっくりとした構成は
* サーバー(Go + gqlgen)
* フロント(Nuxt + Apollo)
* データベース(MySQL)
* ORM(gorm)
* 開発環境(docker-compose)

## 完成イメージ
![タイトルなし.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/366929/a07236a8-2412-38fa-ade6-f112fc8fa786.gif)

※ タスクの並び順は操作できません

## 関連リンク
* [ソースコード](https://github.com/MrFuku/kanban-go-nuxt-graphql)
* [サーバーサイド編](https://qiita.com/iPzYN2gLSV2HeSS/items/3062b753bde7e93085b1)

#

元記事を表示

Go + Nuxt + GraphQLで簡単カンバンアプリチュートリアル on docker-compose(サーバーサイド編)

## はじめに
* Go/Vue/GraphQL初学者が学習用にCRUD操作のできるアプリを作ってみた
* サーバーサイド編とフロントエンド編に分けてその手順を紹介
* ざっくりとした構成は
* サーバー(Go + gqlgen)
* フロント(Nuxt + Apollo)
* データベース(MySQL)
* ORM(gorm)
* 開発環境(docker-compose)

## 完成イメージ
![タイトルなし.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/366929/a07236a8-2412-38fa-ade6-f112fc8fa786.gif)
※ タスクの並び順は操作できません

## 関連リンク
* [ソースコード](https://github.com/MrFuku/kanban-go-nuxt-graphql)
* [フロントエンド編](https://qiita.com/iPzYN2gLSV2HeSS/items/d8d6bfebbbd0ef88a310)

##

元記事を表示

gobuffaloのベーシック認証で401を返す最小の方法

# 公式ページを基に実装すると
– こちらの[公式ページ](https://github.com/gobuffalo/mw-basicauth)を基に実装すると、失敗時にhttp500が返却される。
– 外部向けサイト等であれば、これで良いと思われる。
– 但し、社内システム等で、一回失敗するとブラウザ再起動だと面倒。

# リトライ出来るようする
– 以下は例です。

“`
auth := func(c buffalo.Context, u, p string) (bool, error) {
if u == “username” && p == “password” {
return true,nil
}else{
c.Response().Header().Set(“WWW-Authenticate”, `Basic realm=”Basic Authentication”`)
return false,c.Error(http.StatusUnauthorized, errors.New(“Unauthorized”))
}
}

app.Use(basic

元記事を表示

ゴルーチン⑧DefaultとSelection

#ゴルーチン⑧DefaultとSelection
Golangの基礎学習〜Webアプリケーション作成までの学習を終えたので、復習を兼ねてまとめていく。 基礎〜応用まで。

“`
package main
//Default Selection と for break
//for select ループから抜ける

import (
“fmt”
“time”
)

func main() {
//time.Tick,After 時間のchannelを返す
tick := time.Tick(100 * time.Millisecond)
boom := time.After(500 * time.Millisecond)

//名前はなんでもいい
OuterLoop:
for {
//3-1 あまり良くない例だが
//isBreak := false
select {
//1
//<- tick 変数がいらない場合はこのように書ける case <- tick: fmt.Println("1秒") case <- boom:

元記事を表示

[golang] 並行起動した全 goroutine の終了を待ち受ける。(1 goroutine でエラー発生後、後続の goroutine 実行を止める。)

# お題
例えば、以下みたいな要件をgoで実装する時にこんな書き方にするかなと。

> DBに書き込まれた「注文」情報を cron あたりで定期的に拾って、外部APIコールで「注文」をリクエスト。
> ただし、外部APIは同期でレスポンス返すのに平均 10 秒くらいかかる。
> 「注文」情報は随時DBに書き込まれ、なるべく早く外部APIコールで処理したい。

goで作るアプリは cron で毎分ないし毎 3 分ぐらいな間隔で起動するとして、
1回の起動で(できれば、そのときDBに存在する全ての「注文」をさばきたいけど、仮に100万「注文」あったらマシン落ちるとかなると困るし)並行処理させる goroutine 数は制限する必要がある。
これは channel 使ったセマフォ制御がよく使われる。(使い方自体は別に大したことはなくて、いつも問題になるのは同時並行 goroutine 数をいくつにするか・・・。)
結局このあたりは、毎分ないし毎 3 分で実行する場合、本番の流量でどれくらいDBに「注文」情報が溜まっているかなど計測しながら随時調整していくのだろうけど。。。
(そして、アプリを

元記事を表示

Go初心者がポインタ記号”*”と”&”の使い方をイメージしやすくするためのひとつのエッセンス

# はじめに
Go初心者が混乱しやすい`*`と`&`の使い方のイメージをしやすくするための考え方です。

# 結論
そのエッセンスですが、
__`*`と`&`は、2つの記号で、3つの役割を持つ。__
ということです。

※「そんなん知ってるわ!」という方ももちろんたくさんいると思いますが、私がGoを触りたての頃はこのイメージがちゃんとついておりませんでした・・・。

# どういうことか
`&`については、値が格納されているアドレスを取得する、という1つの役割を持っているのに対し、
`*`については、__型の前に付ける場合と変数の前に付ける場合で2つの役割を持っています。__
下のソースコードを見てもらうと、型の前に付く`*`と変数の前に付く`*`でそれぞれ別の役割になっていることがわかるかと思います。

“`go:main.go
package main

import (
“fmt”
)

func main() {
var n int = 100
var n_address *int // *の1つ目の使い方。型の前に*を付与することで、アドレスの値を代入することができる。

元記事を表示

【Golang】ゴルーチン⑦チャネルのセレクト

#【Golang】ゴルーチン⑦チャネルのセレクト
Golangの基礎学習〜Webアプリケーション作成までの学習を終えたので、復習を兼ねてまとめていく。 基礎〜応用まで。

“`
package main
//channelとselect
//selectを使った受信
//複数のチャネルを使った受信の分岐

//マルチプロセスのよう

import (
“fmt”
“time”
)

func goroutine1(c chan int) {
//無限ループを避ける場合、条件を決め、close()する
//下記、無限ループ
for {
c <- 100 //1秒 time.Sleep(1 * time.Second) } } func goroutine2(c chan string) { for { c <- "groutin2" time.Sleep(3 * time.Second) } } func main() { c1 := make(chan int) c2 := make(chan string) go go

元記事を表示

docker-compose でDBコンテナが起動してからAPIコンテナを起動したい。

docker-composeを使ってapiサーバコンテナとDBコンテナを立てた際に、
起動時のDB接続でコケたので解決した経緯を書きます。

## やりたい事
・docker-composeでdbコンテナとapiコンテナを同時に起動する
・apiコンテナ起動時に、db接続を行う
##

今回のdocker-compose, Dockerfileは以下になります。

“`yaml:docker-compose.yaml
version: ‘3’

services:
db:
image: mysql:latest
container_name: mysql_host
hostname: db_host
ports:
– “3306:3306”
# 初期設定
volumes:
– “./docker/mysql/my.conf:/etc/mysql/my.conf”
# 環境変数
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PAS

元記事を表示

Go でローカルにある JSON を読み込む

## やりたいこと
ローカルにある JSON を Go の構造体として読み込む

## ローカルにある JSON ファイル (sample.json)
“`json

{
“posts”: [
{
“id”: 1,
“title”: “Post 1”
},
{
“id”: 2,
“title”: “Post 2”
},
{
“id”: 3,
“title”: “Post 3”
}
],
“comments”: [
{
“id”: 1,
“body”: “some comment”,
“postId”: 1
},
{
“id”: 2,
“body”: “some comment”,
“postId”: 1
}
]
}
“`

## JSON を struct でどう読み込むか決める

“`go
type Post struct {
ID

元記事を表示

[Go] JSON レスポンスから CSV を作成する

## やりたいこと
JSON のウェブから取得して、ほしいデータだけを CSV に書き出す。

## 手順

### まずは、JSON の中身を確認する
[JSONPlaceholder](https://jsonplaceholder.typicode.com/) というサイトから色々な JSON 提供している。
今回は [ToDo](https://jsonplaceholder.typicode.com/todos) リストを使う。
それでは、JSON の中身を確認。

“`json
[
{
userId: 1,
id: 1,
title: “delectus aut autem”,
completed: false
},
{
userId: 1,
id: 2,
title: “quis ut nam facilis et officia qui”,
completed: false
},
{
userId: 1,
id: 3,
title: “fugiat venia

元記事を表示

DDDを意識しながらレイヤードアーキテクチャとGoでAPIサーバーを構築する

今の現場で初めてDDDに触れたので、よく採用されるアーキテクチャとしてレイヤードアーキテクチャを自分で0から実装してみました。
言語もよくセットで採用されているGoを採用してみました。

# この記事の目的
– 0から実装して体系的にDDDとレイヤードアーキテクチャを学ぶ
– DDDに触れたことがない方にもわかりやすく説明する

# そもそもDDD(ドメイン駆動設計)とは
要約(引用)すると「ドメインの知識に焦点を当てた設計手法」です。

たとえば電子カルテのシステムを例に取ってみます。
電子カルテには患者情報や手術の予定、入院ベッドの空き具合などの概念があると考えられます。
医療関係者ではないソフトウェアエンジニアは実際につかうユーザー(医療関係者)が直面している問題やドメイン(領域)の概念、事象を理解することが必要です。
それらを理解し、ソフトウェアに落とし込む。落とし込み続けることを実践する開発手法です

詳しくはこちらの記事を参照していただければと思います
https://codezine.jp/article/detail/11968

# レイヤードアーキテクチャとは
![

元記事を表示

WinMergeはもう使いたくないというお気持ち表明をツールに

前回の
[Diff+Historyコマンド=hifferで快適なターミナル作業しようぜ](https://qiita.com/ykato/items/ebbebf4a80181bc3841a)
からの派生ツールです。
もっとニッチに機能を絞り込んで軽くした方が良いのかな?なんて思い作ってみました。

# あらまし

リポジトリや、ファイルサーバーを使わない古典的なファイル管理だと
hostsみたいなファイルに.origとか.bak付けたりして同じフォルダに放置されてたりしますね。
~~Excelのなんちゃら_20200605(修正2).xlsxみたいなだめだめファイル管理で普段から癖になってるクソ運用~~

んで、運用で追加依頼が来たりすると日付だけじゃ最新かどうか判断できない、中身を見るしかない場合。
一個ずつ開いて比較してくのはメンドイ&シンドイ。

WinMergeにコピペを繰り返したりしません?で**コピーミスって同じの張り付けてミスったり。。**
で、差分がわかったとこで反映するのもめんどい。
せっかくLinuxのターミナル上でやってるんだから他のツールあれこれ使いたくない

元記事を表示

gobuffaloのテーブル名にはデフォルトで”s”がつく前提になっている

# 結論から
– gobuffaloで使うテーブル名には末尾に”s”がいる。
– 例を言うと「商品」を格納する構造体「product」を実装して、テーブルに格納する場合、テーブル名は「products」である必要ある。※デフォルトでは。

# テーブル名を自分の好きにカスタマイズする方法
– 該当のmodel.goでTableName 関数をオーバーライドする
– 以下は例です。

“`
package models

import (
“encoding/json”
“time”

“github.com/gobuffalo/pop”
“github.com/gobuffalo/validate”
“github.com/gofrs/uuid”
)

// Test is used by pop to map your .model.Name.Proper.Pluralize.Underscore database table to your go code.
type Test struct {
ID uuid.UUID `json:”id” db:”i

元記事を表示

【Golang】ゴルーチン⑥関数から関数に値を渡して処理

#【Golang】ゴルーチン⑥関数から関数に値を渡して処理
Golangの基礎学習〜Webアプリケーション作成までの学習を終えたので、復習を兼ねてまとめていく。 基礎〜応用まで。

“`
package main
// fan-out fan-in
//funcの結果をfuncに渡し、最後に結果をmainに持っていく。

//処理を分けたい時など。func → func でデータを渡す。

import (
“fmt”
)

//15回まわす
func producer(first chan int) {
defer close(first)
for i := 0; i < 15; i++ { first <- i } } //first,secondを引数 //(first <-chan int受信, second chan<- int送信) で明示的にしていると分かりやすい。 func multi3(first <-chan int, second chan<- int) { defer close(second) for i := range first {

元記事を表示

go getしてきたライブラリのコマンドが実行できない場合(例:wire)

# 困ったこと
wireライブラリの説明についてはこちらが参考になります。
[GoのDIライブラリgoogle/wireの使い方](https://user-first.ikyu.co.jp/entry/google-wire)

こちらのライブラリを使うためには、`wire` コマンドを実行する必要があります。

しかし、以下の要領で実行しても `command not found`と言われてしましました。。

“`
$ go get github.com/google/wire
(wire.goを作成)
$ wire
wire: command not found
“`

まあこの時点で間違っているんですけどね。

# 解決方法
以下のように、`cmd/wire`ディレクトリを指定してgo getします。

“`
$ go get github.com/google/wire/cmd/wire
“`

こうすると、`$GOPATH/bin`配下に`wire.exe`が作成されます。(Windows)

# かんそう
`command not found`の時点でパスが通って

元記事を表示

Golandでローカルデバッグしたときに fatal error: ‘stdlib.h’ file not found が出た話

## 概要
Golnadでブレークポイントを設定して、デバッグしたくなったときに、Go Buildの設定をしたら、エラーが出て解消した話

## エラー内容
“`
fatal error: ‘stdlib.h’ file not found
“`

## 解消法
ぐぐったら自分の書いた記事が見つかりました
https://qiita.com/airtanker/items/ccedbfb0b505f7fbab88

Golandのデバッグ時の設定で、環境変数に出力した内容をSDKROOTに設定することで解消できました。

“`
❯ xcrun –sdk macosx –show-sdk-path
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk
“`
こんな感じ
スクリーンショット 2020-06-05 14.12.35.png

  • OTHERカテゴリの最新記事