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

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

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
)

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

return result
}

const (
idMyHotkey = iota
}

func onMessage(window win.HWND, msg uint32, wParam uintptr, lParam uintptr) ui

元記事を表示

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
)

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:
win.PostQuitMessage(0)
default:
return win.DefWindowProc(win

元記事を表示

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とか)

元記事を表示

Docker上のgolangから Oracle接続やってみました。

#はじめに
コロナ禍で自宅勤務になったので、今更ながらDockerやgolangでも使ってみようと思い少しお勉強してみました。
Qiitaで記事書くのも初めてなので優しくしてね(汗)
仕事ではOracleが多いのでgolangからOracleに接続を試みます。

#評価環境
 ホストOS:CentOS Linux release 7.7.1908 (Core)
 Docker:Docker version 19.03.8, build afacb8b
 DB Server:Oracle Database 11g Express Edition Release 11.2.0.2.0

#Oracleクライアント
 インスタントクライアントをOTN(Oracle Technology Network)からダウンロードします。
 今回は入手できた最新の19.6を使いました。
  instantclient-basic-linux.x64-19.6.0.0.0dbru.zip
  instantclient-sdk-linux.x64-19.6.0.0.0dbru.zip
  instantc

元記事を表示

gonumをインストールした時にエラーが出た話

### 何をしようとしたか
Goの数値計算パッケージgonumをローカル環境にインストールした後、テストを実行したらエラー発生

### 何をしたか
Goのバージョン変更

## 環境
Ubuntu: 18.04.4 LTS
Go: 1.10.4

## 起因
gonumをインストール後、公式gonumのイントロ*1)に従ってテストを実行します。

“`
go test gonum.org/v1/…
// 以下, 出力結果

FAIL gonum.org/v1/gonum/floats [build failed]
FAIL gonum.org/v1/gonum/graph [build failed]
FAIL gonum.org/v1/gonum/graph/community [build failed]
? gonum.org/v1/gonum/graph/encoding [no test files]
FAIL gonum.org/v1/gonum/graph/encoding/digraph6 [build failed]
FAIL gonum.org/v1/

元記事を表示

golang multi-stage build でscratchを使う際にタイムゾーンを設定する方法

## Dockerfile example :whale:

“`dockerfile
FROM golang:1.14.2-alpine3.11 AS builder
RUN apk –update-cache add tzdata
WORKDIR $GOPATH/src/mypackage/myapp/
COPY . .
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags=”-w -s” -o /go/bin/myapp

FROM scratch
COPY –from=builder /usr/share/zoneinfo /usr/share/zoneinfo
COPY –from=builder /usr/local/go/lib/time/zoneinfo.zip /usr/local/go/lib/time/zoneinfo.zip
COPY –from=builder /go/bin/myapp /go/bin/myapp
ENV TZ=Asia/Tokyo
ENTRYPOINT [“/go/

元記事を表示

【Golang】スライスと基底配列

# はじめに
まだGo言語初心者で学習中の身ですので、間違いや不適切な表現などがありましたら、ご指摘頂けると助かりますm(_ _)m

# スライスとは
– すべての要素が同じ型の可変長列
– 配列の要素の部分列(もしくは全部)を参照している。この配列のことを**基底配列**という

## スライスの構成要素
スライスは次の3つの要素を持つ。

– ポインタ
– スライスを通して到達できる配列の最初の要素を指している
– 長さ
– スライスの要素数
– 容量
– 長さはこの容量を超えることは出来ない。容量を拡張しなければ、スライスの開始から基底配列の最後までの要素数が容量となる。

# スライスの更新と基底配列
**スライスは、基底配列を参照しているため、スライスの要素を変更すると基底配列も変更される。**

例)配列aからスライスsを作成し、スライスsの要素を変更してみると、基底配列aも変更されている。

“`go
a := [3]string{“ruby”, “php”, “python”}
s := a[:]
s[0] = “b”
fmt.Println

元記事を表示

Float計算回路の(ry-その1.1(float値の16進数表記)

# 浮動小数点数の16進数表記を得る(SW)

前回
[Float計算回路のVerilog-HDL実装について -その1](https://qiita.com/Soleiyu/items/5bbb991de443e61e318e)

# 今回の内容
32bit float (single) が正しい値なのか
float値と16進表記値を相互変換するツールを作成する

cgo 使います
## 偉大な先駆者様(参考文献)
[浮動小数点数の内部表現を取得してみよう](https://qiita.com/nia_tn1012/items/d26f0fc993895a09b30b)

## コード全体
今回作成したコード

“`check.go
package main

/*
union {float f; int i;} uv;

int f2b(float inp) {
uv.f = inp;
return uv.i;
}

float b2f(int inp) {
uv.i = inp;
return uv.f;
}
*/
import “C”
import (
“fmt”

元記事を表示

クロージャと変数

##当記事の目的
最近Goの勉強を始めて、いまいち掴めないクロージャについて、
備忘録もかねて自分なりに整理した考えを記載しておこうと思います。

##クロージャとは
Go 言語 公式の「A Tour of Go」には以下の説明があります。
>Goの関数は クロージャ( closure ) です。
クロージャは、それ自身の外部から変数を参照する関数値です。
この関数は、参照された変数へアクセスして変えることができ、その意味では、その関数は変数へ”バインド”( bind )されています。

Goでは、**関数は第一級オブジェクト**として捉えています。
そのため、数値や文字列のように **関数そのものを変数に束縛や代入することも、引数または戻り値とすることができたりします。**
クロージャとは、この関数を戻り値とするもしくは引数とする際に、これらの関数を参照する値、情報を指している。
(以下でいうと、adder()の返す値がクロージャにあたる)

“`Function-closures.go
func adder() func(int) int {
sum := 0
re

元記事を表示

OTHERカテゴリの最新記事