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

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

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/) を

元記事を表示

GraphQLのType別gqlgen自動生成結果一覧

# お題
表題の通り。備忘録として。

# 開発環境
## # OS – Linux(Ubuntu)
“`
$ cat /etc/os-release
NAME=”Ubuntu”
VERSION=”18.04.4 LTS (Bionic Beaver)”
“`

## # 言語 – Golang
“`
$ go version
go version go1.13.9 linux/amd64
“`

## # ツール – gqlgen
“`
$ gqlgen version
v0.11.3-dev
“`

# 結果
今回のソースは下記。
https://github.com/sky0621/study-gqlgen/tree/v0.1/types

## Null”不可”のケース

| 型名 | GraphQLスキーマ上の定義 | gqlgen自動生成後の型 | 備考 |
|:—-|:———————|:——————-|:—-|
| ID型 | ID! | string | Uniqueであることが前提 |
| UT

元記事を表示

コンテナ内で動くGoのWebアプリケーションをリモートデバッグする

コンテナ内のGo製Webアプリケーションをリモートデバッグする方法をまとめています。
ハマった点とその回避策も載せています。解消策などありましたら教えていただけると嬉しいです。

## TL;DR

* [Delve](https://github.com/go-delve/delve)というデバッガーを使うと、リモートデバッグができる
* [Realize](https://github.com/oxequa/realize)というタスクランナーと組み合わせる場合は、いくつか回避策が必要になった
* リモートデバッグのクライアントにはGoLandを使用した(他のエディタも対応状況は[こちら](https://github.com/go-delve/delve/blob/master/Documentation/EditorIntegration.md)を参照)

## サンプルコード

この記事にあげているコードは、こちらにあります。
[bellwood4486/sample-go-containerized-debug](https://github.com/bellwood448

元記事を表示

cc1.exe: sorry, unimplemented: 64-bit mode not compiled inの解決(Windows)

# はじめに
Go言語の勉強中、`go get -u github.com/mattn/go-sqlite3`を実行しようと思ったらこんなエラーが

“`sh
cc1.exe: sorry, unimplemented: 64-bit mode not compiled in
“`
まーたこんなエラーだよ…とすべてを投げ出したい気持ちを抑えて、とりあえずエラー文で検索して解決まで至りました

# いざ解決
とりあえずこのまま調べるとgithubのこんなページを発見
参考ページ

どうやら**MinGWの64bit版**をインストールしろ、とのこと。
自分はMinGWはインストールしてたつもりだが、32bit版でこんなエラーが出たんだと思う
MinGW-w64のダウンロード方法
**注意!**
インストールの際、青で囲った部分に注意しましょう

元記事を表示

【Go】echoを使ってさくっとAPIサーバを構築する

# はじめに
Goはインストールしてあるものとします。
echoはGoの軽量フレームワークとして有名です。

Goはフレームワークが群雄割拠しているので、一強なものがあるとわかりやすくていいですよね。
JavaのSpring、RubyのRails的な。

# echoの動作確認
## echoをインストール
echoをインストールします。

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

## Hello, World!
任意のディレクトリに以下のファイルを作成します。

“`go:server.go
package main

import (
“net/http”

“github.com/labstack/echo”
)

func main() {
e := echo.New()
e.GET(“/”, func(c echo.Context) error {
return c.String(http.StatusOK, “Hello, World!”)
})
e.Logger.Fatal(e.Start(“:132

元記事を表示

Go でホットキーを登録する(RegisterHotKey)

[Go で GUI を表示する(RegisterClassEx/CreateWindowEx/GetMessage)](https://qiita.com/manymanyuni/items/df3f8845d98d1f1a0735)

前回の上記の記事に RegisterHotkey を付け足すだけで、Go でグローバルホットキーに対応できる。
後の人のために残しておく。

“`go:main.go
package main

import (
“syscall”
“unsafe”

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

func NewUTF16(s string) *uint16 {
result, _ := syscall.UTF16PtrFromString(s)

return result
}

const (
idMyHotkey = iota
}

func onMessage(wi

元記事を表示

Go言語のtemplateは何がツラいのか?

# はじめに
Go言語でWebアプリを作れるのか調べていたところ、公式のテンプレートエンジンではツラいとあったが、何がツラいのかいまいちわからなかったので、調べてみました。

# ツラいこと
1. templateでレイアウトを継承できない
2. templateごとにstructを定義しなくてはならない
3. Viewの関数が用意されていない

## 解決作
> templateでレイアウトを継承できない

これには以下のようにテンプレートを分けて定義して、挿入することで解決できます

“`go
package main

import (
“os”
“text/template”
)

func main() {
t := template.Must(template.New(“”).Parse(templ))
template.Must(t.Parse(content))
if err := t.Execute(os.Stdout, nil); err != nil {
panic(err)
}
}

// 実際は別ファイル
const templ = `ベース

元記事を表示

Go で GUI を表示する(RegisterClassEx/CreateWindowEx/GetMessage)

Go で Win32 を呼び出すコードを書き始めている。
とりあえずウィンドウを表示できたので、後の人のために残しておく。

“`go:main.go
package main

import (
“syscall”
“unsafe”

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

func NewUTF16(s string) *uint16 {
result, _ := syscall.UTF16PtrFromString(s)

return result
}

func onMessage(window win.HWND, msg uint32, wParam uintptr, lParam uintptr) uintptr {
switch msg {
case win.WM_CLOSE:
win.DestroyWindow(window)
case win.WM_DESTROY:
wi

元記事を表示

lxn / win の PR をマージしたやつ

Go で Win32 を使えるようにしてくれているまごうことなき神ライブラリである https://github.com/lxn/win
放置気味なのか PR でマージされていないものがいくつかあった(RegisterHotKey とかいろいろ)ので、fork して全部 merge してみた。
https://github.com/blono/win

さらに CreateFile/ReadFile/WriteFile/SetWindowSubclass/サービス関連とか未実装の API もいくつか追加しておいた。

元記事を表示

yukicoder contest 245 参戦記

# yukicoder contest 245 参戦記

## [A 1033 乱数サイ](https://yukicoder.me/problems/no/1033)

問題を見た瞬間に、K ってなんのためにあるんだろうと思ったが、やっぱり要らなかった(笑). 0~Nの平均値は0~Nの合計値をN+1で割ったものなので (0 + N) * (N + 1) ÷ 2 ÷ (N + 1) なので、N ÷ 2 となる.

“`python
N, K = map(int, input().split())

print(N / 2)
“`

## [D 1036 Make One With GCD 2](https://yukicoder.me/problems/no/1036)

SegmentTree の GCD 版を持っていたので瞬殺だった(笑). 基本は尺取法. GCD が1になったらそこから先はどれだけ進めても1なので、GCD(Ai, Ai+1, …, Aj) で初めて1になったのであれば、Ai

元記事を表示

Go から Windows の MessageBox を呼び出す

Go + Qt は[前回の記事](https://qiita.com/manymanyuni/items/a28acb545200f1f45c79)から実用は難しそうなので、結局 GUI は Win32 API をたたく方向にした。
Windows でしか動かなくなるが、自分はサービスを作ったり Hotkey 登録したり API フックしたりいろいろやりたいけど C++ 使うほど大仰にはしたくないって用途なのと Go に対して C++ と同じレベルのポテンシャルを感じているので Go を使いたいってだけなのでこれでよしとする。

一から作るよりはある程度あったほうがいいので、以下を利用する。
https://github.com/lxn/win

“`go:main.go
package main

import (
“syscall”

“github.com/lxn/win”
)

func UTF16PtrFromString(s string) *uint16 {
result, _ := syscall.UTF16PtrFromString(s)

return r

元記事を表示

therecipe/qt を用いて Go から GUI を利用する方法(Windows/Mac)

[https://github.com/therecipe/qt](https://github.com/therecipe/qt) を用いて Go から Qt を使うための環境構築のメモ。

まずはじめに書いておかなくてはいけないのは、このライブラリは Qt の大部分をカバーしているらしく、それを Go から利用でき Mac/Windows/Linux でも動作するとてつもなく有益なライブラリであると言うこと・・ただ一つの弱点をのぞいて・・。

それは、ビルドに時間がかかりすぎると言うこと。
参考までに、2014 モデルの MacBook Air で超簡単なサンプルを実行(go run/go build)するのに 30 秒、Windows だと 2 分強(Core i7 4770k/MEM16GB)
いろいろ調べてみたけどこれはもうこう言う物らしい。
C++ だとインクリメントビルドがあるからクリーンビルドとかするとこのくらいかかるのかもしれないけど、通常だと 5 秒くらいだと思われ、Go の長所であるコンパイル速度がここまで跡形もなく消えて無くなっているのはほとんどの人には受け入れ

元記事を表示

ワイ的Goのプロジェクトのパッケージ割りはこれだ

## はじめに
goのパッケージ割りって悩みますよね。。
githubにもデフォルトのパッケージ割りが公開されていますが、webにそのまま使える訳でも無く、いろんな記事を見て実際に落とし込んだ**ワイ的ベスト(現段階)パッケージ割り**を紹介します!
(増田さんも「goはDDDに向かない」と仰っていましたね。。w)

## TIDL(長くは無いけど)

“`
.
├── Dockerfile
├── Makefile
├── README.md
├── bin //プロジェクトで使うバイナリ(wireとか)
├── cmd //エントリポイント
│ ├── app
│ │ ├── main.go
│ │ ├── wire.go
│ │ └── wire_gen.go
│ └── batch
│ ├── main.go
│ ├── wire.go
│ └── wire_gen.go
├── config.yaml
├── docker-compose.yaml
├── docs // ドキュメント(swaggerとか)

元記事を表示

OTHERカテゴリの最新記事