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

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

GCPを使って、できるだけ楽してGo言語のgoroutineのリークを監視する

## ゴルーチン リーク
Go言語はめちゃめちゃ簡単にゴルーチン(スレッドのようなもの)を作れるのが魅力です。

ゴルーチンはメインフローとは別に切り離されて実行されるので、デッドロックなどでゴルーチンの処理が途中で止まっていても気づかず、「終了したと思っていたが、実は実行中で残っていました」ということがありました。

それ以来、ゴルーチンの起動数を定期的にログに出力して、ゴルーチンのリークが起こっていないかチェックしているのですが、その作業が面倒くさくなってきました。

## もっと楽したい
GCPのCloud Monitoringは主に、GCPの各種サービスの状態モニタリングを行う機能なのですが、アプリの状態モニタリングも行えるので、それを使ってゴルーチンの起動数を監視することにしました。

## 方針
Cloud Monitoringに、Go言語のpprofの値を送るようにして、Cloud Monitoring上でゴルーチンの起動数をグラフ表示します。

プログラムからCloud Monitoringに値を送るには、OpenCensusというオープンソースのライブラリを使うのです

元記事を表示

Goのdepで既に指定済みのbranchと異なるbranchを参照させる方法

### 概要
Goのdepで既にインストール済の依存パッケージに関して、既に指定されているブランチとは別のブランチを参照させるようにする方法についてです。
例えば、既に`master`ブランチを参照する設定になっていたとして、一時的に開発中の`feature/sugoi`ブランチを参照させたい場合には以下のような手順で参照先のブランチを変えることができます。

### Gopkg.tomlで指定済のbranch名を変更する
Gopkg.tomlの該当パッケージのbranch名指定(`branch=xxxxx`)を変更する。

#### 変更前
仮にmasterブランチを参照している状態だとする。

“`
[[constraint]]
name = “github.com/hogehoge/fuga”
branch = “master”
“`

#### 変更前
`branch`の指定を、参照させたいブランチ(ここでは`feature/sugoi`)に変更する。
なお参照させたいブランチは、githubからダウンロード可能な状態(githubにpush済)である必要がある。

元記事を表示

ゆっくりGo vol.1

#前書き
Python、R、Fortran90、C#、Processing、等々さわってきた結論として、

CとFortranからは逃れられない定めにあると悟りました

Goで土台を築くことに……

そして、後輩たちに布教するんだ……ふへっ

#学ぶ上で用意した物
Go Tour
https://go-tour-jp.appspot.com/

スターティングGo言語

#本題
Go Tourのforまで学んで思ったことについて

##導入

@yoskeoka 氏が [WindowsにGo言語をインストールする方法まとめ]
[WindowsにGo言語をインストールする方法まとめ]:http://qiita.com/drafts/c686397e4a0f4f11683d

とまとめてくださっているので、導入**には**苦労しませんでした

と言うのも、入れろ入れろと煩く言われたウイルス対策ソフトの影響で、

挙動が不安定になり、

“`hello.go
package main

import “fmt”

元記事を表示

Amazon Linux 2でGoをインストールする

## EC2にインストール

### 利用できるバージョンの確認

“`
# amazon-linux-extras list | grep golang
29 golang1.11=latest enabled \
“`

### インストール

“`bash

amazon-linux-extras install golang1.11
“`

### GOPATHの追記

“`bash
export GOPATH=”$HOME/go”
export PATH=$PATH:$GOPATH/bin
“`

### インストール確認

“`
# go version
go version go1.13.4 linux/amd64
“`

元記事を表示

fmf.Sprintfはどんな型でもString型に合体する

### サンプル
– lengthなどはint
– spirintfでまとめつつStringにしている

“`golang
package main

import “fmt”

func main() {
type sample struct {
length int
Height int
}

p := new(sample)
p.length = 13
p.Height = 666

str := fmt.Sprintf(“長さ:%d 高さ:%d”, p.length, p.Height)
fmt.Println(str)
}

“`

結果

“`
長さ:13 高さ:666
“`

元記事を表示

[Go]文字コードのUTF-8変換を行う – charset decode

# 実現したい機能

`Shift-JIS` `EUC-JP` `ISO-2022-JP`等の文字コードであるstringをGo内部で扱えるよう `UTF-8` にデコードする。

# 実装

文字コードが既に分かっている場合の変換は以下の手順で実現できる。

* 入力stringのcharsetに応じたdecoderを取得
* decoderを用いてstringをUTF-8にdecode

“`Go
package main

import (
“errors”
“fmt”
“golang.org/x/net/html/charset”
“golang.org/x/text/transform”
)

// Converts the specified charset to UTF-8.
func Decode(src []byte, charSet string) (string, error) {
e, _ := charset.Lookup(charSet)
if e == nil {
return string(src), errors.New(fmt.Sp

元記事を表示

Nuxt × Go × AWS で比較コミュニケーション的な掲示板サービス作ってみた

比較コミュニケーションサイト Versus
https://versus-web.net

![FireShot Capture 075 – 比較コミュニケーションサイト『Versus(バーサス)』 – versus-web.net.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379449/1ee33604-7c8c-fd80-e979-1ab4b7a8c396.png)

![FireShot Capture 076 – 比較コミュニケーションサイト『Versus(バーサス)』 – versus-web.net.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379449/b9035a66-65f6-46c0-4c70-b6b9bfce023b.png)

~~Twitter で技術マウント合戦している人たちが面白かったので~~
AWS と Go の勉強がてら、テーマを持ち寄ってコミュニケーションできる簡単な掲示板

元記事を表示

[Go言語] 初心者必見シリーズ: マップ(Map)

# マップ(Map)

Golangではハッシュテーブル(hash table)のことを `map` と呼びます。

**キーと値の組**を複数個格納し、キーに対応する値をすばやく参照するためのデータ構造です。

![golang-map.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170309/c68cc7cb-b8ad-c6b3-f416-000550a99277.png)

## 定義方法

### 方法1

* 構文

“`go
変数名 := map[型]型{初期値1, …, 初期値n}
“`

* 例

“`go
languages := map[string]string{
“go”:”golang”,
“rb”:”ruby”,
“js”:”javascript”,
}
“`

### 方法2

* 構文

“`go
変数名 := make(map[型]型, 容量)
“`

* 例

元記事を表示

vscodeコンテナー環境でgo rename出来ない

# 実行環境
VSCode 1.47.3
Go 1.14.4
Remote-Containers v0.128.0
# 問題
「シンボルの名前を変更 F2」を行ったら、

“`
Rename failed: gorename: can’t find package containing /****/****/***.go
名前の変更を実行できませんでした。
“`
# 解決
1. “`ctrl + ,“`設定ページ開く
1. 「go server」で検索する
1. 一番下に“`Go:Use Language Serve“`をチェックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198260/f035a615-4f3a-3eda-a8d3-ac8aefc8be09.png)

元記事を表示

Go Gin Docker AWSで完璧なTodoアプリを作る

こんにちは。
今回は最近流行りのGoの勉強ついでにQiitaを書いてみようと思います。

普段はReactでのフロント開発やRailsでAPI開発などをしています。
社内でもRailsからGoへの書き換えが始まっている中で、Goってどうやって書くの?インフラわからないんだけどデプロイしてみたい!って軽い気持ちでサンプルアプリを作ってみたいと思います。
意外とローカルで動くものを作って終わりな記事が多いので今回はデプロイまで行うことをゴールとして開発していきます!!

## 使用技術
– go
– gin
– go modules
– mysql
– docker
– gorm
– AWS

## 参考文献
[Go / Gin で超簡単なWebアプリを作る](https://qiita.com/hyo_07/items/59c093dda143325b1859)
[DockerでGoの開発環境を構築する](https://qiita.com/uji_/items/8c9eda89526abe0ba900)

## 早速やっていこーう(環境構築)
(ここではgoのインストールは省略しまー

元記事を表示

宇宙船のコンピュータの整数演算ユニット作成し、船員を助けよう!

#宇宙船のコンピュータの整数演算ユニット作成し、船員を助けよう!!

![illustrain09-utyuu5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248419/5d2515e9-292e-88d8-0887-80c3a930ce5a.png)

## 問題
以下の入力の場合、実装して、出力の配列[0]の値を示せ。

#### 入力
“`
[1,1,28,3,1,1,2,3,1,3,4,3,1,5,0,3,2,9,1,19,1,9,19,23,1,23,5,27,2,27,10,31,1,6,31,35,1,6,35,39,2,9,39,43,1,6,43,47,1,47,5,51,1,51,13,55,1,55,13,59,1,59,5,63,2,63,6,67,1,5,67,71,1,71,13,75,1,10,75,79,2,79,6,83,2,9,83,87,1,5,87,91,1,91,5,95,2,9,95,99,1,6,99,103,1,9,103,107,2,9,107,1

元記事を表示

あなたの知らない拡張Consistent Hashの世界 ~Chord Protocol~

この記事は[Enjoy Architecting](https://taisho6339.hatenablog.com/entry/2020/07/22/164340)からの転載です。

## 概要
分散システムを学術的に学びたくて、
Chord Protocolというアルゴリズムが面白かったので実際に論文を読んで実装してみました。
この記事では、分散システムにおける名前付けの概念と、Chord Protocolの紹介、簡単な検証について言及していこうと思います。

| ![実装したシステム](https://github.com/taisho6339/gord/raw/master/docs/architecture-2.png) |
|:–:|
| *実際に作ったサーバ* |

## 分散システムにおける名前付けとは?
分散システムの分野には「名前」、「名前付け」、「アドレス」と呼ばれる概念があります。
それぞれどのような意味を持っているのでしょうか?

### 名前付けと名前
分散システムはネットワークを通じてそれぞれのサーバ、プロセスが協調して動作しています。
この中で、各

元記事を表示

vim-lspでgoの補完が効かない場合のメモ

近頃、vscodeが楽で便利すぎてvimを触る頻度が減ってしまっていたのですが、vimによるgoの開発環境を設定しようと思い立って設定してみました。

基本的にはmattnさんの以下の記事に従いました。

(1) [Big Sky :: Vim で Go 言語を書くために行った引越し作業 2020年度版](https://mattn.kaoriya.net/software/vim/20200106103137.html)
(2) [Big Sky :: Vim をモダンな IDE に変える LSP の設定](https://mattn.kaoriya.net/software/vim/20191231213507.htm)

(1)の内容だと、コード補完が効いたり効かなかったりしたので、(2)に記述のある以下の設定があると良いようです。vim-lspのdocumentにも[記述](https://github.com/prabirshrestha/vim-lsp/blob/b05c8da3ec7de542821e91f74c0a6a80449718ac/doc/vim-lsp.txt

元記事を表示

go get オプション集

#go getのオプション

“`
go get [-d] [-f] [-t] [-u] [-v] [-fix] [-insecure] [build flags] [packages]
“`

##-uオプション
新しいマイナーリリースまたはパッチリリースが利用可能な場合に、パッケージとその依存パッケージをネットワークから更新する。
使用しているパッケージを更新する際も使うことができる。

##-dオプション
パッケージのダウンロードのみ、インストールなし

##-fオプション
-uオプションがある時のみ使用可能。

上手く説明が出来ないので、参考URLから引用
>get -uに、各パッケージがソース管理リポジトリからチェックアウトされていることをインポートパスで暗黙的に確認しないようにします。これは、ソースがオリジナルのローカルフォークの場合に便利です。

##-tオプション
指定されたパッケージのテストに必要なパッケージも一緒にダウンロードしてくれる。

##-vオプション
実行しているコマンドを表示する。

##-fixオプション
依存関係を修正。ダウン

元記事を表示

[一発ネタ] Golang で GoTo キャンペーン [クソコード]

みなさんこんにちは! 最近旅してますか?
私は天気が悪いわコロナで騒がしいわで旅できてません!

なんかイライラしてきたので今回はプログラムの中だけでも旅をしましょう。
**というわけで、モダンな言語なのになんでか知らんがgoto文のあるGo言語でGotoキャンペーンをキメたいと思います!**

次のプログラムが最終的に出力する文字列を、実行せずに処理を追って当ててみましょう!

## プログラム本文

“`Go
package main

import “fmt”

func main() {
fmt.Print(“Go to “)

var money int = 10000
var toWhere string
var a int

goto TROUBLE
goto TRAVEL

NIGATA:
if money == 31000 {
toWhere = “fukuoka”
goto FUKUSHIMA
} else {
toWhere += “tou”
goto YOKOHAMA
}
return

TRAVEL:

元記事を表示

GoでCLIアプリケーション作成時にホットリロードする

# 背景と解決したい問題
Goの学習を進めるにあたり、簡易的なサンプルコードを書いて実行する、というサイクルを頻繁に回していました。
その際にいちいちエディタと実行するウィンドウを往復することになり、手数が増えて効率が落ちてしまっている実感がありました。
そこで、ファイルの更新を自動検知して自動でビルド&実行(ホットリロード)してくれる環境が欲しくなりました。

# 解決策

Go のツール、`gohr` を使うことをおすすめします。
https://github.com/longtime1116/gohr

## 導入と利用

[README.md](https://github.com/longtime1116/gohr/blob/master/README.md) に書いてある通り、以下のコマンドを実行します。

“`shell
$ go get github.com/longtime1116/gohr
“`

あとは、自分の開発しているワーキングディレクトリで `gohr` コマンドを実行すればOK。第一引数に出力ファイル名を指定します。

“`shell
$ gohr

元記事を表示

Go 1.15 リリースノート 日本語訳

この記事は https://tip.golang.org/doc/go1.15 を日本語訳したものです. 前のバージョンはこちら: [Go 1.14 リリースノート 日本語訳](https://qiita.com/c-yan/items/3dd0c63ea4c3041728cc)

# ドラフトリリースノート – Go 1.15 の紹介

**Go 1.15 はまだリリースされていません. これらは書いている途中のリリースノートになります. Go 1.15 は2020年8月にリリースされる予定です.**

# 言語への変更

言語の変更はありません.

# ポート

## Darwin

Go 1.14 のリリースノートで[アナウンス](https://tip.golang.org/doc/go1.14#darwin)したように、Go 1.15 は macOS 10.12 Sierra 以降を必要とし、以前のバージョンのサポートは終了となります.

Go 1.14 のリリースノートで[アナウンス](https://tip.golang.org/doc/go1.14#darwin)した

元記事を表示

[Go言語] 初心者必見シリーズ その1:配列とスライス

# 配列(Arrays)

配列は **連続したメモリ領域** を確保するデータ構造です。

golang-array.png

## 定義方法

### 方法1

構文:

“`go
var 配列名 [サイズ]型
“`

例:

“`go
var a [2]string
“`

### 方法2

構文:

“`go
var 配列名 [サイズ]型
= [サイズ]型{初期値1, …, 初期値n}
“`

例:

“`go
var a [2]string
= [2]string{“Hello”, “Go”}
“`

> NOTE: 宣言と同時に代入する。

### 方法3

構文:

“`go
配列名 := [サイズ]型

元記事を表示

Go Test を書いてみよう

Goには標準でテスト機能が組み込まれています。
Goのソースに対して、簡単なテストを書いてみましょう。

## 環境
“`
% sw_vers
ProductName: Mac OS X
ProductVersion: 10.15.5
BuildVersion: 19F101

% go version
go version go1.14.6 darwin/amd64
“`

## サンプルのディレクトリ構造
今回のサンプルファイルは、下記のようになっています。

“`
gotest
|– app.go // アプリの処理 (アプリ名を返す関すのみ持っている)
|– app_test.go // app.go の関数をテストする
|– main.go // app.go の関数を呼び出す
“`

“`ruby:main.go
package main

import (
“fmt”
)

func main() {
fmt.Println(AppName())
}
“`

“`ruby:app.go
package main

fu

元記事を表示

Golangのテストはテーブルドリブンテストで!

# はじめに
Golangでテストを書こうとしたときに推奨されてる実装方法として**テーブルドリブンテスト**(TableDrivenTests)というものがあります。
このテスト方法はGoの公式のwiki( https://github.com/golang/go/wiki/TableDrivenTests )でも紹介されてるテスト方法です。

# テーブルテストとは?
とりあえずにテーブルテスト書いてみます

“`go:square.go
package main

// Square 2つのintを受け取りそれらを掛け合わせた物を返す関数
func Square(a, b int) int {
return a * b
}
“`

“`go:square_test.go
package main

import (
“testing”

“github.com/stretchr/testify/assert”
)

func TestSquere(t *testing.T) {
asserts := assert.New(t)
for _, td := range

元記事を表示

OTHERカテゴリの最新記事