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

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

AWSクレデンシャル情報取得のベストプラクティス(AWS SDK for Go)

# はじめに
ECS(Fargate)でAWS SDK for Goを使ってAWSサービスを操作した際に、最初は勢いで作ったものの本当にこれでいいんだっけ?とモヤモヤしたことがあったので、クレデンシャル情報取得の優先順位とベストプラクティスについてまとめます。

# 結論
いきなりですが、下記がベストプラクティスとされる優先順位です。
詳細について後述します。

“`
1. ECSでアプリを実行している場合、タスクロール
2. EC2でアプリを実行している場合、EC2のIAMロール
3. 認証情報ファイル
4. 環境変数
“`

# Sessionの生成
まず、AWSサービスを使うためのsessionを生成します。
今回はリージョンのみ指定しています。

“`
sess, err := session.NewSession(&aws.Config{
Region: aws.String(“ap-northeast-1”)},
)
“`

# クレデンシャル情報取得の優先順位
上記のようにクレデンシャル情報の指定がない場合、以下の優先順位で認証情報を取得します。

“`

元記事を表示

Go学習 自分用メモ

##はじめに
本記事はProgate Go学習コースでの内容を箇条書きしていたものを記事化したものとなります。
ここ違うよ、とか間違ってるよ、などありましたらお気軽に編集リクエストください、泣いて喜びます。

***

###変数の宣言
– varを使う
– var 変数名 intとかstringとか = 値
– :=で宣言可能
– :=で宣言した場合、型の違う値は入らない
– しっかり=を使って値を入れよう

###条件分岐
ifを使う
if, if else, elseを使う、Railsみたいにelsと省略しないように

“`Go
if hoge >= 値 {
println(“結果1”)
} if else hoge == 値 {
println(“結果2”)
} else {
println(“結果3”)
}
“`

###数値の扱い
%%、||は基本
比較は==、反転で!=
不等式の扱いも基本通り

###switch
お馴染みswitch文
caseの値に一致するものを返す
default常備

“`Go
switch 値{
cas

元記事を表示

golangのユニットテストにおけるprivateとpublic

春の終わりからgolang修行中の身。
趣味以外ではproductionのgolangコードをまだいじったことのない、ひよっこの考察を残してみる。

## golangにおけるprivate / publicの理解
関数名や変数名・定数名の先頭を大文字にすることで別packageから参照可能になるいわゆるpublicな状態が `exported`、
反対に先頭を小文字にして同一package内のみ参照が可能になるいわゆるprivateな状態が `unexported` と理解している。

参考:https://tour.golang.org/basics/3

## testpackageとの出会い

書きかけのアプリケーションに、Linter(golangci-lint)をいれたところ、以下のような指摘に遭遇。

“`shell
$ golangci-lint run ./…
/usecase/hoge_test.go:1:9: package should be `usecase_test` instead of `usecase` (testpackage)
packag

元記事を表示

【Golang】Go言語基礎 構造体について②(埋め込み)

今回は[【Golang】Go言語の基礎 構造体について①](https://qiita.com/Kiyo_Karl2/items/95b718449a6b5940c33a)の続編です。

Goにはクラスという概念がありません。したがって継承という概念もないです。しかし、その代わりに構造体の埋め込み(Embedded)というものがあります。

##早速書いてみる

“`go

package main

import “fmt”

type Vertex struct {
//小文字だと他のパッケージからはアクセスできなくなる。
x, y int
}

func (v Vertex) Area() int {
return v.x * v.y
}

func (v *Vertex) Scale(i int) {
v.x = v.x * i
v.y = v.y * i
}

//構造体VertexをVertex3Dに埋め込む
type Vertex3D struct {
Vertex
z int
}

func (v Vertex3D) Area3D() int {

元記事を表示

TinyGo + `VSCode or Vim (もしくはそれ以外の LSP 対応エディタ)` で gopls 連携する方法

TinyGo 0.15 がリリースされて、 gopls との連携が簡単になりました。
逆に言うと今までは [設定がそれなりに面倒](https://qiita.com/sago35/items/f0b058ed5c32b6446834) でした。

このページでは、 TinyGo 0.15 以降での gopls 連携の方法を `VSCode` および `Vim (もしくはそれ以外の LSP 対応エディタ)` に対して記載します。

注意)
以降、 `wioterminal` というターゲットを例として記載します。
適宜、使いたいターゲットに読み替えてください。

## VSCode

まずは、 `VSCode の Extensions > TinyGo 0.2.0` をインストールします。

![Screenshot from 2020-09-23 21-28-47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63649/584cbb02-0d00-288b-2f44-22a2b7e2f9b1.png

元記事を表示

Golangでgotoキャンペーン開催

## GoTo文とは

プログラミング界のヴォルデモート卿。
記述してはいけないあの構文。
かつて、エドガー・ダイクストラは言った。Goto文は危険である。

[Edgar Dijkstra : Go To Statement Considered Harmful](https://homepages.cwi.nl/~storm/teaching/reader/Dijkstra68.pdf)

50年前以上のことであるが、プログラマなら誰もが聞いたことがあり、
物心ついたときから、Goto文を避けてきたとのではないかと思います。

ですが、比較的新しい(?) Go言語にもGoto文は存在し、標準ライブラリにも使われてますので、
~~Gotoキャンペーンにかこつけて~~、様々な利用例を探っていきたいと思います。

>「構造化プログラミングの観点からgoto文を使うのは望ましくない」ものの「単にgoto文を使わなければ見通しが良くなる」という考えは“Go To Statement Considered Harmful”[4]でも否定されており、goto文の有無のみに固執するのは不毛で

元記事を表示

【GORM】セッションを維持して別処理を呼び出す

共通処理を呼び出してテーブル更新するAPIをGo言語で実装していたときに、共通処理含めてロールバックする方法を作りました。
GORMガイドでは、トランザクションの説明はあるものの、処理をまたいだロールバックについては記載されていないようなので、記事としてまとめてみました。

## 環境

Golang 1.14.4

## 例題

図書館のシステムに、
「利用者が本を借りたとき、利用者の所持数を加算し、書架テーブルの貸出中フラグを1に更新する」処理があったとする。
この処理をコードで表すと以下の通り。

“`go
func bookRent() error {
// リクエスト情報を受け取る。今回は割愛して固定値で指定する。
userID := 1
bookID := 23

// DB接続用の情報を設定する。
DBMS := “mysql”
CONNECT := “root:mysql@tcp(localhost:3306)/testDB”
db, err := gorm.Open(DBMS,CONNECT)

元記事を表示

【Golang】Go言語の基礎 構造体について①

Goにはオブジェクトと呼ばれるものはありません。したがって、クラスという概念が存在しないです。
その代わりに構造体というものがあり、オブジェクト指向のような書き方をすることが可能です。

まずは第一弾として構造体の書き方や初期化の方法などについてみていきます。

②では構造体の埋め込み(オブジェクト指向でいう継承のようなもの。Goには継承はありません。)について書いていこうと思ってます!

#構造体を使ってあれこれ書いてみる
構造体は type と structを用いて書くことができます。

“`go

package main

import “fmt”

type Vertex struct {
X int
Y int //小文字のyにすると外部からアクセスできなくなる
S string
}

func main() {
//構造体の初期化
v := Vertex{X: 1, Y: 2}
fmt.Println(v) // => {1 2}

//構造体のフィールドにアクセス
fmt.Println(v.X, v.Y) // => 1 2

元記事を表示

【Golang】Go言語の配列の基礎

最近Go言語の勉強を初めました!

今回は配列の基礎について復習したので備忘録として簡単にまとめさせていただきます。

##書き方

“`
1. var 変数名 [長さ]データ型
2. var 変数名 [長さ]データ型 = [長さ]データ型{初期値A, 初期値B}
3. 変数名 := […]データ型{初期値A, 初期値B}
“`

“`go

package main

import “fmt”

func main() {
var a [3]int
a[0] = 100
a[1] = 200
a[2] = 300
fmt.Println(a) //=> [100 200 300]

var b [3]int = [3]int{100, 200, 300}
b = append(b, 400) //=> ERROR
fmt.Println(b) //=> [100 200 300]

c := […]int{100, 200, 300}
fmt.Println(c) //=> [100 200 300]
}
“`

配列は長さが決められ

元記事を表示

【初学者向け】Go,LINEBot,AWSLambdaで天気予報のボットを作成!

##概要
初投稿になります。
筆者はJavaをメインで勉強してきて、新しい言語(Go)を学びたい!と思って勉強しました。
その過程で自分が躓いたところや参考にした記事を共有できればと思いました。
他の言語をメインとしてきて、Goを学んでみようかな!と思う人がいて、基礎的な知識を身に着ける参考になれば幸いです。

Goのシステムを作成するにあたって、下記サイトGoの基礎を勉強しました。
[A Tour of Go](https://go-tour-jp.appspot.com/welcome/1)

##成果物
![スクリーンショット 2020-09-07 13.20.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591392/91147490-fb66-1720-5d20-09c64579cd0b.png)

今回作成したコードです。
[天気予報ボット](https://github.com/shinyahashimoto/weather_forcast/tree/master)

##背景 (天

元記事を表示

Goでinterface引数の型がポインタのときに、ポインタの先が示す型を判別する

`reflect.ValueOf`, `reflect.Value.Elem` を組み合わせるとできる。
(この方法はユーザー定義の型ではなく、言語がデフォルトで用意する型を判別するもの)

“`go
package main

import (
“fmt”
“reflect”
)

func check(i interface{}) {
// interfaceのValueインスタンスを取得
v1 := reflect.ValueOf(i)

// ポインタの場合、さらにその先にある型を取得する処理に進む
if v1.Kind() == reflect.Ptr {
// Elemを利用して、ポインタの先のValueインスタンスを取得
v2 := reflect.ValueOf(v1.Elem())
// Kindを呼ぶと、ポインタの先にある型情報が得られる
fmt.Println(v2.Kind())
}
}

type Foo struct {}

func m

元記事を表示

Go+MySQL+Dockerで簡単なCRUDを実装する

## はじめに
先日、「業務で使う予定ないとはいえGoぐらいある程度知っておいたほうがいいよな…」と思い、Goを使って簡単なCRUDを実装してみたのでそのやり方を備忘録としてまとめておきます。

基本的には以下のサイトの内容を組み合わせて少しアレンジしたものになっています。Goの勉強をする上でこれらのサイトには非常にお世話になったのでこちらもご参考ください。
[DockerでGoの開発環境を構築する](https://qiita.com/uji_/items/8c9eda89526abe0ba900)
[Go / Gin で超簡単なWebアプリを作る](https://qiita.com/hyo_07/items/59c093dda143325b1859)
[Go言語(Golang)入門~MySQL接続編~](https://rightcode.co.jp/blog/information-technology/golang-introduction-mysql-connection)
[docker-compose MySQL8.0 のDBコンテナを作成する](https://q

元記事を表示

Gorm(Golang)で、DBから取得したデータ(複数個)にアソシエーションをつける

現在、個人開発中です。
普段はWEBフロントエンドとしてNuxt.jsとFirebaseくらいしか触らないのですが、個人開発でならもっとモダンな技術をガッツリと使いたいという事で、API開発にGolang + Gorm(ORM)で開発しています。

Gormの公式ドキュメントに載ってある、DBから引っ張ってきたデータへのアソシエーションの組み方は↓こうです。
(参照先: http://gorm.io/ja_JP/docs/has_many.html)

“`
db.Model(&user).Related(&emails)
//// SELECT * FROM emails WHERE user_id = 111; // 111 is user’s primary key
“`
データが1つの時であれば↑これでOKなのですが、
userが複数の時には、下記の通りにする事で各々のユーザーへリレーションが組めます。

“`
db.Where(“user_id = ?”, id).Find(&users)
 for i := range users {
 db.Model(users

元記事を表示

Goで画像をグレースケールにするCLIツールを作った

# はじめに
以前、[Goで画像の形式を変換するCLIツールを作った](https://qiita.com/Le0tk0k/items/ef6121956634b374c3eb) を書いたのですが、
今回はGoで画像をグレースケールにするCLIツールを作りました。

pngとjpgの画像をグレースケースへと変換してくれます。

ソースコードはこちら↓

# 機能

| オプション | 説明 | デフォルト |
| —- | —- | — |
| -r | 変換前の画像を削除 | false |

## 使い方

“`
$ # デフォルト、変換前の画像は削除されない
$ ./main sample.jpeg
“`

“`
$ 変換前の画像を削除する
$ .

元記事を表示

gRPC-WebをGoとTypeScriptで実装してみた

## はじめに
最近話題?のgRPC(gRPC-Web)を、フロントエンドはTypeScript、バックエンドはGoで実装してみました。

今回試した内容は、画面でボタンをクリックすると、gRPCでバックエンド処理を呼び出し、戻り値を画面表示するというシンプルなものです。

なお、説明で使用しているサンプルコードは、簡単に試せるよう以下にも上げてあります。
https://github.com/kahia1114/grpc-web-sample

## 前提条件
– 以下で説明するサンプルコードは、Macで動作確認しています。

– 端末に以下のパッケージがインストール済みであることを前提としています。

– Node.js v12.4.0
– protobuf 3.12.4
– protoc-gen-grpc-web
– protoc-gen-go
– Go 1.15

※MacにHomeBrew導入済みであれば、`brew install node protobuf protoc-gen-grpc-web protoc-gen-go go`でインストールでき

元記事を表示

GolangでDynamoDBにListデータを登録する方法

Golangを使ってDynamoDBにListデータを登録する方法を調べた際のメモ。

## 方法
DynamoDBの開発者ガイド([Update Expressions](https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/Expressions.UpdateExpressions.html#Expressions.UpdateExpressions.SET.AddingListsAndMaps))には以下の感じに指定するといけると記載れている。
`L` は `List`の略らしい。

“`
“:hobbies”: {
“L”: [
{ “S”: “家庭菜園” },
{ “S”: “サイクリング” }
]
}
“`

これをGolangで書くと以下のような感じになる。

“`golang
type User struct {
userId string
hobbies []string
}

func appendParams(user

元記事を表示

AWS AppSync(GraphQL)のバックエンドにAWS Lambda(serverless framework) x Golangを使ってみる

AppSync(GraphQL)でバックエンド側でこちょこちょ計算する必要のある機能が必要になり、Lambda(serverless framework)をGolangで書いてみたのでメモ

*serverless frameworkを使うので、前提として[serverless AWS – Credentials](https://www.serverless.com/framework/docs/providers/aws/guide/credentials/)の設定をしている必要がある。

## 導入
Lambdaは[serverless framework](https://www.serverless.com/)を使って管理したいので、以下の手順でGolangのLambdaの雛形を作る。

*`serverless`コマンドは`sls`と省略できる

“`bash
# serverlessフレームワークをインストール
$ npm install serverless -g

# テンプレートを使ってLambdaの雛形を作る
$ serverless create -u htt

元記事を表示

【Golang】Go言語の基礎 結局ポインタって何なの??

Go言語やC言語を学ぶ上で避けては通れないのがポインタです。
プログラミング初学者の入門言語であるRubyやPHPにはポインタという概念がありません。
Rubyから入った僕にはいろんな記事を読んでも???でした!そんな方にもわかるようにここでは解説いたします!

#ポインタとは?
プログラムというのは、メモリの中で読み込まれ、CPUで処理されます。また、僕たちが普段プログラムで使っている変数というのはメモリの中に配置されます。CPUによってメモリの中に配置されている変数の値を処理しているのです。
**ポインタというのは、変数がメモリのどこに配置されているか?という情報(変数の住所)を格納する変数のことです。**

##早速コードを書いてみる
“`go

package main

import “fmt”

func main() {
var n int = 10
fmt.Println(n) // => 10

//アンパサンドを付けることで変数を入れたメモリの住所(正式にはアドレスといいます。)が表示できる。
fmt.Println(&n) // => 0xc000

元記事を表示

JWE(JSON Web Encryption)は2020年現在も危険なのか?

## 概要

* [JOSEは、絶対に避けるべき悪い標準規格である | POSTD](https://postd.cc/jwt-json-web-tokens-is-bad-standard-that-everyone-should-avoid/)
* [JSON Web Encryption (JWE) の解説 – Qiita](https://qiita.com/ono_matope/items/938a98fb111a297b68b9)

いくつかの記事でJWEは避けるべき、脆弱性がある。という指摘があるが、これらが議論されていたのは2017年頃だ。2020年においてまだ該当記事の脆弱性が実際に存在するか調査した結果を記録する。私はJWEのエキスパートではないし、RFC-7516を全て読み込んでもいないため間違っている部分があるかもしれない。もしこの調査結果に対してフィードバックがあれば編集リクエストを送ってほしい。

## 結論

現在は脆弱性は修正され、安全なようだ。脆弱性に対応していないライブラリを使っている場合はもちろん危険なので使用しているライブラリが対応されているか調

元記事を表示

Goで画像の形式を変換するCLIツールを作った

# はじめに
Goで画像の形式変換をするCLIツールを作りました。

– **jpg (jpeg)**
– **png**
– **gif**

の間で相互に変換可能です。

ソースコードはこちら↓

# 機能

| オプション | 説明 | デフォルト |
| —- | —- | — |
| -f | 変換前の画像の拡張子 | .jpeg |
| -t | 変換後の画像の拡張子 | .png |
| -r | 変換前の画像を削除する | false |

## 使い方

オプションに何も指定しなかった場合は、.jpeg → .png への変換になります。

“`
$ ./imgconv sample.jpeg
“`

.png → .j

元記事を表示

OTHERカテゴリの最新記事