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

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

Goをソースからインストールする

Go勉強の手始めに、まずはソースからインストール。

# 環境

– Fedora release 31

# インストール手順

ソースからインストールする際の公式ドキュメントは[こちら](https://golang.org/doc/install/source)。

## ツールチェインの入手

GoのコンパイラツールチェインはGoで記述されており、ツールチェインをビルドするにはGoのコンパイラが必要になる。

Goのコンパイルを行うには、この最初のビルドを行うツールチェイン (ブートストラップツールチェイン) が必要になる。
ブートストラップツールチェインもソースからコンパイルすることができるが、今回はビルド済のバイナリを入手する。

(Goをコンパイルするためにコンパイル済みのバイナリを手に入れるという行為には矛盾を感じるが)
ダウンロードページからバイナリを入手して展開する。

“`bash
$ tar -xvzf go1.14.2.linux-amd64.tar.gz
$ mv go go1.14
“`

環境変数をセットする。Goのコンパイラはツールチェインをビ

元記事を表示

「はじめてのGo言語」でhttpパッケージが動かなかったので、ググってみた

「はじめてのGo言語を読んで、httpパッケージサンプルが動かなかったので、調べてみました。

動かなかった原因はHandelFuncが、ConnではなくResponseWriterを使うようになったからなのかなぁ。

“`http.go
package main

import (
“io”
“net/http”
)

// ResponseWriter is interface as
// Header() Header
// Write([]byte)(int,error)
// iWriteHeder(statuscoe int)

// WriteString is function as
// func WriteString(w Writer, s string) (n int, err error)

// Writer is interface as
// Write(p []byte) (n int, e

元記事を表示

1960~1970年代のC言語の黎明期が良くわからなったので可視化(C言語 vs デニス・リッチー vs UNIX vs ケン・トンプソン)

# はじめに
1960~1970年代のC言語の黎明期流れがよくわからなかったので整理してみた。

# 可視化
時代の流れを調べていたら、Go言語と、ビルジョイ繋がりでJavaも出てきたので、追加しました。
![変遷_C言語と創作者の系譜_2020年4月14日.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/157498/779e779e-1579-224b-5a66-cfad63ca181e.png)

# 結論
– ケン・トンプソンの業績がすごい事が分かった。
– なんだか、限られた数人の天才たちが、世界を引っ張っている気がした。

元記事を表示

【Golang】変数定義、定数

#【Golang】変数定義、定数
Golangの基礎学習〜Webアプリケーション作成までの学習を終えたので、復習を兼ねてまとめていく。 基礎〜応用まで。

“`

package main

import (
“fmt”
)

func main(){
fmt.Println(“変数”)

//変数宣言 明示的な定義
//var 変数名 型指定 = 値
//var i int = 1
//下記、まとめて変数宣言( )で書く
var (
i int = 1
f64 float64 = 1.2
s string = “test”
//2つまとめて変数宣言(同じ型の場合)
t, f bool = true, false
)

//変数宣言して値を入れない場合、初期値が入る
var ii int

//ショートカット変数 暗黙的な定義
//明示的な定義に対して、型指定の必要がないという特徴を持つ。
//var 型指定が不要になる
//関数内のみ宣言可能
//関数外ではvarで変数宣言する
//自動で型を入れ

元記事を表示

【GO】echoでJWT認証のAPIサーバーを構築した

## ルーティング

“`main.go

func main() {
e := echo.New()
// 通常のルーティング
e.GET(“/articles”, GetArticleList)
// JWT認証が必要なパスをグループ化※
r := e.Group(“”)
r.Use(middleware.JWTHeaders())
r.GET(“/user”, GetUserInfo)
r.POST(“/articles”, CreateArticleInfo)
}
“`

`r := e.Group(“”)`でJWT認証が必要なパスをグループ化しました。

`r.XXX`と書いたパスでAPIコールした場合は、JWT認証をすることになります。

例えば、`r.GET(“/user”, GetUserInfo)`のところでは、APIコールする時にリクエストヘッダにJWTを突っ込んであげて認証するという実装が必要になりますね。

フロントエンド側の実装は以下にまとめました。

参考:https://qiita.com/arthur_foreign/

元記事を表示

Go言語でかな文字をローマ字(ヘボン式)に変換するライブラリを作った

# はじめに
[gojaconv](https://github.com/kotaroooo0/gojaconv)というGo用の文字列変換ライブラリを作成しました。
かな文字をローマ字(ヘボン式)に変換します。

“`go
import “github.com/kotaroooo0/gojaconv/jaconv”

hebon := jaconv.ToHebon(“おはよう”)
fmt.Println(hebon)
// Output: ohayo

hebon = jaconv.ToHebon(“こんにちは”)
fmt.Println(hebon)
// Output: konnichiha
“`

入力に対して、ローマ字に直して処理したい場合に処理するものが見当たらなかったので自作しました。例えば、僕はTwitterBotを作成しており、リプライのテキストをローマ字文字列集合との類似度を計算したい場面に遭遇しました。その場合、リプライのテキストが元々ローマ字であれば問題ないですが、そうとは限らないのでこのライブラリを使いローマ字に変換することで解決しました。

ちなみにテス

元記事を表示

GitHubプロジェクト(カンバン)をターミナルで確認するツールを作ってみた

## はじめに
仕事でGitHubプロジェクト(カンバン)を利用しており、Terminalで閲覧したかったため、作成してみました。
Organizationに紐づいているGitHubプロジェクトにはまだ未対応ですが、今後対応する予定です。
リポジトリは[こちら](https://github.com/shuntaka9576/kanban)。

## どんなツール?
例として`microsoft/vscode`のGitHub Projectを本ツールでターミナル上に表示してみます。
image.png

コマンドは下記のような形で以下を指定します。
`repo`オプション(必須): リポジトリOWNER/リポジトリNAME
`search`オプション: プロジェクト名(デフォルトで1番目が選択される)

“`b

元記事を表示

【Go】ジョットさんいらっしゃーい

## JWTの復習
– Json Web Tokenの略で**ジョット**と読む
– このトークンでクライアント&サーバー間で認証できる

### 重要な要素
以下3つです。
>JSON Web Token(以下JWT)は大きく分けて3つの属性に分割できます。ヘッダー、ペイロード、署名の3つです。
[JSON Web Tokenを完全に理解する – Qiita](https://qiita.com/k_k_hogetaro/items/0c97f42ecb8207767db2) より引用

#### ヘッダー
アルゴリズムとトークンの種類を記載します。

“`
{
“alg”: “HS256”,
“typ”: “JWT”
}
“`

#### ペイロード
実際に受け渡したい値です。

“`
{
“address”: “Wakayama”,
“admin”: true,
“exp”: 1589091168,
“iat”: “2020-05-09T15:12:48.40203+09:00”,
“name”: “yoyoyo”,
“sub”: “5454

元記事を表示

golangci-lintをTUIから操作する

## TL;DR

![golintui.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137903/47500355-f20c-1a92-16a4-f0f387df81a6.gif)
「linterの選択〜コード修正まで」を一貫して行えるTUIツールである[golintui](https://github.com/nakabonne/golintui)を作った話。

## はじめに
Go言語の好きなところは?と聞かれたら、いくつか理由がありますが「linterを作りやすいこと」は間違いなく上位に入ります。Go言語が提供する強力かつシンプルなAPIのおかげで数々のlinterが乱立しているわけですが、[golangci-lint](https://github.com/golangci/golangci-lint)を使うことでそれらをまとめて実行することが可能です。
そのgolangci-lintを直感的に扱えるTUIツールを作ったので、本記事ではそのツールの紹介をしたいと思います。

## モチベー

元記事を表示

【Golang】パッケージのインポート

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

“`
//package
package main

//標準パッケージ(ライブラリ)
//内部(自分のsrc)=ライブラリ
//それ以外=パッケージ 特に違いはない
//公式ドキュメントにパッケージ一覧がある https://golang.org/pkg/
//import “fmt”
//import “time”

//独自ライブラリ
//GOPATH/src 以下にライブラリ用フォルダを作成する。
//GOPATHに無いとimportできない

//importしたパッケージは使用しないとエラーになる
//複数の場合()で囲んだほうがいい
//import()
import (
“fmt”
“time”

//読み込む アルファベット順にする。自分のパッケージと、標準と分ける。
//Aproject
// |- Alib – a.go
// | |-under – b.go
/

元記事を表示

[Golang] Golangの設計で気を付けている事

Golangの設計の際に個人的に気を付けている事をメモしておきます。

比較的大きめなWeb Applicationがターゲットです。小さなツールだとまた違うかもしれません。
他にも「私はこんなことに気を付けています!」的な情報歓迎します!

Golangの設計指針というと、Clean Architectureが独り歩きしていて、具体的な指針がない印象です。
そういうモノがもっとあるといいな、と個人的に思います。

# 1. 構造に関するもの
## 1-1. Clean Architecture

もちろんこれ。Golangの標準構成の指針です。パッケージ構成、インターフェースの使い方、パッケージ間の依存関係など、必要な事が書かれていますね。

## 1-2. インターフェースによる依存

Golangモジュール間参照は必ずインターフェースを使いましょう。
Clean Architecture的にも必須なのはもちろんですが、単体テストでモックに差し替える事ができなくなります!

## 1-3. DI

モジュール間参照は必ずモジュールのコンストラクタで渡せるようにします。
そして、ma

元記事を表示

golang やってみた mainに引数を入れつつ go routineを入れてみた

mainにコマンドライン実行時に引数を与えるには、flagを使う。
何も指定しないと、Stringの配列で取得されるので、数字をとるなら、strconvで型変換が必要だった。
引数に、引数名を指定できるので、その場合は型も指定できる。

go routineで、先に終わったものをselectで取得するようにしてみた。
単純な計算なので、先に始めた方が先に終わるのかな。
go routineの前後を入れ替えると、先に終わるのが変わる。

“`
package main

import (
“flag”
“fmt”
“strconv”
)

func main() {
flag.Parse()
x_arg, _ := strconv.Atoi(flag.Arg(0))
chan_x := make(chan int)
chan_y := make(chan int)
go func()

元記事を表示

【Golang】Print系関数について調べてみた

#【Golang】Print系関数
Golangの基礎学習〜Webアプリケーション作成までの学習を終えたので、復習を兼ねてまとめていく。
基礎〜応用まで。

“`
package main

import (
“fmt”
“os”
)

func main(){
fmt.Println(“表示”)
//標準とfmtライブラリの違い

//標準
print(“Hello”)
//改行が入る
println(“Hello!”)

//fmtライブラリ
//fmt標準
fmt.Print(“Hello”)
//改行
fmt.Println(“Hello!”)

//Fprint系 書き込み先指定
//Stdoutは標準出力に指定
fmt.Fprint(os.Stdout, “Hello”)
fmt.Fprintf(os.Stdout, “Hello”)
fmt.Fprintln(os.Stdout, “Hello”)

//Sprint系 出力ではなくフォーマットした結果を文字列で返す。変数に代入時など
fmt.Sprint(“Hel

元記事を表示

GoでSQL叩く時のライブラリまとめ 2020

#はじめに

標準ライブラリdatabase/sql(https://golang.org/pkg/database/sql/)
以外のGoのSQLライブラリの紹介
##sqlx
https://github.com/jmoiron/sqlx
生のSQLを書く必要があるが、学習コストが少なめ。
構造体へのマッピングと名前付きパラメータに対応している。

##squirrel
https://github.com/Masterminds/squirrel
squirrelはクエリビルダ。
生のSQLを書く必要がなく、SQL構文を書くようにコードをかける。
学習コストもあまり多くはない。主観だが、、

##gorm
https://github.com/jinzhu/gorm
ORMマッパーのgorm
オブジェクト間のリレーションをきちんと解釈してくれる。
goのライブラリの中では最もORMっぽい。
多機能すぎて、学習コストが高いのがたまに傷。

##gorp
https://github.com/go-gorp/gorp
ORMぽいgorp
ExecはAPIがあるが、基本的には生のSQL

元記事を表示

GoでDBのトランザクション処理を書いてみた

今回は、Goでトランザクション処理を書いてみます。

“`go

import (
“database/sql”
“log”
)

func withTransaction(ctx context.Context, db *sql.DB, txFunc func(*sql.Tx) error) error {
tx, err := db.BeginTx(ctx, nil)
if err != nil {
log.Println(err.Error())
return err
}
defer func() {
if p := recover(); p != nil {
tx.Rollback()
panic(p) // re-throw panic after Rollback
} else if err != nil {
log.Println(err)
tx.Rollback()
} else {
err = tx.Commit()
}
}()
err = txFunc(tx)
return err

元記事を表示

GoでDFSを書く(ABC161 D – Lunlun Numberを解く)

# はじめに
唐突ですがGoで競プロコードはどう書くのかなと気になったのでやります.
**Goが好きなので.**
競プロ経験者だけれどGoは知らない人がこの記事を読んで「Goってこんな感じなんだ~」って流し見してくれれば嬉しいです.
## 注意
ぼく自身,競技プログラミングは弱く,かつ普段はC++を使っているので最適でなく助長な記述等になっているかもしれませんがご容赦ください.あくまで雰囲気を感じてもらえたらとおもいます.ちなみにこの問題が初めてのGoでのACになりました.また,DFS自体についての解説,問題の解説は行っていません.

#やる
問題は[ABC161D – Lunlun Number](https://atcoder.jp/contests/abc161/tasks/abc161_d)を解きます.
この問題の選定理由は特にないです.ここ最近でDFS使って解けるからって所でしょうか(ABC165-Cがありますが…)
早速ですが解答コードを先に見せてから解説(?)していこうと思います.

“`golang
package main

import (
“fmt”

元記事を表示

パッケージの分け・呼び出し

## パッケージを作る
ディレクトリを作成してgoファイルを作成
ファイル名はパッケージの役割がわかるように一致させるのが好ましい

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434376/cc94320b-2f62-2366-af75-cdf3a1b2a96a.png)

“`golang:greeting/hello.go
//パッケージはディレクトリ名
package greeting

//呼び出しができるように大文字から始める
func Do() string {
hello := “Hello for greeting”
return hello
}

“`
“`golang:greeting/sub/sub.go
package sub

func Sub() {
println(“sub func”)
}
“`

## 呼び出し方法
“`golang:main.go
package main

import (
//importはプロジェクト名から

元記事を表示

aws-sdk-goでFargateタスクを実行する

# 背景
GolangのSDKからFargate起動タイプのECSタスクを起動したかったが、意外と情報が無かったのでまとめます。

# 検証環境
– goバージョン
– go version go1.14.2 darwin/amd64
– OS
– macOS Catalina バージョン 10.15.1

# コード
“`golang
package main

import (
“fmt”
“github.com/aws/aws-sdk-go/service/ecs”
“github.com/aws/aws-sdk-go/aws”
“github.com/aws/aws-sdk-go/aws/awserr”
“github.com/aws/aws-sdk-go/aws/session”
)

func main() {
svc := ecs.New(session.New(aws.NewConfig().WithRegion(“ap-northeast-1”)))
input := &ecs.RunTaskInput

元記事を表示

Go言語でMysql操作

# 必要ライブラリのインストール

https://github.com/go-sql-driver/mysql
のライブラリーをインストールする。

“`
go get github.com/go-sql-driver/mysql
“`

# フォルダ構成

“`
/
├── main.go
├── mysql
│ └── mysql.go
└── sqlscan.go
“`

# 個別ソース

“` golang:main.go
package main

import (
“fmt”
“math/rand”
“strconv”
“time”

_ “github.com/go-sql-driver/mysql”
)

const dbuser = “root”
const dbpassword = “root”
const conecttype = “tcp”
const ipaddr = “127.0.0.1”
const port = “33060”
const databs = “my_database”

func main() {
var e

元記事を表示

Golang勉強メモ①環境構築

# 環境
Go:1.14.2
OS:Mac
git:2.20.1 (Apple Git-117)
エディタ:VisualStudioCode

Go言語のIDEとしては、他にGolandが有名だが、
一旦はフィジ確認程度で、VisualStudioCodeで不満なく使用できそうなので
VisualStudioCodeを選択。

# Go本体のインストール
下記からApple MacOS向けの最新版(1.14.2)のモジュールをインストール。
https://golang.org/dl/
ダウンロードが完了したらインストーラーが起動するので、
画面の指示に従いインストールする。
インストール完了後、ターミナルを開き`go -version`と入力し
下記のように表示されたらインストール成功。

“`
$ go version
go version go1.14.2 darwin/amd64
“`

# パスの設定
`go env`コマンドでgoの環境変数の設定確認ができる。
今回、デフォルト設定でインストールしたところ、下記の通り設定されていた。

“`
$ go env
GO11

元記事を表示

OTHERカテゴリの最新記事