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

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

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) |コネク

元記事を表示

環境構築, Buildまで -Go編-

# Goについて

静的型付けプログラミング言語として急速に人気が向上しているGo言語(Golang)。

## 1. インストール
https://golang.org/dl

go コマンドを使用する。
正常にインストールされていたら、以下のような結果が表示がされます。

“`
Go is a tool for managing Go source code.

Usage:

go <command> [arguments]

The commands are:

bug start a bug report
build compile packages and dependencies
clean remove object files and cached files
doc show documentation for package or symbol
env print Go environment information
fix update packages

元記事を表示

Goで再帰クロージャを実装

# はじめに
Go言語の勉強version2ということで、アルゴリズムの勉強をGoでやってみたというものです。

## 再帰クロージャ
まず、クロージャとはなのですが、下記に参考にした文を記載致します。

>Goの無名関数は「クロージャ」です。クロージャは日本語では「関数閉包」と呼ばれ、関数と関数の処理に関係する「関数外」の環境をセットにして「閉じ込めた(閉包)」ものです。

ということで、無名関数を表しています。今回はこれを使用し再帰関数を作成してみることから始めました。

1. 下記に階乗を計算する関数[func fact (n int) int]を作成してみました。

“`fact.go
package main

import (
“bufio”
“fmt”
“os”
)

func main() {
r := bufio.NewReader(os.Stdin)
w := bufio.NewWriter(os.Stdout)
defer w.Flush()

var a int

fmt.Fscan(r, &a)

result := solveFact(

元記事を表示

Go Modules(vgo)について

##Go Modulesとは
Goの依存関係管理ツールです。一昔前まではdepが多く使われていましたが、Go1.11から導入され、多く使われているそうです。

ちなみに、Go1.13から本格的に導入で、Go1.11~1.12は移行期ということなので該当している場合は、バージョンアップします。また、下記のコマンドで環境変数の確認をし、**GO111MODULE**を**on**にすることでも使えるようになるようです。

“`
$ go env
GO111MODULE=”on”
GOARCH=”amd64″
GOBIN=””
.
.
. //下に続く
“`

##Go Modulesの使い方
実際にプロジェクトを作るところから一連の流れに沿っていきます。まず、任意のディレクトリで任意のディレクトリで新規にプロジェクトを作成します。

また、Go Modulesを使う場合、GOPATH外でも置くことは出来ますが、保存先はGOPATH下になるそうです。→[参考記事](https://qiita.com/propella/items/e49bccc88f3cc2407745#go-modu

元記事を表示

Go言語で簡単な画像処理のツールの類をつくってみた。

Go言語初学者です。普段の生息界隈はJS/TS+Javaですが、サーバーサイド言語の処理をもっと得意になりたいという理由から、今年からGo言語に挑戦しています。挑戦理由は「モダン, マルチスレッド, コンテナ関連での活躍」が挙げられます。

やはり、実際に何かを作って習得していくスタイルが自分には合っているので、今回は「画像処理」をテーマに、CLIとしてもAPIとしても使えるツール[yellow-high5/pictar](https://github.com/yellow-high5/pictar)を作ってみました。画像処理といってもCNNを使って画像認識させるような高度なものではないです。

  

## Go標準のimageパッケージ

まずは[Go標準のimageパッケージ](https://golang.org/pkg/image/)がどんな仕組みになっているか簡単に確認してみました。

### [Point](https://golang.org/pkg/image/#Point), [Rectangle](https://golang.org/pkg/image

元記事を表示

OTHERカテゴリの最新記事