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

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

Go の環境構築をしてそのまま Cloud Functions を使う with VSCode

初 Go & CloudFunctions にあたって、せっかくなので作業記録

# 前提
## 環境
– macOS Catalina

## インストール済み
– brew

# Go の使用準備

## vscode の設定を追加

ここでは workspace の設定に追加
([Go のインストールと vscode の環境構築](#go-%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%A8-vscode-%E3%81%AE%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89)ここで vscode 用のツールをインストールする際に、この設定が必要かもしれない。一応。)

`go.gopath` の値は `go env` で確認できる。

“`
$ go env

GOPATH={PATH}
“`

“`json
{
“files.autoSave”: “afterDelay”,
“go.gocodeAutoBuild”: true,

元記事を表示

【Go言語】Go製データベースBadgerの基本的な使い方まとめ【BadgerDB】

日本語のドキュメントを探しても見つからなかったのでメモ。

# Badgerとは

* BadgerDBは、純粋なGoで記述された埋め込み可能な永続的で高速なKey-Value(KV)データベースです。
* Github: [https://github.com/dgraph-io/badger](https://github.com/dgraph-io/badger)

# 環境(執筆時点)

* Go: 1.14.2
* Badger: 2.0.3

# インストール

“`bash
$ go get github.com/dgraph-io/badger/v2
“`

# サンプルコード

db.View() は読み取り専用トランザクションです。このメソッド内で更新処理は行なえません。

“`golang
package main

import (
“fmt”
“log”

badger “github.com/dgraph-io/badger/v2”
)

func handle(err error) {
if err != nil {
log.Fatal

元記事を表示

Goでtar.gzをダウンロードしてそのまま展開する。

# 概要
net/httpの`func (c *Client) Get(url string) (resp *Response, err error)`を実行してresponseを取得します。
それをcompress/gzipの`func NewReader(r io.Reader) (*Reader, error)`に流します。
続けてarchive/tarの`func NewReader(r io.Reader) *Reader`に流します。
そしてforで`io.EOF`が出るまで読み込みます。
その中でHeaderにあるTypeflagからディレクトリかファイルかを判別します。
`TypeDir`なら`os.Mkdir`でディレクトリを作成します。
`TypeReg`なら`os.Create`と`io.Copy`でファイルを作成します。

# サンプル
“`go
package main

import (
“archive/tar”
“compress/gzip”
“errors”
“io”
“log”
“net/http”
“os”
)

func main

元記事を表示

Go言語でMySQLに接続する方法

# はじめに

~~この記事ではGo言語でMySQLに接続する方法を紹介します。~~
自分用のメモ

# 使うライブラリ

* database/sql
* github.com/go-sql-driver/mysql

# DBの設定例

* DB名:test
* テーブル名:users

“`
mysql> desc users;
+——-+————-+——+—–+———+——-+
| Field | Type | Null | Key | Default | Extra |
+——-+————-+——+—–+———+——-+
| name | varchar(10) | YES | | NULL | |
| age | int | YES | | NULL | |
+——-+————-+——+—–+———+——-+

元記事を表示

Goで外部コマンドの標準出力を触る

# 概要
os/execの`func Command(name string, arg …string) *Cmd`で外部コマンドを指定します。
その後にos/execの`func (c *Cmd) StdoutPipe() (io.ReadCloser, error)`で外部コマンドの標準出力のpipeを取得します。
コマンドが終了するとpipeは閉じられるため明示的に閉じる必要はないです。
同じ理由でos/execの`func (c *Cmd) Run() error`で実行すると標準出力を触れる隙がないため、os/execの`func (c *Cmd) Start() error`と`func (c *Cmd) Wait() error`を使用します。

# サンプル
環境変数は外部コマンドを使用せずとも見れますがサンプルとしてenvコマンドを使用しています。
コマンドによるとは思いますが、日本語じゃなくて英語で表示したい場合は環境変数LANGをCにすると英語で表示されます。

“`go
package main

import (
“bufio”
“fmt”
“lo

元記事を表示

httptestを試してみた

goの勉強続き。
testをやってみる

なんとか動いてCoverage 75%になったけど、100%にならないのはなんでなんだろ。
httptestでやるのはなかなか手応えがあったので、
単純な数値計算関数などに戻って、試してみようとおもう。

“`http2.go
package main

import (
“io”
“net/http”
“strconv”
“strings”
)

// 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, err error)

func ServeHoge(w http.Respon

元記事を表示

Goのloopclosureについて

ある日、vim-go が loopclosure というワーニングを吐いた。
for文の中で関数を定義して、そのループ内で作った関数を呼ばない場合は、その時のanswerを渡してくれるわけではないみたい。
下のコードは a, bと表示して欲しいのだが、b, bと表示されてしまう。

“`
package main

import (
“fmt”
)

func main() {
answers := []string{“a”, “b”}
var funcs []func()
for _, answer := range answers {
funcs = append(funcs, func() {
fmt.Println(answer)
})
}

for _, f := range funcs {
f()
}
}
# =>
b
b
“`

正しくはこう

“`
package main

import (
“fmt”
)

func main() {
answers := []string{“a”, “b”}
var funcs []fu

元記事を表示

【React&Golang&MySql】Dockerで開発環境構築

dockerでReact&Golang&MySqlを使ったアプリケーション開発環境構築してみました。

リポジトリ

githubリポジトリは[こちら](https://github.com/atsugitakuya/react-go)です。

環境

とりあえず、以下の環境で動かしてます。
docker:19.03.8
docker-compose:1.25.4

Reactサーバー構築

まずはReact用意から。
とりあえず、Dockerfileとdocker-compose.yml作成する。
今回は、[こちらの記事](https://qiita.com/kerochelo/items/1063da8893026de5ebbf)を参考にしました。

“`ruby:/docker/react/Dockerfile
FROM node:8.16.0-alpine
WORKDIR /app/react
RUN npm install –save prop-types
RUN npm install -g create-react-

元記事を表示

Golang Sliceに構造体をブチ込む

“`
package main

import (
“fmt”
)

type Person struct {
Name string
Age int
}

func Persons() []Person {
persons := []Person{
Person{“Aaron”, 30},
Person{“Harold “, 20},
Person{“Ted”, 5},
}
return persons
}

func main() {
persons := Persons()
for _, person := range persons {
fmt.Printf(“%s: %d\n”,person.Name, person.Age)
}
}
“`

元記事を表示

Protocol Buffers用 Go言語APIの APIv1 と APIv2 の差異

# この記事について

Protocol Buffers用 Go言語API に新しく V2 (APIv2) が出たことにより、import のパス、リポジトリ、protoc-gen-go などに違いがあり混乱したので整理してみた。

なお、投稿時(2020/05/11)での情報なので今後変わる可能性あり。

# Protocol Buffers用 Go言語API について

Protocol Buffers(以下、protobuf)は言語ニュートラルなデータのシリアライズの仕組みで、Go言語でも protobuf を使うための API が提供されている。

最初の API が提供されたのが 2010年ごろで、これを `APIv1` と呼ぶ。
そして、2020年3月に新しい `APIv2` がリリースされた。

APIv2 についてのごく簡単な特徴:

– *.proto ファイルで定義された protobuf のアノテーションを Go から読めるようにした
– APIv2 は後方互換性はない
– APIv1 は今後もずっとサポートを継続する(原文: We intend to mai

元記事を表示

TinyGo + Vim で gopls するための設定

以下の GIF のように、 PyPortal (atsamd51j20a) の設定で gopls を動かせるようになりました。
正しく board_pyportal.go 等に飛べているのが確認できます。
もちろん、メソッド等の補完も動きます。

![tinygo-gopls-vim.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63649/f6dee7b4-7d3d-bc13-272b-f82b1aebec6c.gif)

## はじめに

TinyGo は、以下の理由により gopls がほとんど動きませんでした。

* 独自のビルトインパッケージを持っている
* 例: machine や device など
* buildtag による分岐

buildtag による分岐については、 gopls でも issue として上がっている内容になりますが、現時点でも gopls 全体で `ある単一の buildtag を持つこと` は可能なので何とかなりました。

ということで、 LSP を動か

元記事を表示

【Golang】型と型変換

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

“`
package main

import (
“fmt”
“strings”
“strconv”
)

func main() {
//数値型
//いろんな種類がある
//https://golang.org/ref/spec

//int は自分のPCの32ビットか64ビットの環境依存になる
//確実に宣言したい場合はint64などにする
//宣言するビット数で最大値の範囲が異なる。
var (
//uint 整数+
u8 uint8 = 255
//int 整数 – ~ +
i8 int8 = 127
//浮動小数点数
f32 float32 = 0.2
//複素数
c64 complex64 = -5 + 12i

//上記のように、揃えて書くのがGo推奨
)
//表示
fmt.Println(u8, i8, f32, c64)

元記事を表示

GoでPaizaの スキルチェック見本問題「島探し」

# 概要
[島探し (paizaランク S 相当)](https://paiza.jp/works/mondai/skillcheck_sample/search-island?language_uid=go)のGo言語での私なりの回答。
他の言語では探せば見つかるので何番煎じかわかりませんが、Go言語では無さそうだったのでここに掲載致します。
ちゃんとスコアは100になります。

Goでは配列orスライスに対して明示的な削除処理が標準パッケージに存在しないため、そこは独自に作る必要があります。
私のスライス要素の削除方法だとキャパシティが増え続けるので、メモリ管理を重視するなら、appendする前にmake([][2]int,0)等をおすすめします。
今回の実装だと速度のほうが重要かと思いましたので、探索ループ中はキャパシティが残り続ける方法になっています。
(通常は気になるレベルではありませんが、キャパシティを増やすappendは、参照先の配列がコピーされるため、処理が若干重いです)

“`Go
//キャパシティが増え続ける
//searchPoint = append(s

元記事を表示

Goで子プロセスを確実にKillする方法

http://makiuchi-d.github.io/2020/05/10/go-kill-child-process.ja.html

元記事を表示

AtCoder Beginner Contest 167 参戦記

# AtCoder Beginner Contest 167 参戦記

700番台とか初めてなのでイヤッッホォォォオオォオウ!!

## [ABC167A – Registration](https://atcoder.jp/contests/abc167/tasks/abc167_a)

2分で突破. 書くだけ.

“`python
S = input()
T = input()

if S == T[:-1]:
print(‘Yes’)
else:
print(‘No’)
“`

## [ABC167B – Easy Linear Programming](https://atcoder.jp/contests/abc167/tasks/abc167_b)

3分半で突破. `sum(([0] * A + [1] * B + [-1] * C)[:K])` って書いている途中で K≤2×109 に気づいた. なんという時間の無駄.

“`python
A, B, C, K = map(int, input().split())

resu

元記事を表示

Golangの継承(extends)対応テンプレート(goingtpl)を作ってみた

[Golangのインクルード(include)対応テンプレート(goingtpl)を作ってみた](https://qiita.com/kamina/items/64a1f2e238d072273fd8)
を改良して、継承(extends)表記にも対応してみました。
そもそもGoでもテンプレートの継承的な動作はできるのですが、プログラム側で継承元ファイルを指定してあげる必要があります。(のはず。。
それをテンプレート側の記述だけで完結させ、プログラム側は自動で継承元ファイルを読み込むようになるというものです。

というのも最近はもっぱらPython(Django)を使うことが多く、そのテンプレート表記に慣れてしまっ為にGoでも同じように記述できないかなと(笑)

# goingtpl

下記GitHubで公開中です。
[https://github.com/playree/goingtpl](https://github.com/playree/goingtpl)
使い方などの詳細は下記
[https://github.com/playree/goingtpl/blob/master/R

元記事を表示

Golang勉強メモ 雑記

golangを動かして思ったことを雑多にメモする
大きくなりそうなものは別途記事としてまとめる

# 静的解析が便利(らしい)
### 静的解析とは
コードを実行せずにきれいにしてくれるマン
golang自体がシンプルなコードで、静的解析のしやすさを目指しているらしく
静的解析との相性がいいらしい。
https://golang.org/doc/faq#change_from_c
>Second, the language has been designed to be easy to analyze and can be parsed without a symbol table.

### fmt
公式から提供されているフォーマッタ。
ファイル保存のタイミングで、自動的にソースのフォーマットを行ってくれる。
実施してくれるのは

* 行間のフォーマット
* 変数、型のインデント揃え
* 不要(ソース内未使用)パッケージの削除
* 制御構文の()削除※
※golangはif,switch,forの制御構文に()は利用しない

など
![ezgif-3-89c5e65aac7a.g

元記事を表示

Golang勉強メモ②単体テスト

golangの単体テストは、golangの標準パッケージ
`testing`を使用することで作成することができる。
[testing](https://golang.org/pkg/testing/)

# 検証環境のディレクトリ構造
“`
golang
├main.go
└person
├person.go
└person_test.go
“`

# VSCode上での単体テスト作成方法
テストしたいメソッドの上でコンテキストメニューを開き、
`Go:generate Unit Tests For Function`を選択するとテストコードが生成される。
`testing`は`{テスト対象のソース名}_test.go`というファイルを生成する。

![ezgif.com-video-to-gif (5).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298390/4a130923-41be-a5bc-1c3c-a0819e064406.gif)

“`Go:main.go
package

元記事を表示

40言語で「Hello World」をやってみよう!!

プログラミング言語を言えば、世の中高級言語が2500種類が存在するそうです。プログラミング言語はそれぞれの特徴を持っていますが、基本的なロジックはほぼ変わらないです。

TIOBEはプログラミング言語の人気度を表す指標としてよく知られています。毎月ランキングを更新します。下図は2020年4月最新のデータです。全体的に見ますと、やはりJavaとC言語は十何年間経っても人気が変わらないですね。

![April4](https://www.microstone.info/ms/wp-content/uploads/2020/05/tiobe.png)

プログラマーにとって、開発言語を勉強しはじめて、大体Hello Worldからです。本稿は40のプログラミング言語でHello Worldを実装してみました。各言語の間にどんな差異があるのか見てみましょう。

### 1. C

“`c
#include
int main(void){
printf(“Hello, World!\n”);
return 0;
}
“`

### 2. C++

元記事を表示

go langの文字列操作 決定版?

“`
package main

import(
“fmt”
“strings”
“sort”
)

func main() {
integer := “12345”
str := “abcd”

//取得
fmt.Println(integer[0]) //rune番号
fmt.Println(string([]rune(str)[0])) //a
fmt.Println(str[0:1]) //a
fmt.Println(str[0:2]) //ab
str += “”
str += “e”
fmt.Println(str) //abcde
fmt.Println(len(str)) //5 空文字はlengthには加算されない

//最後の要素
fmt.Println(str[len(str)-1]) //rune 101
fmt.Println(string([]rune(str)[len(str)-1])) //e
fmt.Println(str[len(str)-1:]) //e
fmt.Println(str[len(str)-2:

元記事を表示

OTHERカテゴリの最新記事