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

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

[AWSLambda] GoとRustでも連携がしたい

# [AWSLambda] GoとRustでも連携がしたい
新しいシステムをRustでがりがり書きたいけど、
Line BotのSDKはGoの方がライブラリやノウハウがあったりして、既存のGoリソースも使いたい。
そんなことありますよね。

そんな時はGoとRustをそれぞれLambda Functionでデプロイして連携させてあげれば良さそうです。
(RESTなどで連携しても良いけど、Lambdaの方がちょっとだけ便利、かも)

今回は環境構築とソースコードの連携部分について記載します。

ざっくり機能を書くとこんな感じです。(plantumlが欲しい。。)

|LINE|bot
go lambda||backend
rust lambda|frontend|
|—|—|—|—|—|
|—–> webhook|bot A
bot B|—–> lambda|echo
analyze||
||||get_shop|<-----
REST API|

# プロジェクトとディレクトリ構造
今回はLine Bot

元記事を表示

忘却のgo

使うたんびに毎回「あれ…」ってなってplaygroundで確認しなおす個人的事項をここに
でもどうせまた次も忘れて確認すんだろうな…

### slice操作
https://github.com/golang/go/wiki/SliceTricks
大体ここで困らない

### rand.Intn
0..引数で渡した値「未満」の値になります。関数のコメントに`0..n`って書いてあるからそりゃそうなんですが、`..n`はn未満で`…n`はn以下って割と忘れそうになる表現。

“`go
rand.Seed(time.Now().UnixNano())
for i := 0; i < 10; i++ { fmt.Println(rand.Intn(2)) // 0 or 1 } ``` ### 空文字をsplit rubyだと空文字をsplitすると空配列が返りますが、golangは先頭の要素が空文字である1要素のsliceが返ります ```go str := "" result := strings.Split(str, "@") fmt.Println(re

元記事を表示

[Go] MacでGo言語環境構築

## はじめに

Go言語の環境構築が色々と面倒だった
(特に`$GOPATH`とか`$GOPATH`とか`$GOPATH`とか)ので自分がやった手順をまとめました。
Macで環境構築しましたが、WindowsやLinuxの場合も参考になると思います。

## 環境

* macOS 10.15.4 Catalina
* goenv 2.0.0beta11

## goenvのインストール

[goenv](https://github.com/syndbg/goenv)はPythonでいうpyenvとかNode.jsのnodenvのようにバージョン切り替えができるようにしてくれます。
Homebrewでインストールすると`goenv`の古いバージョンがインストールされてしまったので、
[GitHubリポジトリに記載された方法](https://github.com/syndbg/goenv/blob/master/INSTALL.md)を採用しました。

まずはリポジトリをクローン

“`bash
git clone https://github.com/syndbg/goenv.

元記事を表示

“Standard Go Project Layout” README.mdを読む

# はじめに

Go初学者です。
Goのパッケージ構成に悩みGithubを調べると、ちょこちょこ見かけるこれ
[Standard Go Project Layout](https://github.com/golang-standards/project-layout)

スター数は**1.5万超**です。

もしこれがGoなりのスタンダードであるならば、自身のパッケージ構成の参考になりそうですので調べてみました。

もちろん実際には各プロジェクトや利用用途、採用するデザインパターンなどによってはもっと扱いやすい形があるかもしれませんl
実際私もDDDが好みなので、導入する際はDomainでディレクトリを切り分けたいなと思っています。

# Standard Go Project Layout is 何

以下のGithubリポジトリを指します。
[Standard Go Project Layout](https://github.com/golang-standards/project-layout)

# Cloneして構造を確認

“`
$ find . | sed -e ‘

元記事を表示

複数バージョンのGoを扱う

## 環境

OS: macOS Mojave Version 10.14.6

## 手順

[extra_versions](https://golang.org/doc/install#extra_versions)のまま。

### ソースのダウンロード

[extra_versions](https://golang.org/doc/install#extra_versions)を参照。

“`bash
$ go get golang.org/dl/go1.14
# 配布先は `~/sdk
$ go1.14 download
“`

### 環境変数の変更

“`sh:~/.bash_profile
export GOPATH=$HOME/go
export GOROOT=$HOME/sdk/go1.14
export PATH=$PATH:/${GOROOT}/bin:${GOPATH}/bin
“`

## その他

> GOROOT and GOPATH are environment variables that define this layout. GOR

元記事を表示

【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

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

元記事を表示

OTHERカテゴリの最新記事