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

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

Go言語のStruct(構造体)に簡単にタグ付けをするWebアプリを公開しました(ハマったポイント覚書)

## はじめに:成果物の紹介
ようこそ!
かわいいGopher君(Go言語のマスコットキャラ)を用意したので、そちらだけでもご覧ください :innocent:

【URL】
https://go-struct-tags.com

【デモ】
go-struct-tags-demo

機能は以下の通りです。

– 左のインプット欄に`struct`のコードを貼り付け、タグボタンを押すと、タグのフィールド名やオプションをぽちぽちっと編集できます。
– 今のところ`json`と`xml`に対応
– タグのフィールド名は、もともとの変数名をもとに`camelCase`, `snake_case`, `PascalCase`を選んで一括変換します(手入力も可能)
– 追加・仕様変更要望などあればぜひコメン

元記事を表示

Golang用のマイグレーションツール「migu」使ってみた

Goのコードからマイグレーションしてくれるツールないかなあと探していたところ、[migu](https://github.com/naoina/migu)を見つけました。
開発も止まってなさそうなので、とりあえず使ってみることにしました。(2021/2/17時点)

サポートされているDBは「MariaDB / MySQL / Cloud Spanner」です。
開発者の方が基本的にMariaDB/MySQLしか使わないためメンテナンスできないことが理由だそうです。
プルリクをもらったらサポートを考えるそうです。

#### Dockerで環境構築
“` Dockerfile
FROM golang:1.15.6-alpine

ENV GO111MODULE on

ADD . /migu_sample

WORKDIR /migu_sample

RUN apk update && apk add –no-cache git mariadb-dev mysql-client
RUN go get github.com/go-sql-driver/mysql &&

元記事を表示

【Go】ポインタについてまとめてみた

## はじめに
この**記事の対象**は

– ポインタってなんとなく聞いたことあるけど詳しく説明できない
– Goを入門したばかりでポインタの扱い方が分からない

という方を対象としています。
**「Goの変数宣言ってどうするの??」**って方は一旦そちらを学んでからの方が理解できるかと思います!

また、この記事を読んでくださって、もし「認識が違うよ!」「ここ間違ってるよ!」などがあればご教授ください!
よろしくお願いします!

## 出てくるワード
この記事に関係するワードとして、

– 変数
– メモリ
– アドレス
– ポインタ
– ポインタ型
– ポインタ変数
– ポインタ値
– デリファレンス

などが出てきます。
今分からなくても、それぞれ説明するので安心してください!
(知らないワードがいくつも出たら思考停止しちゃいますよね…。)

## 変数とメモリとアドレスの関係
### それぞれどんなものかをざっくり説明すると、

メモリ…データが入ってくる箱のイメージ。
アドレス…メモリを特定する為の住所のイメージ。メモリにデータが格納される時にメモリに付いてくる

元記事を表示

Gravio 4の日付フォーマットはGo言語の形式を使う

Gravio 4のマッピングで、日付をフォーマットしたい時は `DateFormat` という関数を使う。

# デフォルトのフォーマット

例えば、LINEにセンサーからデータ取得したい日付を送る場合、そのままだとデフォルトのフォーマットで送信される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/728a751c-62cd-4473-ba41-8bfe77c2b882.png)

“`:cp.Message
tv.Timestamp
“`

結果はこう。Web APIなんかにJSONで投げるときはだいたいこのままでもいいですが、LINEやSlackに投げるときには味気ない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/08a3beab-a7ec-cfc1-e568-34a21906a067.png)

# 任意のフォーマットに変換する

そういうときに

元記事を表示

【Go Lang】WebFrameWork使ってみた3 iris

# はじめに
Go lang WebFrameWorkを使ってみるの三つ目。
人気ライブラリの1~3位を使ってみることにする。

[【Go Lang】WebFrameWork使ってみた1 Gin](https://qiita.com/y_nomura_CR/items/9858f2c1e4e1b4d2d2d3)
[【Go Lang】WebFrameWork使ってみた2 beego](https://qiita.com/y_nomura_CR/items/1029d6cd1e24d61831f1)
[【Go Lang】WebFrameWork使ってみた3 iris](https://qiita.com/y_nomura_CR/items/d24f243d7b34522626d5)

– Gin
– beego
– iris←今回はコレ

# 公式サイトとか
公式サイト(日本語ないです):https://www.iris-go.com/
github:https://github.com/kataras/iris
ライセンス:BSD 3-Clause

> BSD 3-Clause

これ

元記事を表示

プロキシ環境下でgo getしたい

# What’s?

プロキシ環境下で`go get`して依存モジュールをダウンロードしたい場合はどうしたらいい?と調べてみると、「Gitにプロキシ設定をしたらいい」みたいな情報が見つかるので。

「そうなの?」と思ったので、少し調べてみようかなと。

# go getの説明を見る

`go get`の説明を見てみます。

[Command go / Add dependencies to current module and install them](https://golang.org/cmd/go/#hdr-Add_dependencies_to_current_module_and_install_them)

特にプロキシまわりの話はなさそうです。

コマンドでのヘルプを見てみても、同じですね…。

“`shell
$ go help get
“`

# http(s)_proxy環境変数を使う

Gitでプロキシ設定をしてもいいのですが、`https_proxy`(および`http_proxy`)環境変数を使っても機能します。

“`shell
$ export h

元記事を表示

Go言語でShift_JISのCSVファイルをUTF-8に変換して読み込む

Go言語でShift_JISのCSVファイルを読み込む場合、UTF-8への変換が必要となるので以下のようにして読み込む。

“`go
package main

import (
“encoding/csv”
“fmt”
“io”
“log”
“os”

“golang.org/x/text/encoding/japanese”
“golang.org/x/text/transform”
)

func main() {
f, err := os.Open(“test.csv”)
if err != nil {
log.Fatal(err)
}
defer f()

r := csv.NewReader(transform.NewReader(f, japanese.ShiftJIS.NewDecoder()))
var l []string

for {
l, err = r.Read()
if err == io.EOF {
break
}
if err != nil {
log.Fatal(err)
}
fmt

元記事を表示

Go言語勉強リスト

サンプルとして実装して勉強します。
Goは、シンプルで高速で信頼性の高いソフトウェアを構築するために設計されたオープンソースのプログラミング言語です。

Go by Exampleは、注釈付きのサンプルプログラムを使用したGoの実践的な紹介です。最初の例を確認するか、以下の完全なリストを参照してください。

– Hello World
– Values
– Variables
– Constants
– For
– If/Else
– Switch
– Arrays
– Slices
– Maps
– Range
– Functions
– Multiple Return Values
– Variadic Functions
– Closures
– Recursion
– Pointers
– Structs
– Methods
– Interfaces
– Errors
– Goroutines
– Channels
– Channel Buffering
– Channel Synchronization
– Channel Directions
– Select
– Time

元記事を表示

goのdocker環境をマルチステージビルドを利用して立ててみる

go環境をdockerで構築する際、マルチステージビルドを利用するとコンテナのサイズが小さくなる。各レイヤーごとに処理をわけ、実際に使用するイメージでは必要のない生成物は、それ以前のレイヤーのみが持つように指定することができる。

## マルチステージビルドとは
Dockerfile内にFROM行を複数記述するだけで、ビルドステージを分けることができる。こうすることによって、最終的にイメージに含めたくない内容を除外することが可能になり、その結果、イメージのサイズが小さくなる。

## マルチステージビルドを利用しない場合

“`dockerfile:Dockerfile

FROM golang:1.15.7

COPY . .
RUN apt install -y git tar
RUN go build -o /tmp/app main.go
CMD [ “/tmp/app” ]
“`
“`go:main.go
package main
import “fmt”
func main() { fmt.Printf(“hello world!”) }
“`
“`bash
i

元記事を表示

16rep – DBSQLでNull値をInsertしたりSelectで取得する方法

# どういうシチュエーション?
– 特定のカラムに対してNULLで入れたい場合

# 実際のコード
– [exec を含めないコードサンプル](https://play.golang.org/p/UroXDrFj95M)
– Insertでsample_tableテーブルnum_hogeにnullで入れたい場合そのままですとInsertできません
– db driver側でnullに変えてくれる記述で定義してInsertする必要があります

“` go
package main

import (
“database/sql”
“fmt”
)

func main() {
var sampleID int64
sampleID = 0

sid := sql.NullInt64{} // sql.NullInt64{}型

/*
// ./src/database/sql/sql.goより
// Nullint64は,nullになる可能性のあるint64を表します
// NullStringと同様にスキャン先として使用することができます

元記事を表示

Simple Go debug with VSCode

I’m writing this article out of frustration after trying without success debugging Go on VSCode with [AWS SAM](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/what-is-sam.html) Lambda local. I then changed to a simpler Go debug and it’s enough development at the moment. This proves that [KISS](https://en.wikipedia.org/wiki/KISS_principle) works without a doubt ?.

#Background
What was supposed to be a simple task of setting [step debugger for AWS SAM with Go progra

元記事を表示

【Go Lang】WebFrameWork使ってみた2 beego

# はじめに
Go lang WebFrameWorkを使ってみるの二つ目。
人気ライブラリの1~3位を使ってみることにする。

[【Go Lang】WebFrameWork使ってみた1 Gin](https://qiita.com/y_nomura_CR/items/9858f2c1e4e1b4d2d2d3)
[【Go Lang】WebFrameWork使ってみた2 beego](https://qiita.com/y_nomura_CR/items/1029d6cd1e24d61831f1)
[【Go Lang】WebFrameWork使ってみた3 iris](https://qiita.com/y_nomura_CR/items/d24f243d7b34522626d5)

– Gin
– beego←今回はコレ
– iris

# 公式サイトとか
公式サイト(日本語ないです):https://beego.me/
github:https://github.com/gin-gonic/gin
ライセンス:apache 2.0

bee’go’なんだなあ・・・

# 人気
– st

元記事を表示

SpannerマイグレーションツールRatchetを作りました

Spannerのマイグレーションツール [Ratchet](https://github.com/hiracchy/ratchet) を作りました。

## 背景
プロダクションで使えるSpannerのマイグレーションツールを調査していて、
wrenchが良さそうだったのですが、以下のような問題がありました。

– マイグレーションファイルの名前が連番で作られるため、複数人の開発で競合する
– DMLやパーティション化DMLへの対応がない(現在は、一部対応があるようです)

そこで、それらを解決したシンプルなマイグレーションツールを作りました。

## インストール
[リリースページ](https://github.com/hiracchy/ratchet/releases/latest)からダウンロードしてパスを通してください。

## 使い方
以下のステップで使えます。シンプルに使えるように心がけました。

### 1. マイグレーション用のテーブルを作成する(1回目のみ実行が必要)
“`console
$ ratchet init -p {プロジェクトID} -i {インスタ

元記事を表示

Quicとは何か?

# QUICとは
* QUICとは、Googleが高速化を目指し、UDPソケット上に用意したプロトコルです。
* なぜ、Googleはこのquicを作り出したのかというと、それは多分HTTP/2がTCPソケットの上に実装されたものであるからだと考えられます。
* どうしても、TCPは接続初期に何度か往復した通信をする必要があり、エラーや順序の整列をきちんとするために受信通知を返す必要があります。つまり高機能ではあるが、パフォーマンスへの影響が少なからず起こるということです。

**では、UDPはどうか?**
UDPは、TCPで行われている再送処理や輻輳制御などを取り払い通信回数を減らすことでパフォーマンスへの影響を減らしたプロトコルです。

**では、QUICはどうなのか?**
QUICでは、TCPが行っているようなパケットロス時の再送処理や、輻輳時の制御などを自前で実装しています。
また、TLSの機能を保持しており、シーケンス番号などのデータも隠蔽しています。

**じゃあ、HTTPSでのTCPと変わらないのでは?**
HTTPSでは、TCPのハンドシェイク後にTLSのハンドシェイク

元記事を表示

[Go] net/httpのややこしい関数名・型名を整理する

## 背景

– GoのHTTP通信に使う標準ライブラリnet/httpには、型名や関数名として似た単語がたくさん出てくる。Handler, HandleFunc, Handleなど。
– それらを整理しておきたい!

## net/http.Server

– Goでサーバを立てるにはServer構造体を初期化しなければならない。
– サーバを立てるのに、Server構造体を初期化するというのは、わかりやすい。

“`go
$ go doc net/http.Server

type Server struct {
// Addr optionallu specifies the TCP address for the server to listen on,
// in the form “host:port”. If empty, “:http” (port 80) is used.
Addr string

Handler Handler // handler to invoke, http.DefaultServeMux if nil

元記事を表示

reflectパッケージで構造体情報を取得

# reflectパッケージ
GO言語におけるreflectパッケージですが、
発生遅くありません?

思いついてから実装まで一体何フレかかってんだと。
特にしばらく実装から離れていると、さらに時間がかかりますよね。

そこで、そこらへんを少しずつTipsとしてまとめていければと思ってます。

# 構造体の変数名とタグを取得
“`
package main

import (
“fmt”
“reflect”
)

// 構造体
type Skill struct{
p int64 `tag:”弾拳”`
pp int64 `tag:”烈掌”`
ppk int64 `tag:”烈空脚”`
}

// 構造体情報を出力
func do(I interface{}) {
v := reflect.ValueOf(I)
t := v.Type()
for i := 0; i < t.NumField(); i++ { name := t.Field(i).Name tag := t.Field(i).Tag.Get("tag") fmt.Println("name=

元記事を表示

【Go】文字列を一部置換と全置換する方法

## 準備
文字列の置換には`strings`と言うpackageを使用する為、まずはimportを行います。
https://golang.org/pkg/strings/

“`go:import
import “strings”
// 以下でも良い
import (“strings”)
“`

## 特定の数のみ置換したい場合
1つだけ置換したい場合や2つなど複数置換したい場合は、`replace関数`を使います。
### 軽く説明
“`go
func Replace(s, old, new string, n int) string
“`
第1引数:置換したい文字列
第2引数:置換前の値
第3引数:置換後の値
第4引数:置換したい数(int型)
返り値:置換された結果の文字列
(stringsのReplace関数なので`strings.Replace()`と言う使い方)

### 具体例
“`go:一部置換
var title string = “SSSS.GRIDMAN”
fmt.Println(title) // => SSSS.GRIDMAN

// 1つのみ置

元記事を表示

【Go】文字列から数値への変換、数値から文字列への変換

## 準備
`strconv`と言うpackageを使用する為、まずはimportする。
(`strconv`に変換する為の色々な関数が存在。詳細は下記URL参照。)
https://golang.org/pkg/strconv/

“`go:import
import “strconv”
// 以下でも良い
import (“strconv”)
“`

## 文字列から数値への変換
文字列から数値への変換には`Atoi関数`を使用。

“`go
var str string = “100”
fmt.Printf(“型:%T”, str, str) // => 型:string

// string -> int
var num int
num, _ = strconv.Atoi(str)
fmt.Printf(“型:%T”, num) // => 型:int
“`

`Atoi関数`が変数を2つ(`num`と`_`)を取っている理由

ドキュメントに`func Atoi(s string) (int, error)`と書か

元記事を表示

anyenvでgoの開発環境を構築

## goenvのインストール
“`bash
$ anyenv install goenv

/var/folders/hk/_11v61jd5kn65bw_v55f9fjr0000gn/T/goenv.20210214134326.1521 ~
Cloning https://github.com/syndbg/goenv.git master to goenv…
Cloning into ‘goenv’…
remote: Enumerating objects: 69, done.
remote: Counting objects: 100% (69/69), done.
remote: Compressing objects: 100% (58/58), done.
remote: Total 14402 (delta 15), reused 22 (delta 8), pack-reused 14333
Receiving objects: 100% (14402/14402), 2.61 MiB | 685.00 KiB/s, done.
Resolving d

元記事を表示

絵文字生成する slack コマンド作成

先日、絵文字生成を行なうコマンドとサーバを作成したため、それに合わせて slack のコマンドを作成してみました。軽いツールの説明と導入手順を書いていきます。

## ツール説明

### 絵文字作成ツール

まず、絵文字作成ツールです。
https://github.com/komem3/wordimg

入力したテキストから絵文字を作成してくれるコマンドラインツールが欲しいと思い作成しました。 Go で作ったのでコマンドとサーバのどちらも作成してみました。サーバの URL は https://wordimg-otho5yxlgq-an.a.run.app/wordimg です。[絵文字ジェネレーター](https://emoji-gen.ninja) のコマンドライン版みたいのを作りたいなというモチベーションで作成しましたが、あちらの完成度が高いのでまだまだ改良の余地があるなと感じております。

ちなみに、`https://wordimg-otho5yxlgq-an.a.run.app/wordimg?text=helloworld` というURLを見ると以下のようになります。更新

元記事を表示

OTHERカテゴリの最新記事