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

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

GoでSubversionからパッケージをgo getして実行する(自マシン内完結型)

社内や個人でSubversionを使ってGoコードを管理しているGopherには朗報!?Go 1.14から、goコマンドはmoduleモードでSubversionリポジトリーをサポートしました。

しかしながら、具体的な手順がなかなか見つかりませんでした。そこで「**自マシン内のSubversionサーバーに登録されたGoの外部パッケージを、自マシン内で取得して実行する**」ことを色々と目標に試してみました。実際に動作した時は心の中でガッツポーツ!q@w@p

## Subversionサーバーの構築

自マシンに「[Subversion](https://subversion.apache.org/)」と「[Apache HTTP Server](https://httpd.apache.org/)」をインストールします。

Apache HTTP Serverには、Subversionと連動してHTTP/HTTPS通信でアクセスできる仕組みが用意されています。

今回は、諸事情によりno_ssl版のためHTTP通信でアクセスした場合の内容となっています。openssl版&HTTPS

元記事を表示

[Golang]envconfigで環境変数を扱う

# はじめに

Goで環境変数ってどうやって扱うのかを調べると、いくつかそれっぽいものを発見しました。

– [caarlos0/env](https://github.com/caarlos0/env)
– [spf13/viper](https://github.com/spf13/viper)
– [kelseyhightower/envconfig](https://github.com/kelseyhightower/envconfig)

viperがスター数では最も多いのですが、今回はシンプルな用途で探していたのでenvconfigを試してみました。

# 標準パッケージだとこうなる

外部のライブラリを使用せず、標準パッケージであるosを使用すると、

“`go:main.go
package main
import (
“fmt”
“os”
)
func main() {
val := os.Getenv(“VALUE”)
fmt.Println(“val is “, val)
}
“`

“`bash
$ VALUE=”HOGE” go run mai

元記事を表示

GoでGeneratorとWorkerのサンプル

大量のJobを捌くこんなケースのGoのサンプルです。

– (Jobの)Generator
– 生成処理が軽くて1つ
– 途中でコケたら全体を中断したい(それ以上Jobを生成しない)
– Worker
– それなりに重たい処理
– 横に複数並べてJobを捌きたい
– エラーが発生しても次のJobを継続(最後にエラーをハンドルする)

処理結果とエラーを持つResult構造体

“`go
// packageとimportは割愛

type Result struct {
s string
e error
}
“`

GeneratorはJobの数だけ値を入れてくチャネルを作って渡します。
時々コケると、途中で止めます。

“`go
func Generator(num int) <-chan int { ch := make(chan int) go func() { i := 0 defer close(ch) for num > 0 {
num–

// sometime happen error

元記事を表示

Go言語はerr != nilでもerrはnilである時がある

**突然ですが問題です。**
以下のコードを実行した時、”This should not be called”の文字列は出力されるでしょうか?

“`golang
package main

import “fmt”

type MyError struct {
}

// implements error interface
func (MyError) Error() string {
return “This is MyError”
}

func fn() (int, *MyError) {
return 42, nil
}

func main() {
result, err := fn()
if err != nil {
fmt.Println(“This should not be called”)
}
fmt.Println(result, err)
}
“`

### 実行結果

“`golang
42
“`

出てません。`fn()`はエラーnilを返しているので、`if err != nil`の中には入りません。
ここまではOK

元記事を表示

【LINE】既存LIFFアプリにShareTargetPickerを導入する

# はじめに
既存のLIFFアプリにShareTargetPickerを導入する方法を説明します。
GitHubは[こちら](https://github.com/yagi-eng/liff-reservation)。

## ShareTargetPickerとは?
以下が参考になります。
[Share Target Pickerがリリースされ、LIFFアプリからのメッセージ送信が大幅に強化されました。](https://engineering.linecorp.com/ja/blog/liff-share-target-picker/)

>Share Target Pickerとは、LIFFから送信先を選んでメッセージを送信することが出来る機能です。
これにより、
・トークルームやグループから開かれなかった場合でも、メッセージを送信できる
・LIFFアプリをLINE上で開いた場合だけではなく、ブラウザから開いた場合もメッセージを送信できる
・自分以外の友だちや自分が入っていないグループにもメッセージを送信させることができる
といったことが可能になります。

## サンプル
htt

元記事を表示

[Go言語] ContextのWithValueのkeyについて

## ContextのWithValueでのワーニング
ContextのWithValueで以下のようにstringを使おうとすると、“`should not use basic type string as key in context.WithValue“`のwarningが出てしまいます。

“`go
ctx = context.WithValue(ctx, “user”, user)
“`

調べてみたところ、WithValueを使っている場所で好き勝手にkeyを設定すると、key名が被ってしまう可能性があるのというエラーのようでした。とても親切ですね。

## 解決策
utilを作成して、そこでWithValueの処理を一括して行うように修正をしました。
ポイントは以下の4点になります

1. typeで“`valueKey“`を宣言する
2. constで必要な“`valueKey“`を宣言する
3. “`WithValue“`の関数の引数を“`valueKey“`にする

“`go
package ctxutil

import “context

元記事を表示

[メモ] Go言語でうるう年を判定する

へえと思ったのでメモ。
以下の記事を参考にした。

[Golang : How to determine if a year is leap year?](https://www.socketloop.com/tutorials/golang-how-to-determine-if-a-year-is-leap-year)

うるう年を判定するロジックを愚直に実装している記事は見かけるが、 [Time.YearDay](https://golang.org/pkg/time/#Time.YearDay) を使えば年間の日数が返ってくるため、うるう年かどうかが判定可能という事だった。
こちらの方が標準パッケージのロジックを再利用できてよさそう。

“`go
year := time.Date(y, time.December, 31, 0, 0, 0, 0, time.Local)
days := year.YearDay()

if days > 365 {
return true
} else {
return false
}
“`

元記事を表示

【Go】echoを使ってさくっとRoutingとTemplateを使いこなす

# はじめに
Goはインストールしてあるものとします。

REST APIを作りたい場合はこちらを参考にしてみてください。
[【Go】echoを使ってさくっとAPIサーバを構築する](https://qiita.com/yagi_eng/items/b06722dbd7a5652ec239)

# 準備
## ディレクトリ構成

“`
(任意のディレクトリ)
|- views
|-index.html
|- server.go
|- index.go
“`

## echoをインストール
echoをインストールします。

“`
$ go get -u github.com/labstack/echo
“`

# 実装
以下のように記述していきます。
initRoutingやinitTemplateはmain関数の中にまとめて記載しても問題ありませんが、分けておくとわかりやすいかと思います。

routingを増やしたかったら、

– initRoutingの中に `e.GET(“/”, hoge)` と一行追記
– 詳細は[こちらの公式](https://ech

元記事を表示

Go でプロセス間通信

MS が https://github.com/Microsoft/go-winio を公開しているので、これを使う。
以下がサンプル

“`go:server.go
import (
“fmt”
“io/ioutil”

“github.com/Microsoft/go-winio”
)

func main() {
pipeConfig := winio.PipeConfig{
SecurityDescriptor: “S:(ML;;NW;;;LW)D:(A;;0x12019f;;;WD)”, // SDDL Everyone
InputBufferSize: 4096,
OutputBufferSize: 4096,
}

listener, _ := winio.ListenPipe(`\\.\pipe\my-named-pipe`, &pipeConfig)
defer listener.Close()

for {
conn, _ := listener.Accept()
defer conn.Close()

bytes

元記事を表示

Go言語でハマったことメモ(slice・map・string)

Golangを始めました。

GolangはC言語のように、シンプルな文法・データ構造でできているのですが、同時に、生産性を高めるための、高度な概念も取り入られています。

そしてそのために、Golangには若干トリッキーな構文がいくつかあります。

しかし、それらを知らずに、他の言語での先入観や勝手な思い込みで判断してしまって、ハマることがちょいちょいありました。

ここでは、Golangを始めてみて、個人的にハマったことや、勘違いしたことを、トピック別に備忘録としてメモしていこうと思います。

ここでは、「スライス(slice)・マップ(map)・ストリング(string)」とは何ぞやについてのメモを記載しました。

## はじめに
Golangにはスライス、マップ、ストリングという、他の言語における配列、マップ、文字列のようなものがあります。

他の言語でよく見かけるが故に、よくあるやつでしょと何となくで使っていました。

しかし、Golangにはポインターと実体の概念があります。

値をポインターでやりとりする分には、実体は同じなのであまり気にすることはないのですが、代入で渡し

元記事を表示

Goでクリップボードからコピー&ペーストするライブラリ clipboard

Goでクリップボードにコピーしてある情報で色々やりたい時に便利なライブラリがありましたのでメモ。
メソッドはReadAllとWriteAllだけなのでシンプルです。

## 読み込み(ペースト)
“`go:
str, _ := clipboard.ReadAll()
“`

## 書き込み(コピー)
“`go:
clipboard.WriteAll(str)
“`

## サンプル
サンプルとして、クリップボードから読み込んだ数字の回数分がんばるぞい!するプログラムを作ってみました。

“`go:main.go
package main

import (
“fmt”
“strconv”

“github.com/atotto/clipboard”
)

func main() {
var str string
// クリップボードにコピーされている文字列を読み込む
str, _ = clipboard.ReadAll()
fmt.Println(“クリップボードから読み込んだ文字列:” + str)

var num int
result := “”
n

元記事を表示

Go言語のループ中でポインタ値を更新するときの落とし穴

# 問題

スライス`ts`をイテレートして、条件(ここでは単純に`t == “c”`)に合う値のポインタを見つけたいとします。

[The Go Playground](https://play.golang.org/p/Ynz4tHXglM2)

“`
func main() {
ts := []string{“a”, “b”, “c”, “d”, “e”}
p := &ts[0] // 初期値は”a”とする。
for _, t := range ts {
if t == “c” {
p = &t
}
fmt.Println(“current p = ” + *p)
}
fmt.Println(“final p = ” + *p)
}
“`

これで、

“`
current p = a
current p = a
current p = c
current p = c
current p = c
final p = c
“`

と出力されると思いましたか!?私は思いました。

残念ながら、こうなります。

“`
current p = a
c

元記事を表示

QiitaにCLIで投稿や更新できるツールを作った

# 概要

Qiita に CLI で投稿/更新するクライアントツールを作りました。

Qiita は一般公開/限定公開記事問わず、よく利用しています。記事をちょっと直して、投稿し直すこともままあるのですが、いちいち Qiita のエディタから投稿するのが面倒だったので、CLI で更新できると便利なんじゃないかと思い、2, 3日で作りました。

# Qiisync

以下に置いてあります。

https://github.com/d-tsuji/qiisync

logo.png

# どんなことができるか

Qiisync では以下の 3 つの操作をサポートしています。

– Qiita から記事のダウンロード
– Qiita へ記事を投稿
– Qiita へ記事を更新

## 記事のダウンロード (qiisync

元記事を表示

Go で Windows Service を作成する

[lxn / win の PR をマージしたやつ](https://qiita.com/manymanyuni/items/c41f5bf0fd141e299336)に、Windows Service 関連の API を追加したので、Golang で Windows のサービスプログラムの開発がまぁまぁ簡単にできるようになった。

後の人のために以下に載せておきます。

“`go:main.go
package main

import (
“os”
“syscall”
“unsafe”

“winut”
“github.com/blono/win” // Fork of lxn/win see https://qiita.com/manymanyuni/items/c41f5bf0fd141e299336
)

func registerService() {
scManager := win.OpenSCManager(nil, nil, win.SC_MANAGER_CREATE_SERVICE|win.SC_MANAGER_LOCK)
if scManager

元記事を表示

GO言語学習ノート(1)変数型

環境
Windows10
Visual Studio Code (Go for Visual Studio Code,Code Runner)
golang 1.14

##1、変数
  静的型付き言語として、go言語はいつも固定的なデータ型を持ち、データ型は変数のメモリ領域上の大きさや保存タープを決める。一旦決まったら、変数値は変更できるが、変数型は変更できない。**型変換やポインタ操作によって、様々な方法で変数値を変更できるが、これは変数型を変更することを意味するものではない**。

###1.1 定義
  varを用いて変数を定義する。但しC言語などと違い、変数型は変数名の後に置かれる。実行時、変数の初期値は二進数の零値を渡す。明示的に初期値を提供すれば、変数型を省略できる。

“`
var x int  //初期値は0
var y = true //自動的に変数型をbool型と推定する
“`
多変量を一気に定義することも可能であり、異なる初期値や型も含まれる

“`
var x,y int   //同じ型の多変量定義
var z,w =”abc

元記事を表示

[Go言語] GORMを使った単体テストでのDBの初期化

# はじめに
GORMにはLaravelにあるような、DBのリフレッシュが用意されていません。
そのため、DBの単体テストをするためには自分でプログラムを準備する必要があります。

## 前提
まず単体テストをしたい関数ですが、以下のような全件取得するものサンプルとします。
DDDで作っているので、Structを使っていますがこの記事には関係ありません。

“`go
type userPersistence struct {
db *gorm.DB
}

func NewUserPersistence(r Repository) repository.UserRepository {
return &userPersistence{r.GetConn()}
}

func (bp bookPersistence) GetAllBook() ([]entity.Book, error) {
var books []entity.Book
err := bp.db.Find(&books).Error
if err != nil {
log.Error(err.Error(

元記事を表示

Azure SDK for Goを使う上での開発者向けツール

「[Azure SDK for Go documentation](https://docs.microsoft.com/ja-jp/azure/developer/go/)」サイトの「[Tools for developers using the Azure SDK for Go](https://docs.microsoft.com/ja-jp/azure/developer/go/azure-sdk-tools)」ページを読み進めました。

本セクションでは、Azure SDK for Goを使用する上でGoコードを効率的に記述したりAzureサービスとシームレスに連携したりする開発者向けツールが紹介されています。

ここでは、対象ページの内容をベースとして、私なりの解説を加えてみます。

### Azure CLI

AzureにはAPIを操作する方法として、WebブラウザーでログインしてのGUI操作、Azure SDKを使ってのコード操作の他に、Azure CLIによるコマンドライン操作が用意されています。

– [Install the Azure CLI](https:/

元記事を表示

Visual Studio Code で編集中のテストコードを実行する (Golang編)

# TL;DR

[Visual Studio Code で編集中のテストコードを実行する](https://hakobe932.hatenablog.com/entry/2017/11/10/120000)

 この記事にいたく感動したので**Go言語**でもショートカット一発で任意の関数をテストしたくなった!

# できばえ

– 開発言語非依存にしたかったので**シェルスクリプト**で実装しました
– 関数名を定義した行に移動するのがめんどいかったので**コードの途中からでも**出来るようにしました

![pic.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189193/45e4268b-13fe-3ed2-d0a2-5772cb0829f1.png)

# やりかた

・以下、**gotet.sh**をプロジェクト名フォルダの下に置いてください

gotest.sh

“`
relativeFile=$1
lineNumbe

元記事を表示

ubuntu に apt で golang をインストール

# ubuntu に apt で golang をインストール

## 手順

“`
sudo add-apt-repository -y ppa:longsleep/golang-backports
sudo apt update -y
sudo apt install -y golang-go
“`

※ -y をつけて自動でインストールできるようにしている。

## メモ

ubuntu 19.10 では go 1.14.2 がインストールされた (2020/4/26 現在)
ubuntu 20.04 では go 1.13.8 がインストールされた (2020/4/26 現在)

## リンク

https://github.com/golang/go/wiki/Ubuntu
https://launchpad.net/~longsleep/+archive/ubuntu/golang-backports
https://github.com/longsleep/golang-deb
https://go.googlesource.com/go
https://qiit

元記事を表示

Go で競技プログラミングをやるためのツール

Go で競技プログラミングをするとき、綺麗なコードを提出できるツールを作ったので紹介します。

リポジトリはこちら: https://github.com/murosan/gollect

## ツールの目的

Go で競技プログラミングする場合、皆さんは自分で実装したライブラリを予め用意していると思います。

では、それらをどのファイルで管理していますか。また提出するときどうしていますか。
全部 `main.go` に書いてそのまま提出していますか?

それでも基本的に問題はないわけですが、提出したコードを振り返ってみたとき「汚い..」と感じたことはありませんか?
それに、同じファイルに全て書くのはメンテナンスするのが大変です。

そこで作ったのがこのツールです。ざっくり以下のことを行います。

– [golang.org/x/tools](https://github.com/golang/tools) に AST を解析してもらう
– 必要な宣言だけ抽出する
– 一つのファイルにまとめる
– [gofmt](https://golang.org/pkg/go/format/) を

元記事を表示

OTHERカテゴリの最新記事