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

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

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 len(S) + 1 == len(T) and 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(in

元記事を表示

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:

元記事を表示

2020年なのにコード上に履歴持つスタイルを何とかする

# きっかけ

![Ostrich.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42445/142eab61-16cd-f1ae-6e62-73f0f2458b02.png)

ツイッターで会社にある変な文化みたいな話があった。コードの変更履歴をコードに持つという話。
要はこんな感じ。

“`text
// 2020/03/17 UPDATE START
// ….
int x = 2038;
// 2020/03/17 UPDATE END
“`

この履歴の取り方は、私がITに入った2000年頃には存在していた。
もうすでに消滅した文化と思っていたのだが、なんと20年近く同じことを繰り返していたのだ。
今は2020年。コードの変更履歴をコメントで入れる必要など0.01mmも存在しない。
何なら当時から皆`これ無駄じゃね?`と感づいていた。
まぁ、無駄になったコストは顧客が被ることになるのだが、それはまた別の話。
この変な文化の特徴は、`自らコードの可読性を落として、開発リソースを食う`と言

元記事を表示

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

元記事を表示

OTHERカテゴリの最新記事