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

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

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

元記事を表示

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

元記事を表示

OTHERカテゴリの最新記事