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

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

【Golang】テスト実行時に “package exec is not in GOROOT”

> Go 言語(Golang)の `testing` を使ってテストを実行すると「`exec` パッケージがない」と言われます。

“`shell-session
$ go test .
# github.com/KEINOS/Hello-World
main_test.go:5:2: package exec is not in GOROOT (/usr/local/go/src/exec)
FAIL github.com/KEINOS/Hello-World [setup failed]
FAIL
“`

意外なことに[「”golang” package exec is not in GOROOT」とググって](https://www.google.com/search?q=%22golang%22+package+exec+is+not+in+GOROOT)も、当然すぎるのか、すぐに見つからなかったので自分のググラビリティとして。

– go version go1.15.3

## TL; DR

> `exec` は `os` パッケージの一部です。`exec` →

元記事を表示

[Go] echoフレームワークで Response Body (レスポンス ボディ) を取得するアレな方法

## まえがき

上司たそ「@syamamura くん。エラーログ出して欲しいんだけど、トレースログとエラーコード。ロギングしといて。よろしく」
ぼく「はぁい」

エラーコードは??**紆余曲折**??の末、決定される仕様なため✨?**綺麗**?✨に取得するには**レスポンス**から取るしかないことに気づく。

エラー時のみハンドリングしたかったとか、ログにトレースログを含める必要があったとか、そんな理由で実装した。
**困った人**向け。

文字通りアレな方法だと思うので、単純に Response Body を取得したいだけの**困ってない人**は[middleware/body-dump](https://echo.labstack.com/middleware/body-dump)を使ったほうが良いと思う。

## 困った人。

Response Body を取得したいけど Response は stream 的なものに書き込まれてるっぽくって後から取得しようとしてもできなかった。
なので `Context.Response().Writer` をトラップ付き Writer

元記事を表示

gRPCとFirebase Authenticationで認証処理

# はじめに
gRPCとFirebase Authenticationを使用したGoサーバでの認証処理のやり方を紹介します。認可処理についてはまた別記事で書く予定です。

# Firebase Authentication
SDKの追加は以下のコマンドからできます。

“`shell
go get firebase.google.com/go
“`

Firebase Admin SDK for Go の初期化は以下を参考にします。
[サーバーに Firebase Admin SDK を追加する](https://firebase.google.com/docs/admin/setup?hl=ja#initialize_the_sdk)

従来は“`option.WithCredentialsFile()“`を使用した初期化が一般的だったようですが、GOOGLE_APPLICATION_CREDENTIALS 環境変数を使用する初期化を強くお勧めしているようです。

“`go:firebase.go
package middleware

import (
“context

元記事を表示

converting argument $1 type: unsupported type []string, a slice of stringに悩まされた話

#概要
エンジニア1年目の初投稿です。
sqlxを使ってDB操作をしていたら、下記のエラーに悩まされたので記録します。
コメント、ダメ出しなど頂けると嬉しいです。

“`
converting argument $1 type: unsupported type []string, a slice of string
“`

# シナリオ

SELECT文のWHERE句にIN条件を使った操作を行おうとしていたところ、エラーに嵌まりました。
今回は,以下のUSERテーブルからgoとpythonを使えるUSERを抽出する操作を書いていきます。

| Name | Skill |
| — | — |
|Ichiro| C |
| Jiro | C# |
|Saburo| Java |
|Shiro | python|
|Goro | go|
|Rokuro| Ruby|
|Shichiro|go|

## 各種ツール

– go 1.14
– github.com/jmoiron/sqlx v1.2.0
– github.com/go-sql-driver/mysql v1

元記事を表示

Go Moduleでローカルで作成したパッケージを読み込む

Goを勉強し始めました。
本を使って勉強しているのですが、基本的にバージョンが古いです。
ですので、Go Moduleを使ったファイル構成になっていないのがほとんど。

しかし、今後のバージョンアップでModuleを使う動きになっていく流れになっていくそうです。
ですので、初心者でもModuleを使って開発がしたいと思いまして、イジイジしてたのですが、思ったよりも苦戦しました…

特にローカルで作ったパッケージを、他のファイルにimportする方法がわからず苦戦。
同じエラーで苦しむ人を減らすべく、記事を書こうと思いました。

## Go Moduleとは
パッケージ管理ツールです。
Go 1.11以前では`$GOPATH/src/`配下にソースコードを置かないとローカルで作ったパッケージなどをうまく扱えなかったのですが、`go module`を使えばどこのディレクトリからでも、パッケージ管理ができるようになったらしいです。
nodeのpackage.jsonみたいなものですかね。
なので、環境変数のパスに依存せずにプロジェクトを作ることが可能です。

## 導入
Version

元記事を表示

grpc-nodeでエラー時にerrdetailsを返却する

# grpc-nodeでエラー時にerrdetailsを返却する
gprcのバックエンドとしてnodeを選択するとフレームワークとして公式のgrpc-nodeが選択に上がると思います
https://github.com/grpc/grpc-node

正常系はそつなく実装できるのですが、エラー時にGoなどで言うところのerrdetailsを利用したくなったときに苦労したのでその覚書
(正確にはerrdetailsと呼ぶのかは分かりませんがGoのパッケージ名がerrdetailsなのでそう呼んでます)

## errdetailsって何?
gRPCのフレームワークが用意しているエラーの詳細を記述できるメッセージオブジェクトです
例えば、REST-APIを設計するときなどにjsonのエラーオブジェクトも設計する必要があると思うのですが、
統一的なフォーマットがなく(一応RFC7807という規格はあるが従っていることが少ない)、設計時に揉めるであろうことが予測されます

そこで、gRPCが用意しているメッセージオブジェクトと仕組みを利用することで、設計時に疲弊しなくて済みます

下の実装例

元記事を表示

Dockerを使用してgo環境を構築

今回は最近勉強しているDockerを使用してgo環境の構築を行いました。

1.Dockerfileを作成
“`FROM golang:latest
RUN mkdir /go/src/charts_server && apt-get update && apt-get install \
  -y vim
WORKDIR /go/src/charts_server
ADD . /go/src/charts_server
“`

・FROM golang:latest
  golangの最新版をベースにします。

・RUN mkdir /go/src/charts_server && apt-get update && apt-get install \ -y vim
  mkdirで作業場所の作成。エディタもインストールします。

・WORKDIR /go/src/charts_server
   Docker instructionの実行ディレクトリを/go/src/charts_serverへ変更。

・ADD . /go/src/charts_s

元記事を表示

Mac上でPythonかGolangでGUI開発環境を整えたい

またまた無職になった。
ニート期間中に技術力を上げるため、就職活動しながら勉強することにした。

# スクリプト言語の勉強
一昔前はPerl言語に熱中していたが、数年間離れた生活をしていた。
不倫したと思われたのか、一目Perl言語を見ただけでは理解できない感じにふてくされた態度を取られた。
構ってあげなかった私に問題があるのかもしれないが、このまま分かれようと思う。
一体いくらつぎ込んだのか分からないぐらい膨大な書籍代だが、私の一方的な貢ぎ方に問題があったと思って諦めることにする。
心機一転し、異なるスクリプト言語に本腰を入れようと思う。
しかし、まだ本命を決められないでいる。

## 本命選び
今の考えは2点ある。

* Python
* Golang

テキスト処理をしたいが、それはPerl言語をさておき、上記2点は優劣付けがたいようだ。
ちょっと触った感じでは、Go言語の方が馴染みやすかった。
如何せん、ちょっとした処理とは言え、数週間や数ヶ月後には使い方を忘れているかもしれない。
それでもテキスト

元記事を表示

GolangでJSONを受け取るAPIサーバーのサンプル

## サンプルコード

“`main.go
package main

import (
“encoding/json”
“fmt”
“net/http”
)

// 構造を宣言
type User struct {
Name string `json:”name”`
Age int `json:”age”`
}

func main() {
// POST
http.HandleFunc(“/post”, func(w http.ResponseWriter, r *http.Request) {
var user User
json.NewDecoder(r.Body).Decode(&user)

fmt.Fprintf(w, “%s is %d years old!”, user.Name, user.Age)
})

// GET
http.HandleFunc(“/get”, func(w http.ResponseWriter, r *ht

元記事を表示

Go初心者がDatastore・GAEを使用したクラウドネイティブなWebアプリを作成してみた

#はじめに
Qiita初投稿です。
IT業界に未経験で転職して半年が経ったので、これまでのGo言語学習の成果をアウトプットする為にWEBアプリを作成してみました。
今記事ではこのWEBアプリを紹介していきます。
(初学者ですので、誤っている点などがありましたら、是非コメントでご指摘ください:bow_tone1:)

##簡易4択問題集作成・学習アプリ
###1 デモ

– **WEBアプリurl**
https://workbook-292312.an.r.appspot.com/

– **WEBアプリのリポジトリ**
https://github.com/Gompei/WorkBookApp

###2 機能紹介・実装内容
####(1)アカウント機能
– **作成**
formから取得したアカウント情報を元に、Datastore内で発行した

元記事を表示

Control files to build in Golang project

# Background

We are developing a project that needs to run on Windows and Linux. The project is written in Golang. There are a lot of codes that can be shared between these OS, so we decided to make it in the same project. By this way we can speed up the development process very much.

In the project, there are some code files that run on Windows only, some run on Linux only, and some run on both Windows and Linux. And we want to separating them on build. It means:

– The binary for Linux will

元記事を表示

Golangのnet/httpでCORSを全許可するときにつけるヘッダー

“`golang

func handler(w http.ResponseWriter, r *http.Request) {
w.Header().Set(“Access-Control-Allow-Headers”, “*”)
w.Header().Set(“Access-Control-Allow-Origin”, “*”)
w.Header().Set( “Access-Control-Allow-Methods”,”GET, POST, PUT, DELETE, OPTIONS” )
“`

元記事を表示

QiitaのView数を取得する

初めに
===
QiitaのLGTM数とView数を取得するにあたって、
APIの仕様が変わったのか参考にさせていただいたもので取得できなかった箇所があったので、
取得方法を記載していきます。

環境
===
Go 1.15.2

1. アクセストークンを取得
===
[ユーザ管理画面](https://qiita.com/settings/applications)からトークンを取得
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487320/32f82553-49cb-0eb0-1675-b4403fbf83bb.png)

スコープはread_qiitaとwrite_qiitaを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487320/ca60a6a3-f579-4e4f-ac9e-15ff2e53e829.png)

2. 取得したい情報のURLを確認
===
[公式ドキュ

元記事を表示

GO言語でオブジェクト指向っぽいことをする

**追記**
Go言語にオブジェクト指向じゃない、これがGo風のオブジェクト指向です!
と言うと語弊があるようです
コメント欄に色々と指摘をいただいているので、そちらを確認いただければ幸いです

ディップ株式会社に中途入社してGo言語でAPIを作ってます。
今までPHPやRubyなんかのゆるっとしたオブジェクト指向言語がメインだったので毎日ヒーヒー言ってます。

そんな中でも前職の経験を活かせる機会があったので
今回は「前職の経験を活かしてGo言語のソースをいい感じにした」話をしようと思います。

## Go言語はオブジェクト指向じゃない

Go言語を扱っている方は当然ご存知かと思いますが、Go言語にオブジェクト指向なんてありません。
クラスも、継承も、コンストラクタもありません。
今まで培ってきたオブジェクト思考(誤字ではない)がまるでゴミのようです。

Goで実装するなら素直にGoっぽい実装をすべきなのでしょうが、そうは言っても「これオブジェクト指向だったらこう実装するのに」という考えがよぎるもの。
未練がましくネットで検索したところ「Go言語でオブジェクト指向っぽいこと

元記事を表示

Golangでcsvの要素をダブルクオートでくくる

## やりたいこと

[CSVファイルの一般的書式 (RFC4180 日本語訳)](http://www.kasai.fm/wiki/rfc4180jp)より

>(レコード中の) 各フィールドは、それぞれダブルクォーテーションで囲んでも囲わなくてもよい

とあるので、プロジェクトによってはダブルクォーテーションで囲っておこうぜ!ってなることもあると思います。私のところもそうでした。

なのでタイトル通り**golangでcsvの各要素をダブルクォーテーションでくくろう!**というのが、今回やりたいことになります。

しかし、golangの標準csv encoderだと、必ず”にはエスケープ文字として”が付くため、`”column”` → `”””column”””` になってしまうんですよね。さてどうしたもんか

## 結論

基本は[gocsv](https://github.com/gocarina/gocsv)を利用します。
[こんなencode処理](https://play.golang.org/p/jKr8EStJ2KQ)、こういう出力になります。

“`
client

元記事を表示

Goアセンブリ入門

この記事は [Chapter I: A Primer on Go Assembly](https://github.com/teh-cmc/go-internals/blob/master/chapter1_assembly_primer/README.md) を翻訳、加筆したものです。

この記事では以下のような人を想定しています。

– Go言語の文法を理解している
– サブルーチンコール時の一般的なスタックの挙動を理解している

環境

“`Bash
$ go version
go version go1.10 linux/amd64
“`

## 擬似アセンブリ

Goコンパイラが出力するアセンブリは、抽象化されたものであり、実際のハードウェアにマッピングされていません。 Goアセンブラはこの擬似アセンブリを対象のハードウェアに沿った機械語に変換します。

Javaのバイトコードのようなものを想像するとわかりやすいかもしれません。

このような中間層を設けることの最大の利点は新しいアーキテクチャに対応するのが楽になることです。
詳細を知りたい場合は、Rob Pike氏

元記事を表示

AtCoder Regular Contest 106のメモ

# 前置き

Atcoderをやってみたので、自分用のメモです。
あとから加筆・修正する予定です。

# 問題

https://atcoder.jp/contests/arc106

# A

“`Q_A.go
package main

import (
“fmt”
)

func main() {
var n int64
fmt.Scanf(“%d”, &n)

var count_a int64 = 0
var count_b int64 = 0

var a, b int64
flag := true
for a=3; a<=n; a=a*3{ count_a += 1 count_b = 0 for b=5; b

元記事を表示

Golangのos/execパッケージを利用するときのCD

– たとえば、2つ上の階層にあるディレクトリにあるMakefileを実行したいとき

“`golang

os.Chdir(“./../../”)
cmd := exec.Command(“make”, “ENV_FILE=.env”, “DOMAIN_NAME=vamdemic”)
“`

元記事を表示

ポインタについてのメモ(Go)

ポインタがどういうものなのか分からなかったので調べた。
今回はGoで書いた。

“`pointer_practice.go
package main

import (
“fmt”
“math/rand”
“time”
)

func main() {

x := 2
/* 変数xのアドレス(変数xが保存されているメモリの位置)を格納 */
/* ある変数のアドレスが格納された変数のことをポインタ変数という */
x_pointer := &x

fmt.Println(x)
fmt.Println(x_pointer)
/* ポインタ変数x_pointerに格納されたアドレスに存在する値を取得 */
/* メモリをjsのオブジェクト、アドレスをオブジェクトのキーと考えると メモリ[アドレス(x_pointer)] = 2 というイメージ */
fmt.Println(*x_pointer)

arg := 0
arg_pointer := &arg

test_pointer(arg_pointer)
/* 同じ結果になる */
fmt.Print

元記事を表示

GolangでPKI入門 – 4

#1. この記事の対象の人
– Golang で、証明書失効リスト( CRL )を作りたい人

#2. 概要
この記事では、
**1. Go で秘密鍵と証明書を生成**
**2. Go で失効させる証明書のリストを生成**
**3. Go で Issuing Distribution Point のExtensionを作成**
**4. Go で証明書失効リスト( CRL )を作成**
**5. OpenSSL で証明書失効リスト( CRL )の中身を確認**
します。

#3. Golang で自己署名 CA 証明書と秘密鍵を作成
証明書失効リストを発行する自己署名 CA の「証明書」と「秘密鍵」を作成します。
詳細な説明は、[GolangでPKI入門 – 2](https://qiita.com/tardevnull/items/1c81df51e5b7b5fb4243) を参照ください。
証明書失効リスト作成時に引数で必要になるので、秘密鍵はDER形式にしておきます。

“`go

//PrivateKey of Self Sign CA Certificate
priva

元記事を表示

OTHERカテゴリの最新記事