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

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

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言語で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著の [*The

元記事を表示

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】Alpine Docker で実行すると error: stdlib.h: No such file or directory. “stdlib.h” が足りないと言われる

> `golang:alpine` の Docker イメージで `go run` や `go test` を実行すると `stdlib.h: No such file or directory` の `fatal` エラーで叱られる。

[「”golang” “alpine” fatal error: stdlib.h: No such file or directory」とググって](https://www.google.com/search?q=%22golang%22+%22alpine%22+fatal+error%3A+stdlib.h%3A+No+such+file+or+directory)も日本語で情報が出てこなかったので。

“`bash
$ go test ./…
Testing main package
go: downloading …

# runtime/cgo
exec: “gcc”: executable file not found in $PATH
FAIL github.com/KEINOS/Sample [build fai

元記事を表示

Goで使えるファイルタイプ

Goでは、**拡張子.goはGoのソースファイル**。というふうにGoが認識するファイルタイプが決まっています。

また、テストを記述するファイルを作成するときに末尾につける**_test.go**もGoが認識するファイルの種類の一つとして、特別に扱われます。

##拡張子.go
Goのソースファイルのこと

##拡張子.c, .h
Cのソースファイルのこと

##拡張子.cc, .cpp, .cxx, .hh, .hpp, .hxx
C++のソースファイルのこと

##拡張子.m
Objective-Cのソースファイルのこと

##拡張子.s, .S
アセンブラソースファイルのこと

##拡張子.swig, .swigcxx
SWIGを定義するファイルのこと

##拡張子.syso
システムオブジェクトのファイルのこと

##最後に
これらは他のプログラミング言語との連携の際に使われるものです。それぞれGoで特別な役割があるということですね。いつどこで使うのかもこれから経験していきたいところです!

元記事を表示

[Go] 画像の拡張子の変更をするCLIコマンドを作る

# はじめに
このまえ、**[Gopher道場](https://gopherdojo.org/)** の自習室とやらに参加させてもらい、前々から気になっていたGopher道場の課題をgithubにて探して、(やっていいのかな…?)演習しました。

その課題1ってのが**画像の拡張子変更** でした。とりあえずアウトプットをしたいので、ここに色々書いていきます。また、使用したパッケージから、`flag`,`os`,`path/filepath`,`image`について、ちょっとだけ解説していきます。

## 環境
“`
# go version
go version go1.15.2 linux/amd64

# tree
.
|- conversion
| |- conversion.go
|- go.mod
|- main.go
“`

## 実際のコード
とりあえず、リポジトリは[ここです](https://github.com/marnysan111/gopherdojo-studyroom/tree/kadai1-marny/kadai1/marny)

元記事を表示

solidity で書かれたスマートコントラクト用の golang バインディングコードを生成する

## はじめに
golangを使用してEthreumに接続する場合、Ethereumのスマートコントラクトをgolangから直接実行するバインディングコードを生成すると簡単です。
一昨年から昨年にかけて、Ethereumのスマートコントラクトを利用したエスクローサービスを制作した際にもこの方式で実装しました。

## やってみよう

#### 必用ソフト
| ソフト | 説明 | インストール方法 |
|:———–|:————|:————-|
| solcjs |Solidity用のJavaScriptバインディング|npm install solc|
| abigen |ABIベースのgolangバインディング
※ gethに付属|go get github.com/ethereum/go-ethereum
cd $GOPATH/src/github.com/ethereum/go-ethereum
go install ./cmd/abigen|

#### バインディングコードを生成するスマートコン

元記事を表示

golang から Azure KeyVault を使ってデータを暗号/復号する

## はじめに
以前 golang から Azure KeyValut を使用してデータを暗号化するのに、資料がなくて困ったので簡単にまとめました。

## やってみよう

#### 必用なもの
* Azureアカウント
* Azure KeyValut用プリンシパル

#### KeyVault暗号/復号用コード

まずは Azure 認証用のコードです。
NewAuthorizerFromEnvironment() での認証には以下の環境変数が必用です。

|環境変数|説明|
|—–|—–|
|AZURE_TENANT_ID|AzureのテナントID|
|AZURE_CLIENT_ID|AzureのクライアントID|
|AZURE_CERTIFICATE_PATH|認証用証明書のパス|
|AZURE_CERTIFICATE_PASSWORD|認証用証明書の復号パスワード|

“`go:azure.go (azure認証用コード)
package auth

import (
“log”

ka “github.com/Azure/azure-sdk-f

元記事を表示

Dataloadersを使ったN+1問題への対応

# お題
Golang製GraphQLライブラリである[gqlgen](https://github.com/99designs/gqlgen)の「[Dataloaders](https://gqlgen.com/reference/dataloaders/)」を使って、N+1問題(ググるとわんさか記事が出てくる)を解決する。

# 想定する読者
– Golangについてある程度書ける。
– 「GraphQL is 何?」ではない。
– gqlgenの [getting-started](https://gqlgen.com/getting-started/) で初期セットアップくらいはやったことがある。

# 関連記事索引
– 第11回「[Dataloadersを使ったN+1問題への対応](https://qiita.com/sky0621/items/621f075e4257270a9e02)」
– 第10回「[GraphQL(gqlgen)エラーハンドリング](https://qiita.com/sky0621/items/affc833e770fee8b576e)」
– 第9回

元記事を表示

Goでローカルサーバーを立てた~ファイルダウンロード~

初めに
===
Androidアプリからリクエストを投げて、GoでWebServerを立てたローカルサーバー上のファイルをダウンロードする

環境
===
PC Windows10
Android Studio 4.0
Kotlin 1.3.72
Android端末 Emulator(API Level 29)
Go 1.11.1

構成図
===
![go_server.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487320/e8771fc0-f61a-3472-8ab4-5f998bb3e704.png)
Androidアプリからファイル名を指定して、サーバー側にリクエスト、サーバー側に保存されているファイルとステータスコードを返却

実装
===
ローカルサーバー

“`Server.go
package controllers

import (
“fmt”
“io/ioutil”
“net/http”
“os”
“strconv”
“strings”
)

fu

元記事を表示

Goの基本型について

##基本型
###論理値型
論理値はbool型で表します。下記のように、真の場合は**true**、偽の場合は**false**の値をとる動作をします。また、型推論での定義もできます。

“`
var a bool //変数aをbool型で定義
a = true //変数aにtrueを代入
“`

“`
a := true
“`

###数値型
数値型には整数型が用意されており、**符合付き整数型**と**符合なし整数型**の2つの型が用意されています。

符合付き整数型は“`int8“`、“`int16“`、“`int32“`、“`int64“`の型があり、数値がサイズを表しています。
符合なし整数型は“`uint8(byte)“`、“`uint16“`、“`uint32“`、“`uint64“`の型があり、同様に数値がサイズを表しています。符合付きと違う点として、“`uint8“`は“`byte“`型という別名でも定義することができ、uint8と同じ動作をします。

また、64bit実装のGoでは“`int“`型は“`i

元記事を表示

【Go言語】Elm ArchitectureでTUIアプリが作れるbubbleteaでちょっとリッチなToDoアプリを作る

# はしがき

本記事ではElm Architecture likeにTUIアプリを作成できる[bubbletea](https://github.com/charmbracelet/bubbletea)というフレームワークを使ってToDoアプリを作っていきます。

タスク/完了したタスク一覧表示、追加、編集、完了、削除を行うことができます。
イメージ画像↓
![イメージ画像](https://i.gyazo.com/ffc1cc0b2ac62492cf33d945fe5775be.gif)

## Elm Architectureについて

Elm Architectureを知らない方は[公式ガイド(日本語訳)](https://guide.elm-lang.jp/architecture/)や[この記事](https://qiita.com/kazurego7/items/27a2b6f8b4a1bfac4bd3)をざっと読んでからにしたほうが理解がしやすいかと思います。(本記事ではElm Architectureの解説は殆どしません。)

筆者はElmを少し触ったことある程度なの

元記事を表示

[Go]Sentryに対応したcustom errorの作り方

# はじめに

go v1.x の 標準erorrはシンプルなゆえに欲しい機能が足りていない事が多く
標準errorをより使いやすくした[`pkg/errors`](https://github.com/pkg/errors)等が存在しますが、それでもerror自体に特定のステータス(status codeやerror levelなど)を保持したい場合等はそれ専用のcustom errorを作る事になると思います。

それ自体は良いのですが、errorが発生した際にそのerrorをSentryに通知したい場合
`sentry-go`の[`CaptureException()`](https://godoc.org/github.com/getsentry/sentry-go#Client.CaptureException)ではStacktraceの取得に以下のpackageを使用する事が前提になっています。
– [pingcap/errors](https://github.com/pingcap/errors)
– [pkg/errors](https://github.com/pk

元記事を表示

DBコネクションプールをgolangで実現

#初めに
GCPをつかっていてコネクションプールの話に行き着きました。
「最大コネクション数が100を超えました」というエラーが発生。
なぜコネクション数が多くなってしまうのかを調べ、見つけた対処方法となります。

#環境
クラウド:GCP
WEBサーバーをVue/CloudRun
APIサーバーをGolang/CloudRun
DBサーバーをMySQL/CloudSQL

#原因

“`
APIを叩くたびにAPIサーバーとDBサーバー間で新しいコネクションができているから
“`

と判明した。

つまり、コネクションの使い回しができていなかった。

#対策

database.sqlの以下のメソッドを使用し、コネクションプールの設定を行う。
また、ORMでもコネクションプールできるらしい。

| メソッド名| 説明 |
|:-:|:-:|
|func (db *DB) SetMaxOpenConns(n int) |接続の最大数を設定。 nに0以下の値を設定で、接続数無制限。 |
|func (db *DB) SetMaxIdleConns(n int) |コネク

元記事を表示

OTHERカテゴリの最新記事