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

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

embeded使い方【golang】

# embeded
– golangで継承のようなことをしたいときに使うembeded
– イマイチ理解できなかったのでまとめました。
– Javaなどのオブジェクト指向言語の継承と同じ使い方をすると`スーパークラスとして初期化する際のエラー`や`オーバーライドできない`などの問題が発生する
– ※キャプチャと本記事のコードとで初期化時の値が異なることがありますが本質的なところは変わらないのでご了承ください。

# embededの例
– まずは構造体に何らかのメソッドを持たせる
– Employees(従業員)とBoss(上司)にしてみる

“`go:main.go
type Employees struct {
name string
}

func newEmployees(n string) *Employees {
e := new(Employees)
e.name = n
return e
}

func (e *Employees) Hello() string {
return “名前:” + e.name // >>
}

元記事を表示

golintのcliの実装を読んでみる

Goでのプログラミングに欠かせない静的解析ツールgolintのソースコードリーディングをしてみました

リポジトリ: https://github.com/golang/lint
(2020/3/1 時点)

# ディレクトリ構成
“`
.
├── CONTRIBUTING.md
├── LICENSE
├── README.md
├── go.mod
├── go.sum
├── golint
│   ├── golint.go
│   ├── import.go
│   └── importcomment.go
├── lint.go
├── lint_test.go
├── misc/
└── testdata/
“`

パッケージが、ルートディレクトリ直下の**lint**パッケージとgolint/以下の**main**パッケージの2つに分かれています

– lint.go
静的解析のロジックはここに書かれています

– golint/golint.go
cliツールの実装が書かれています

– golint/import.go
golint.goで使う補助関数が書かれてい

元記事を表示

データ分析基盤構築入門 サンプルアプリエラー

[データ分析基盤構築入門](https://amzn.to/2TaD1oC)のサンプルアプリケーションを、Dockerで立ち上げる際にエラーが出て、うまく立ち上がらなかったので、色々ソリューションを試しました。

その中で、2020/3/1現在のソリューションを書きます。

## エラー内容

“`shell
$ docker-compose up –build
“`

dockerでelasticsearch fluentd goアプリケーションを立ち上げると、fluentdコンテナの立ち上げでエラーが出ます。

## ソリューション
### 1.fluentdのtd-agent-gemのバージョンをあげる。

`blog-sample/Dockerfile-fluentd`の中身を以下のように変更します。

“`
FROM debian:jessie

ENV DEBIAN_FRONTEND=noninteractive

RUN apt-get -qq update && apt-get install –no-install-recommends -y curl c

元記事を表示

Kotlin vs Go 処理時間を比較してみる

#1. はじめ
最近はどこもかしこもGoばっかり!
SE(笑)で化石のようなJavaを扱った経験を持つ人間としてはKotlinの方がしっくりくるのですが、なんだか肩身が狭いです。

そこで今回はGoとKotlinで同じようなコードを書いてみて処理時間という点でどれだけ差があるか実験してみました。

#2. 内容
・Kotlinはコンパイラでjarにした後、Amazon Corretto8のランタイムで動かす
・Goは公式でリリースされてる最新のものを使用(Go 1.14)

##1回目
・10万の要素を持つ配列に乱数で値をひたすら入れてみる
・とりあえずこれだけ

“`main.kt
import kotlin.random.Random

fun main(args: Array) {

val startTime = System.currentTimeMillis()

var listData: Array = Array(100000){it}
for (i in listData) {
listData[i

元記事を表示

Open状態のファイルに対して、Linuxだとos.Renameに成功するが、Windowsだとエラーになる

# 環境情報

この記事は以下の環境で稼働確認を実施しました。

– Windows
– Microsoft Windows [Version 10.0.19041.84]
– go version go1.13.5 windows/amd64
– Linux
– Ubuntu 18.04 LTS (Bionic Beaver)
– go version go1.13.8 linux/amd64

# 事象

Open状態のファイルに対して、`os.Rename`を呼び出すと、LinuxとWindowsでは結果が異なります。具体的にはLinuxでは`os.Rename`に成功しますが、Windowsではエラーになります。

以下はOpen状態のファイルに対して、`os.Rename`を利用するコマンドです。

“`go:main.go
package main

import “os”

func main() {
fp, err := os.Open(“old.txt”)
if err != nil {
panic(err)
}
defe

元記事を表示

GAE/Go(2nd Gen)でDatastoreモードのFirestoreとFirestoreを使う

# GAE/Goでのデータストア
GAE/GoでのデータストアはCloudSQLか、DatastoreモードのFirestore、Firestore、その他外部サービスを利用する方法が考えられます。(以前は、GAEのAPIにDatastoreがあったのですが、今は、[DatastoreモードのFirestoreを使う](https://cloud.google.com/appengine/docs/standard/go/using-cloud-datastore?hl=ja)ことになっているようです。)この記事では、DatastoreモードのFirestoreを使う方法と、Firestoreを使う方法をまとめておきます。

## 本題に入る前の注意点
DatastoreモードのFirestoreを使うか、Firestoreを使うかは、GCPのプロジェクトでDatastoreを選択した時点で固定されてしまいますので注意してください。(興味本位でやっちゃうと、プロジェクトごと削除するしかなくなってしまう…)

## DatastoreモードのFirestoreを使う。
Datastore

元記事を表示

[Golang] sliceの重複処理を行う、array_unique関数みたいなものを作ってみた (解説付)

# はじめに

Go言語の標準に、PHPでいうところの、`array_unique`みたいな関数が見当たらず、関数にしてみたので共有します。
とはいえ、定番のmap式の重複処理を関数にしただけですが…笑

初学者向けにしっかりめに解説してますので、ツッコミあれば、ぜひコメント欄に書いて頂けると嬉しいです!

# 今日のコード

## コピぺでそのまま使えるコード全文

“`golang
package main
import “fmt”

func main(){
target := []string{“あ”, “い”, “う”, “あ”}

unique := sliceUnique(target)

fmt.Println(unique) // -> [あ い う]
}

func sliceUnique(target []string) (unique []string) {
m := map[string]bool{}

for _, v := range target {
if !m[v] {

元記事を表示

[Golang]slice内で特定の要素があるか調べる、contains関数を作ってみた(解説付)

# はじめに

Golangの標準パッケージで、PHPやJavaScriptでいうところの`contain`関数のようなものがなかったので、作ってみました。
気軽にコピペして使って頂けると嬉しいです。

# 今回のコード

以下、今回共有したい本題です。

## コピペで使えるコード全文

“`golang
package main
import (
“fmt”
“reflect”
)

func main(){
list := []uint64{1, 2, 3} // ここに対象のスライスを入れる
target := uint64(3) // ここに対象の要素を入れる

result, err := contains(target, list)
fmt.Println(result, err) // -> true
}

func contains(target interface{}, list interface{}) (bool, error) {

switch list

元記事を表示

Goのnet/httpの実装をちょっと読んでみる

# はじめに

Goは標準パッケージとしてHTTPサーバが組み込まれており、`net/http` パッケージを用いると簡単にHTTPサーバを動かすことができます。今回は `net/http` パッケージの一部(HTTPサーバの内容)の実装を読むことで、HTTPサーバが動く裏側をざっと見てみたいと思います。困ったら [公式ドキュメント](https://golang.org/pkg/net/http/) を見ましょう。

なお、読んでいるコード Go1.13 のものです。

# Doc

まずざっと公式ドキュメントに書いてあるサンプルとドキュメントを眺めて、仕様をおさらいしておきます。

## `type Handler`

> ハンドラはHTTPリクエストに対してレスポンスを返します。
>
> ServeHTTPはレスポンスヘッダーとデータをResponseWriterに書き込んでからreturnする必要があります。リクエストが終了したことを示すシグナルを返します。ServeHTTP呼び出しの完了後または完了と同時にResponseWriterを使用したり、Request.Bodyを読

元記事を表示

Adafruit Trinket M0でTinyGo

#はじめに
Goで組み込み向けプログラミングができるTinyGoが盛り上がってきているようなので試してみた。
今回実行したのはAdafruit Trinket M0の搭載LEDを利用したLチカ。
#動作環境
* OS: macOS 10.15.3
* Go: 1.13.8
* TinyGo: 0.12.0
* マイコン: Adafruit Trinket M0

#セットアップ
###Go
“`
$ brew update
$ brew install go
“`
###TinyGo
“`
$ brew tap tinygo-org/tools
$ brew install tinygo
$ brew tap osx-cross/avr
$ brew install avr-gcc avrdude
$ go get -u tinygo.org/x/drivers
“`
###BOSSA
[BOSSA](https://github.com/shumatech/BOSSA/releases)からMAC用パッケージをダウンロードしてインストール
#実行コード
“`go:main.

元記事を表示

サードパッケージを使用したGoのアプリケーションをHerokuにデプロイする v2

以前書いた記事がGoのアップデートと共にゴミ記事と化したので別アプローチを記録
[サードパッケージを使用したGoのアプリケーションをHerokuにデプロイする](https://qiita.com/matopenKW/items/d1798a2f60bffdf719a8)

結論から言うとgovendorをやめて、go modulesを使用する

#Goでアプリケーションを作成
Goアプリケーションの作り方は前回の作り方とほぼ同じ

“`:main.go
package main

import (
“github.com/gin-gonic/gin”
)

type User struct {
Name string
Age int
}

func main() {
router := gin.Default()
// css、js などの静的ファイルを読み込む場合。今回は使用しない。
// router.Static(“/assets”, “./assets”)

router.LoadHTMLGlob(“templates/*.html”)

router.

元記事を表示

govendorで依存関係のファイルが取得できないエラーについて

以前、govendorを使用してHerokuにデプロイするやり方を記事にしました。
[サードパッケージを使用したGoのアプリケーションをHerokuにデプロイする](https://qiita.com/matopenKW/items/d1798a2f60bffdf719a8)

12月くらいにまたHerokuにアプリケーションをデプロイしようとした時にエラーが起きた。
書いた記事が1ヶ月でゴミ記事と化した…

## 事象
とりまHerokuのエラーログ抜粋

“`
remote: —–> Fetching any unsaved dependencies (govendor sync)
remote: —–> Running: go install -v -tags heroku .
remote: vendor/github.com/gin-gonic/gin/binding/default_validator.go:11:2: cannot find package “github.com/go-playground/validator/v10” in any

元記事を表示

goenvでGolangのバージョン管理(最新版のGolangを使う)

`golang` を使った開発のため、バージョン管理を導入したときの手順を書きます。

## goenv について

**goenv** は Golang のバージョン管理ツールです。

https://github.com/syndbg/goenv

pyenv や rbenv など、他のバージョン管理ツールと同じようなものです。

## 環境情報

* macOS Catalina 10.15.3
* zsh 5.7.1 (x86_64-apple-darwin19.0)

## goenv インストール

goenv のソースをリポジトリから取得する。

“`console:zsh
$ git clone https://github.com/syndbg/goenv.git ~/.goenv
“`

次は bash の場合 `.bashrc`、zsh の場合 `.zshrc` の設定をしていきます。

## goenv パス設定

`goenv` を使うためのパスを通します。

### .zshrc

“`.zshrc:.zshrc

export GOENV

元記事を表示

Go Basic認証

HTTP Basic認証の概要とGo標準パッケージ`net/http`を用いた実装をまとめる。

## BASIC認証とは

HTTPで定義される認証方式の一つ。
クライアントは、クライアントID(ユーザー名)とクライアントシークレット(パスワード)の組み合わせをコロン “:” でつなぎ、Base64エンコードした値を、Authorizationヘッダーにセットしてサーバーへ送信する。
これをサーバー側は受け取り、事前に登録されたクライアントIDとクライアントシークレットの組み合わせに一致するか検証する。一致した場合は、リクエストを処理する。一致しなかった場合は、ステータスコード401を返却する。
## Go標準パッケージ`net/http`での実装

### クライアント側

“`go:client.go
package main

import (
“fmt”
“io/ioutil”
“log”
“net/http”
“time”
)

func main() {
// クライアント生成
client := &http.Client{Timeout: time.Du

元記事を表示

C++, Go, Julia, Kotlin, Rust, Swift5 で競争

計算が速そうな6つの言語で、競争してみた。

種目は、64bit 整数を固定小数点数として使ったマンデルブロ集合の計算。
マシンは MacBook Pro (Retina, 15-inch, Mid 2015)。つまり、x86-64。

## ソースコード

全部乗せると長いので、一番短くなった Kotlin のを載せる:

“`kotlin:kotlin
fun isMandel(rep: Int, lim: Long, x: Long, y: Long): Boolean {
var zr = 0L
var zi = 0L
for (i in 0 until rep) {
val zrNext = zr * zr / lim – zi * zi / lim + x
val ziNext = zr * zi * 2 / lim + y
val dist2 = zrNext * zrNext / lim + ziNext * ziNext / lim
if (4 * lim < dist2) {

元記事を表示

Go 1.13 以降で発生する 410 Gone への対応

GOPRIVATE環境変数にリポジトリ名を設定する。
下記のような感じで、zshrcとかのシェルの設定ファイルに書く必要がある。

“`
export GOPRIVATE=”github.com/hiko1129/macrotrends”
“`

元記事を表示

golangのormであるxormを使ってみた

# はじめに
– こんにちはRIN1208です。今回はgolangのormであるxormに触れてみたのでそちらについて書いていきたいと思います。

# 実行環境
– DockerCompose
– Goの実行環境 ver.1.13
– VScode(お好みのエディタ)

以上の環境がある前提で書かせていただきます

# コンテナを立てる

“`docker-compose.yml
version: “3”
services:
mysql:
image: mysql:5.6
container_name: some-mysql
restart: always
environment:
– MYSQL_ROOT_PASSWORD=root
– MYSQL_DATABASE=hoge
command: >
–character-set-server=utf8mb4
–collation-server=utf8mb4_general_ci
–innodb_file_per_table

元記事を表示

プログラムの複雑さを下げるため、条件分岐を減らす方法を考える

## はじめに
if分岐を減らすコードの有用性⇒なぜか三項演算子の話に置き換えられるってのをTwitterで見かけたので、実例を挙げてみました。
言語に寄らない知識なので使う言語はなんでもいいのですが、私が今使っているgolangで説明させていただきます。

### なんで条件分岐が少ないと嬉しいのか?
個人的には、頭に優しくなるのが一番のメリットだと思っています。

– 頭に優しい
– どこに分岐があるのかを考える箇所が減る
– 今なんの分岐中なのか?を考える箇所が減る

もう少し客観的な理由をまとめます。

#### 影響範囲の複雑さを減らす

分岐処理がいたるところにあると、分岐処理が増えた時にいたるところに手を入れる必要があります。
しかし、これが分岐を減らして特定の場所に分岐がまとまっていくと、結果分岐に影響するコードの範囲が減ります。
疎結合なコードを作るのは大事ですよね

#### テストの複雑さを減らす
テスト設計、皆さんどうしていますか?
テスト観点には以下があります。

– 中身を気にしないブラックボックステストの網羅性(入力パターンを如何に網羅する

元記事を表示

GoのechoでRESTAPIを作る時にCORSで怒られた時の対処法

フロントエンドとバックエンドでドメインが違う場合、フロントエンドからバックエンドにfetchするとCORSで怒られる。
その際は以下のようにCORSWithConfigミドルウェアを設定してやればいい。

“`server.go
e := echo.New()
e.Use(middleware.CORSWithConfig(middleware.CORSConfig{
AllowOrigins: []string{“http:///*リクエスト送る側のurl*/”},
AllowHeaders: []string{“authorization”, “Content-Type”, “Access-Control-
Allow-Origin”},
AllowCredentials: true,
AllowMethods: []string{http.MethodGet, http.MethodPost},
}))

e.POST(“/login”, login)
e.GET(“/logout”, logout)

e.Logger.Fat

元記事を表示

Prometheus+Grafanaでk8s上のGoアプリケーションのメトリクスを回収して可視化

Prometheus+Grafanaで、k8s上で動かしているGoアプリケーションのMemoryやゴルーチン起動数などのメトリクスを回収し可視化する

# 最終的なグラフ

![](https://user-images.githubusercontent.com/19891114/71416134-8bc93c00-26a2-11ea-813f-195ab8c1bdd7.png)

# 構成図

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129577/6e593532-a986-3347-738b-45420c420773.png)

この記事では、Prometheus, Grafanaもk8s内で動作させます。
メトリクスの回収としては、GoのアプリケーションにPrometheus Exporterを入れてメトリクスを公開し、Promehteusはサービスディスカバリを使って、そのメトリクスを回収という挙動になります。

# 構築

## kubernetesクラスタを立ち上げる

元記事を表示

OTHERカテゴリの最新記事