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

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

Go製インタプリタに見る動的値型まとめ

Go言語でインタプリタを作っているのだが、動的値型の宣言の仕方でぜんぜん実行速度が変わってくるので、メンテナンス性と実行速度いろいろ検討してみる。

# 構造体に全部の型を詰め込むパターン

動的値型を作る上で最も直感的に使えるのが全部の型を構造体に詰め込むパターン。あまり考えなくても使えるがメモリ効率はよくない。

“`struct.go
type Value struct {
TypeNo int
IntValue int
StrValue string
}
// 必要な時に変換関数を呼ぶ
func (v *Value) ToInt() int {
if TypeNo==TypeInt { return v.IntVaue }
if TypeNo==TypeStr { return StrToInt(v.StrValue) }
}
func (v *Value) ToString() string { … }
“`

# 全てをinterface{}で表現するパターン

動的値型をinterface{}で表す方法。必要に応じて、任意の型にキャ

元記事を表示

【Go】SQLBoilerの使い方【ORM】

# SQLBoiler とは

タイトル通り、Go言語のORMです。とりあえず[一次ソース](https://github.com/volatiletech/sqlboiler)貼っておくので一緒に見ましょう。[一次ソース](https://github.com/volatiletech/sqlboiler)です:santa:

GoのORMは[GORM](https://gorm.io/ja_JP/)しか使用経験がありませんが、サクッと自分の思ったことをまとめました。
SQLBoilerを使用したソースコードは[こちら](https://github.com/ishihaya/gopro)。

### 特徴
– DBを作成してマンドを打つと構造体を自動で生成してくれて、InsertやQueryなどができるようになる
– (メリット)他のORMよりパフォーマンスが良い(README参照)
– (メリット)Goのstructとしても活用しやすい
– (デメリット)ソースが少ない

# 実装手順

1. DB作成
2. DB接続
3. 導入
4. tomlファイル作成
5. SQL文記述

元記事を表示

GoでGORMとTwitterAPIを使ったミニミニアプリ作ってみた

プログラミング歴3ヶ月目に突入しました!
GoでGORMとTwitterAPIを使ったアプリと言っていいのかすらわからないアプリを作りました!
GitHubに置いてあるのでよかったら見てください!(https://github.com/souhub/buzz_tweet)
そんなミニミニミニアプリですが、Railsでツイッター風アプリを作ったぶりの達成感とワクワクを感じることができました。
TwitterAPIを使って任意のユーザーの直近100件のツイート(リプとRTを含む)を取得して、GORMでデータベース操作していいねやRTが多い順や少ない順に並び替えるアプリです。

##こんな感じ
これがホーム画面でここでツイートを並べ替えたい人のユーザーIDを入力し、何順に並びかえるか選択します。
スクリーンショット 2020-07-05 16.51.20.pnggo修行20日目 データベース

## データベース作成

### INSERT

“`golang

package main

import (
“database/sql”
“log”

_ “github.com/mattn/go-sqLite3”
)

var DbConnection *sql.DB

func main() {
DbConnection, _ := sql.Open(“sqlite3”, “./example.sql”)
defer DbConnection.Close()

// テーブル作成
cmd := `CREATE TABLE IF NOT EXISTS person(
name STRING,
age INT)`
_, err := DbConnection.Exec(cmd)
// エラーハンドリング
if err != nil {
log.Fatalln(err)
}

// レコードINSERT
cmd = “INSERT INTO person (name, age) VALUES (?, ?)”
_, err = DbCon

元記事を表示

Goでスタックを実装

# はじめに
データ構造とアルゴリズム、Goの勉強のためにスタックを実装しました。
個人的なアウトプットです。

# スタック
スタックは後に格納されたデータほど先に取り出される。
**LIFO(Last In First Out)**
![stack.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631794/e497b8d4-be40-e847-7585-9bfe6bf100d9.png)

# コード

“`go
package main

import “fmt”

const StackSize = 10

type Stack struct {
top int
data [StackSize]int
}

func (s *Stack) Push(d int) error {
if s.top == len(s.data) {
return fmt.Errorf(“Stack Overflow”)
}
s.data[s.top] = d
s.top++
return n

元記事を表示

Go のロギングライブラリ “go-logging”

# ロギングについて
プログラムを書いていると、内部の処理で値がどのように変化しているかログを出して確かめたい時があると思います。しかし、 **全ての情報をログに出力しようとするのはあまりにも煩雑になってしまい、本来得たい情報が読み取りづらくなる恐れがあります。**

上記の問題を解決したいため、ログに出力する情報を制御できる仕組みが欲しいです。

Go 言語には [go-logging](https://github.com/op/go-logging) というロギングライブラリがあり、レベル毎のログ出力の制御や出力情報のカスタマイズなどができます。今回はこれについてご紹介したいと思います。

# 使い方紹介

### サンプルコード

“`go:main.go
package main

import (
“os”

“github.com/op/go-logging”
)

var log = logging.MustGetLogger(“example”)

// ログの出力フォーマットを定義
var logFmt = logging.MustStringFormatte

元記事を表示

Go言語のメソッドの互換性の破壊検証

## はじめに
この記事はGo言語のメソッドの仕様を検証したものです。誤っている記述があると思う場合は、ご指摘いただければ嬉しいです。

Go言語のリリースノートの [Go 1 and the Future of Go Programs](https://golang.org/doc/go1compat) を調べていて、このような記述を見つけました。

> Although we expect that the vast majority of programs will maintain this compatibility over time, it is impossible to guarantee that no future change will break any program. This document is an attempt to set expectations for the compatibility of Go 1 software in the future. There are a number of ways in which a progra

元記事を表示

golang appendを使ってスライスから特定の要素を削除

## リソースに対するDELETE
https://tutorialedge.net/golang/creating-restful-api-with-golang/#deleting-articlesにて
deleteArticle関数の中で

“`golang:main.go
Articles = append(Articles[:index], Articles[index+1:]… )
“`

これ、『スライスの要素を削除しているのだろう。』と推測するのは容易だがどう動いているのか気になったため調べてみた。

このとき、Articlesは以下のJSONを返す。

“`
[
{“Id”:”1″,”Title”:”Hello”,”desc”:”Article Description”,”content”:”Article Content”},
{“Id”:”2″,”Title”:”Hello 2″,”desc”:”Article Description”,”content”:”Article Content”},
{“Id”:”3″,”Title”:”Hello 3″,”

元記事を表示

Go vs Rust

どうも。~~首を刺して自■する寸前でとある企業に雇われ半年ほど経った者です。~~ ところで、Golangはマルチスレッド処理が手軽にできる言語ですが、何故か分かりませんがこの言語とRustはしばしば比較されます。

というわけで、どっちがパフォーマンスの良い言語なのか比較したいと思います。

# 比較を行った背景

何故か僕の周辺では何かに取り憑かれたように「RustいいよRust」と、無条件なRust賛美をよく目にするようになりました。でもぶっちゃけ、僕はどうして彼らがそこまでRustに心酔するのかよく分からないので、実際に検証コードなりを書いてRustを体験してみた・・・というのが背景です。

# 何を比較したか

1. フィボナッチ数列を計算量$O(\log n)$で計算するコードをGoとRustで実装し、計算時間を測る。計算時間の短いほうをパフォーマンスの良い言語とする。
2. 「Hello World」というテキストを返すウェブサーバーを実装し、abコマンド(Apache Benchmark)を使って秒あたりのスループットを計測した。スループットが高いほうの言語をパフォーマン

元記事を表示

$GOPATH/pkg/mod配下のファイルが消せない

# `$GOPATH`を変更した話

Goのインストール時に`$GOPATH`を`~/workspace/go`な感じにしたら扱いにくかったのでデフォルト`~`に戻して、元のディレクトリを`rm`しようとしたときに消せなかったのでメモ

“`sh:terminal
$ echo $GOPATH #変更後
/Users/usr/go

$ rm -rf ~/workspace/go
rm: cannot remove ‘/Users/usr/workspace/go/pkg/mod/golang.org/x/crypto@v0.0.0-20190308221718-c2843e01d9a2/internal/subtle/aliasing.go’: Permission denied
rm: cannot remove ‘/Users/usr/workspace/go/pkg/mod/golang.org/x/crypto@v0.0.0-20190308221718-c2843e01d9a2/internal/subtle/aliasing_test.go’: Permission d

元記事を表示

【Goのお勉強中】ラップアラウンド(wrap-around)が要注意な件

# 背景
Goの独学を進める中で、ラップアラウンドなるものに出会いました。
こりゃ要注意だぞ…と思ったのでまとめます
※何かしら知見を得られたらその度に更新します

# ラップアラウンドって何?
### ざっくり
桁あふれ(オーバーフロー)の上位互換みたいなやつ。
最大値を超えたら、また最小値からスタートする、みたいな。
反対に最小値を下回ったら、最大値になっちゃう、みたいな。
(C言語でも同じことが発生するとかなんとか)

### 例えば
8ビットで数値を管理保持するint8の型を持つ変数aがあった場合
int8の範囲は-128~127じゃないですか。
すると、
現在 a = 127 だったとしたら、a++ をするとaの値が-128になります。
めっちゃ減っとるやんけ
逆にa = -128 の時に1を引くと127になります。

嘘だと思うならやってみてください

“`go:main.go
package main

import “fmt”

func main() {
var a int8 = 127

a++
fmt.Printf(“ふつうは127+1=128のはず。

元記事を表示

Goでエラーだったときにlogrusでログ出力してみる

## はじめに
[GoでOpenWeatherMapAPI叩いてみた](https://qiita.com/Captain_Blue/items/0cac0253daf14d4c75b9)でやったものをちょっとだけ改良して、エラー時のログ処理を追加してみたものになります。

[GitHubはこちら](https://github.com/captain-blue210/go_api_sample)

## 環境
OS:maOS Catalina 10.15.5
Go:go version go1.14.4 darwin/amd64

## 手順

– logrusをインストールする

※ログレベルを分けたい&速度を気にする必要がない&シンプルに使えそうだったのでlogrusを選択

“`
$ go get github.com/sirupsen/logrus
“`

– init関数でログ設定を行う

“`go
func init() {
// Info以上のレベルを出力する設定
log.SetLevel(log.InfoLevel)
}
“`

– エラー

元記事を表示

go修行19日目 HMAC

## HAMC

– api認証
– https://xn--go-hh0g6u.com/pkg/crypto/hmac/

“`golang
package main

import (
“crypto/hmac”
“crypto/sha256”
“encoding/hex”
“fmt”
)

// サーバサイドで正しいクライアントのものかを判定する
var DB = map[string]string{
“User1Key”: “User1Secret”,
“User2Key”: “User2Secret”,
}

func Server(apiKey, sign string, data []byte) {
apiSecret := DB[apiKey]
// sha256の同じアルゴリズムを使う
h := hmac.New(sha256.New, []byte(apiSecret))
h.Write(data)
expectedHMAC := hex.EncodeToString(h.Sum(nil))
// 同じアルゴリズムでエンコードしたhmac

元記事を表示

go/analysis.Analyzerをnolintできるようにする

go/analysis.Analyzer を使いこなして行こうと思った時に、
ふと思い立ったので作ってみました。

https://github.com/kyoh86/nolint

“`go
func main() {
multichecker.Main(
nolint.WrapAll(
exportloopref.Analyzer,
bodyclose.Analyzer,
// …
),
)
}
“`

と書くと、 `// nolint` のコメントでDiagnosticsの出力を抑制できます。

元記事を表示

言語別Stack処理速度比較

## 1. はじめに
Go言語にはStackが実装されていませんが、

Stackの処理自体は、どの言語でも、
配列や線形リストを使って自作で実装することができます。

Go言語向けに自作で作ったついでに、
Stackが実装されている他言語との処理速度(処理時間)を比較してみました。

実験で使用した言語は、

* C#(.NET Core3.0)
* go1.14.4
* java 13.0.2
* Python 3.8.3
* C言語(MinGW.org GCC-8.2.0-3)(2020/07/12追記)

の5言語です。

各言語のソースは、githubでも公開しています。
https://github.com/NobuyukiInoue/StackSpeedTest

* C#
https://github.com/NobuyukiInoue/StackSpeedTest/tree/master/Project_CS

* Go(配列でStackを実装)
https://github.com/NobuyukiInoue/StackSpeedTest/tree/master/

元記事を表示

Azure Functions for Goの歴史

Azure Functionsは、関数単位で処理を実行するAzureサービスです。

– [Azure Functions サーバーレス コンピューティング | Microsoft Azure](https://azure.microsoft.com/ja-jp/services/functions/)

2020年6月現在、Azure Functionsは

– C#, JavaScript, F#, Java, PowerShell, Python, TypeScript

を正式サポートしてしますが、残念ながらココにGoはありません。

– [Azure Functions でサポートされている言語 | Microsoft Docs](https://docs.microsoft.com/ja-jp/azure/azure-functions/supported-languages)

[Azure/azure-sdk-for-go](https://github.com/Azure/azure-sdk-for-go)にAzure Functions for Goに関するイシュー

元記事を表示

SonarqubeのGolang対応

https://qiita.com/fake-deli-ca/items/dd21a5b86b5dfdd7cb0a

元々上記でなんでSonarqubeのVerUp対応をしたかというと、golang対応が6.4では対応していないからである。
https://docs.sonarqube.org/latest/analysis/languages/go/

というわけで対応。sonar-scannerは元々対応済み前提。

“`sonar.properties
##################################################################
# Properties file for sonar-scanner
# See https://docs.sonarqube.org/display/SONAR/Analysis+Parameters
##################################################################

# Server
sonar.host.url=https

元記事を表示

GoでOpenWeatherMapAPI叩いてみた

# 前提
もくもく会で作成したOpenWeatherMapのAPIをGoから叩いてみたものです。
とりあえず、GoからAPIを叩くというのをやりたかったので、エラー処理を考慮していませんのでご承知おきください。

## 環境
OS:maOS Catalina 10.15.5
Go:go version go1.14.4 darwin/amd64

## つくったもの
[ソースはこちら](https://github.com/captain-blue210/go_api_sample)

“`go:main.go
package main

import (
“encoding/json”
“fmt”
“io/ioutil”
“log”
“net/http”
“os”
“strconv”
)

type WeatherData struct {
Coord struct {
Lon float64 `json:”lon”`
Lat float64 `json:”lat”`
} `json:”coord”`
Weather []struct {
ID

元記事を表示

いきなりGoを使うのに試したこと

ちょうど欲しいと思っていたライブラリが Go で書かれているのを見付けました。それまで Go を使ったことがなかった状態から、そのライブラリを使うために試行錯誤した過程をメモしておきます。

# ライブラリ

使いたかったのは vocx というライブラリです。エスペラントをポーランド語のエンジンで音声合成するため、ポーランド語風の綴りに変換するというものです。

*

用途は特殊ですが、受け取った文字列を正規表現で変換しており、ありふれた文字列処理です。

“`go:Usage
t := vocx.NewTranscriber()
t.Transcribe(“Ĉu vi ŝatas Esperanton? Esperanto estas facila lingvo.”)

// czu wij szatas esperanton? esperanto estas fatssila lijngwo.
“`

# ビルド

まずライブラリを git clone します。

Makfile にはテストのことしか書かれ

元記事を表示

頑張らない勤怠管理〜ラズパイとfreeeでWi-Fi打刻〜

皆さん勤怠管理してますか?

今回は人事労務freeeさんのAPIと連携して、Wi-Fiに接続したら出勤、Wi-Fiの接続が切れたら退勤というものを作ってみました!

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82779/dc00b79c-ef05-771f-c79a-5ec6028a714b.png)

## 用意するもの
– freeeの開発用アカウント
– Raspberry Pi(社内サーバがあればそれで良いです)
– Firebaseアカウント

## システム構成図

– Wi-Fiが繋がったデバイスをラズパイでarpで取得
– MacアドレスをFirebaseに送信
– Firebaseから人事労務freeeのAPIを呼ぶ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82779/c8dced0a-7561-43ad-5817-9e1449b0f331.png)

元記事を表示

OTHERカテゴリの最新記事