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

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

Golang 基礎 メモ part1

## パッケージ管理
初期化。go.modファイルが作成される。

“`
go mod init github.com/${GITHUB_USER}/${PROJECT_NAME}
“`
あとは go get するだけ。

## 実行環境(docker)
main.goがあるディレクトリに以下を置く。(go.sumは1回でもgo getしてる場合のみCOPYする)

“`dockerfile:Dockerfile
FROM golang:alpine

WORKDIR /go/src/app

COPY go.mod .
# COPY go.sum .
RUN go mod download

COPY . .
“`
“`yml:docker-compose.yml
version: “3.7”

services:
goapp:
build: .
tty: true
volumes:
– .:/go/src/app
“`
以下のコマンドでコンテナの中に入る。(goappはサービス名)

“`
~% docker-compose up

元記事を表示

ProxyConnectHeaderを使ってhttp.ClientによるCONNECTメソッドにヘッダーを付加する

## 事象
Go 1.14.2の環境で、認証Proxyを経由して任意のサイトにアクセスするHTTPクライアントを実装していたところ、接続先がHTTPSのときに認証proxyから407が返ってしまいました。

“`go:再現コード(main.go)
func main() {
u, _ := url.Parse(“http://127.0.0.1:3128”) // ローカルにsquidを立て、認証Proxyとした
req, err := http.NewRequest(“GET”, “https://yahoo.co.jp”, nil)
if err != nil {
log.Fatal(err)
}
req.Header.Add(“Proxy-Authorization”, “Basic “)
c := &http.Client{
Transport: &http.Transport{
Proxy: http.ProxyURL(u),
},
}
resp, err := c.Do(req)
if err !=

元記事を表示

Go言語アプリのDockerイメージをscratchで軽量化してみた

こんばんは、ねじねじおです。

Go言語で書いたアプリの Docker イメージを軽量化するには、マルチステージビルドを使って scratch をベースに構築するのがよいと聞いて、やってみました。

## 準備

まず、サンプルとして小さな Web API を echo で作ります。

“`sh
$ mkdir app
$ cd app
$ go mod init example.com/example
$ go get github.com/labstack/echo/v4
“`

下記のディレクトリ構成で server.go と Dockerfie を追加します。

“`
-example
 |-app
│-Dockerfile
│-go.mod
│-go.sum
|-server.go
“`

“`golang:server.go
package main

import (
“net/http”
“time”

“github.com/labstack/echo/v4”
“github.com/labstack/echo/v4

元記事を表示

Goを使ってコマンドプロンプト(cmd)のコマンドを実行

## GoはPythonみたいに使えてしかも環境に合わせたバイナリを作成してくれるやばい言語

最近Goにはまっていまして単純なことをしようとしてもちょっと詰まったりしたので
備忘録としてここに残しておきます。

## Goを使ってコマンドプロンプト(cmd)のコマンドを実行
以下で実行できます。あらかじめcmdを**「cmd /C」**しておくところがポイントです。

“` go
package main

import (
“fmt”
“os/exec”
“time”
“log”
)

func main() {
out, err := exec.Command(“cmd”, “/C”, “echo hello > test.txt”).Output()
if err != nil {
log.Fatal(err)
}else{
fmt.Println(out)
}
}
“`

## 改訂履歴
– 2020/8/10 新規作成

元記事を表示

Goのfyneで日本語を文字化けさせない手っ取り早い方法

## fyneでサンプルアプリを動かそうとしたら文字化けに遭遇

GOについて暇さえあれば勉強している私です。将来的にはGUIのアプリで設定ファイルを作成するものを製作し会社のサービスとして提供する予定です。

そのためによいGUIのライブラリはないかと探していたところ[fyne](https://github.com/fyne-io/fyne)を見つけました

早速以下のようなサンプルを以下の環境で作ったところフォントが文字化けしました。

– OS:Windows10
– Go:go version go1.14.7 windows/amd64

“` go
package main

import (
“fyne.io/fyne/widget”
“fyne.io/fyne/app”
)

func main() {
app := app.New()

w := app.NewWindow(“こんにちは”)
w.SetContent(widget.NewVBox(
widget.NewLabel(“こんにちは Fyne!”),
widget.NewButton(

元記事を表示

Github ActionsでGoのCI環境を作成する

# はじめに
みなさんCIしてますか?
ちなみに僕はCIは大好きですが、それの環境構築をするのは大嫌いです。
毎回細かい設定をしたり、ごちゃごちゃといろんなことをやらなければいけないのは本当に憂鬱です。
ということで今回は新しくサービスを作成するときに必要であろうGoのアプリケーションのCIをGithub Actionsで簡単にやりたいと思います!

# Github Actionsについて簡単に、、、
Github ActionsはGitHubが2019年11月に正式に公開したGitHub上のリポジトリやイシューに対するさまざまな操作をトリガーとしてあらかじめ定義しておいた処理を実行できる機能です。
これまでの

– Circle CI
– Jenkins

の兄弟みたいな物だと思ってもらえるといいと思います!

またGithub Actionsは `.github/workflows/`配下にymlファイルを作成することで処理を実行してくれます

“`
├── .github
│   └── workflows
│   └── ci.yml
“`

# 今回のゴール

元記事を表示

Visual Studio Code + WSL2でGo開発環境構築

WindowsからTeraTerm等のターミナルソフトを使って、Linuxサーバにssh接続し、Linux上で開発をすることは、一般的に行っていると思う。しかし、Windows用のVS CodeのIntellisenseやdebug機能を使いたい!と思うこともよくある。そんなことが、WSL2を使うことで簡単にできちゃうので、紹介してみる。

## インストール
### Remote Development Extention
VS Codeの画面左側の`Extensions(Ctrl + Shift + X)`メニューで、`Remote Development`を検索し、インストール。とっても簡単。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253975/e1064208-ba60-ac63-65fe-aa650728f9c2.png)

### WSL2 + Linux Distribution
ググればわかりやすいページがたくさんヒットするので、頑張りましょう。なお、私も書いて

元記事を表示

AzureでWebアプリを稼働させる「App Service」とGo

Azureには、Webアプリを稼働させるPaaSとして「App Service」が用意されています。

通常は、WebアプリをWindows上でネイティブに稼働させる「App Service(App Service on Windows)」となります。

– [App Service | Microsoft Azure](https://azure.microsoft.com/ja-jp/services/app-service/)

WebアプリをDocker化してLinuxコンテナーとして稼働させる「Web App for Containers(App Service on Linux)」も用意されています。

– [App Service – Web App for Containers | Microsoft Azure](https://azure.microsoft.com/ja-jp/services/app-service/containers/)

当初、Goは「App Service」にて実験サポートされていたのですが、2017年12月に対象外となりました(T_T)

元記事を表示

AtCoder Grand Contest初挑戦

8/9(日)、初のAtCoder Grand Contestを挑戦いたしました。

勉強中のgo言語を利用して、「[C – Product Modulo](https://atcoder.jp/contests/agc047/tasks/agc047_c)」だけを実施したが、どうしても、実行時間が2秒以内に抑えず(実績:2205 ms)、初挑戦が失敗した。

“`golang

package main

import (
“fmt”
)

func main() {
var n int
fmt.Scanf(“%d”, &n)
slice := make([]int,n,n)
for i := 0; i < n; i++ { fmt.Scanf("%d", &slice[i]) } total:=0 for i:=0;i 0 {
for j:=1+i;j0 {
total += slice[i]*slice[j]%200003
}

元記事を表示

Go言語のhttp.Handle、http.HandleFuncを雑に理解する

# はじめに
最近Goに入門しました。`http.Handle`、`http.HandleFunc`、`http.Handler`、`http.HandlerFunc`についてまとめられている記事は溢れていますが、結局何パターンの書き方があるのかまとまっている記事がなかったので、まとめておきます。対象は、筆者と同じぐらいのGo言語初心者を想定しています。

# 実装
下の5パターンが考えられる全てだと結論付けました。他の方法を知っている方がいらっしゃいましたら教えていただきたいです。

“`golang
package main

import “net/http”

type one struct {
}

func (h *one) ServeHTTP(w http.ResponseWriter, r *http.Request) {
w.Write([]byte(“one\n”))
}

func two(w http.ResponseWriter, r *http.Request) {
w.Write([]byte(“two\n”))
}

func three(w h

元記事を表示

[Go] pprofの使い方を改めて整理した

# はじめに

Go言語でのプロファイリングといえば`go tool pprof`ですがコマンドの仕様と使い方がわかりづらく感じていたので不明瞭であった点をまとめました。

# TL;DR

* プロファイリング方法として1. go testのベンチマークで取る方法と、2. コードに追記する方法がある。
* 2. コードに追記する方法の中に、2-1. `”runtime/pprof”`と、2-2. `”net/http/pprof”`の2つがある。
* `pprof [-option] [binary]` という使い方においてそれぞれ以下にように把握しよう
* sourceはプロファイル元リソース。生成されたプロファイルファイルだったりURLリソースだったり。
* optionは__どのようにプロファイル結果を可視化するか__ のためのオプション。指定しないとプロンプトが出てくる。
* binaryはsourceのコード箇所を名前付け(symbolization)するための__オプション__。__ほとんど場合不要__(のはずです)。

# プロファイリン

元記事を表示

AzureやGoの情報を絡めた私なりのde:code 2020のセッション紹介

2020年8月8日(土)にオンラインで開催されたMicrosoft Open Tech Night主催の

– [de:code夏まつり ~よりコミュニティを楽しくするためのコミュニティのすすめ the FINAL
](https://msdevjp.connpass.com/event/183747/)

にて「[I am gaining the skills I want! 〜What inspired me to take one step for being a “Go MVP” through de:code and summer festival〜](https://www.slideshare.net/qt-luigi/i-am-gaining-the-skills-i-want-what-inspired-me-to-take-one-step-for-being-a-go-mvp-through-decode-and-summer-festival)」というタイトルで発表をさせて頂きました。

[![thumbnail](https://image.slideshar

元記事を表示

golangのio.Readerは使い回しできない

# はじめに

こんにちわ、すえけん(@sueken5)です。この記事ではgolangのio.Readerが使い回しができないことを紹介します。

# io.Reader

io.Readerはioパッケージで提供されているインターフェースです。([ドキュメント](https://golang.org/pkg/io/#Reader))

“`go
type Reader interface {
Read(p []byte) (n int, err error)
}
“`

具体的にこのインターフェースを満たしているものを例に挙げると

– http.ResponseのBodyフィールド ([ドキュメント](https://golang.org/pkg/net/http/#Response))
– os.File ([ドキュメント](https://golang.org/pkg/os/#File))

などが挙げられます。

いわゆるストリーム系のものがこのio.Readerインターフェースを満たしています。

# 使い回せない?

本題です。次の出力は何になるでしょうか?

元記事を表示

レガシーエンジニアによるDocker入門

# 初めに

この記事は技術進化が5年前くらいで止まっている環境で働く私が、モダンな技術に触れる為に学習したことを記録したものです。
暇潰しに読んでいただければ幸いです
本記事では、

– **Windows10 Home + WSL2の環境に、Dockerをインストール**
– **Golang + GitがインストールされているコンテナをDockerfileで立ち上げる**
– **VSCodeからコンテナに接続してHello World**

の3つを行います。
# Dockerとは?
DockerはOracleVM等と同様、**仮想環境を提供するソフトウェアです。**OracleVMのようにOS全体を仮想化せず、OSの一部とアプリケーションの実行環境をまとめた**コンテナ**と呼ばれる仮想環境を提供します。

コンテナは**Dockerfile**というテキストファイルを元に作成され、Dockerfileが同一であれば、どのOSでも同一の環境を作ることができます。

**Docker**と呼ばれるものは正確にはDocker engineを指し、Docker engineはDoc

元記事を表示

Goで画像をクリップボードに保存、読み取るライブラリを作った

こんにちわ
ゴリラです

画像をクリップボードにコピー、コピーした画像をクリップボードから読み取るGoのライブラリ [clipboard-image](https://github.com/skanehira/clipboard-image) をつくったので紹介します。
このライブラリはMac、Linux、Windowsで動作します。

先日 [Goでソースコードを画像化するCLIを作った](https://qiita.com/gorilla0513/items/013aea9060bca1455137) で紹介したCLIではこのライブラリを使っています。

## 使い方
関数は2つのみ

– `CopyToClipboard`
– `ReadFromClipboard`

画像ファイルをクリップボードにコピーするときは `CopyToClipboard`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66178/598e7a39-59fc-fc35-9982-9093fefde5ff

元記事を表示

【GoネットワークプログラムでIPv6対応させる】自分のグローバルアドレスを知る方法

# 理由
ネットワークプログラムで、自身のグローバルIPアドレスを知る必要がある場合がある。その場合のコード例をメモしておく

# 参考コード

“`golang:main.go
package main

import (
“fmt”
“github.com/skubota/extip”
)

func main() {
addr,err := extip.GetIP()
if err != nil {
fmt.Errorf(“Address cannot get : %s\n”, err)
}else{
fmt.Printf(“Adress : %s\n”,addr)
}
}
“`

– 結果(IPv6/IPv4対応クライアント)

“`
Adress : 2xxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx
“`

– 結果(IPv4のみ対応クライアント)

“`
Adress : 2xx.xxx.xxx.xxx
“`

## 解説
標準パッケージではないが、「skubota/extip」というIPv6対応のSTU

元記事を表示

【GoネットワークプログラムでIPv6対応させる】アドレス+ポート組み合わせの作り方

# 理由
「IPアドレス:ポート番号」の文字列はいろいろな箇所で意味を持った使われ方をするので、よく利用する記法ではあるが、
Goで書かれたネットワークプログラムをIPv6に対応させるためには少し考慮する必要がある。その場合のコード例をメモしておく

# 参考コード
– https://play.golang.org/p/4e5y1PHj9co

“`golang:main.go
package main

import (
“fmt”
“net”
)

func main() {
// 対象のアドレスをスライスに入れる
addrs := []string{“2001:db8::1”, “192.168.0.1”, “2001:db8:0:0:1:0:0:1”, “::1”, “2001:db8:aaaa:bbbb:cccc:dddd:eeee:AaAa”, “2001:db8::aaaa:0:0:1”, “::192.0.2.1”}

// スライスを1つづつチェック
for i, v := range addrs {
// 例として:80を付加していく

元記事を表示

あなたのファイル、ソーシャルディスタンス保てていますか?

## 注意
__この記事は今の御時世に関係ありますが、まじめな記事ではございません。__

# はじめに
最近コロナのせいで、いつも以上に電車やバスなどで他の乗客との距離感が気になったり、
ドラマや映画で密になっていたりすると「これめっちゃ密やん」って思ったりしますよね。

__それと同じで、ファイルの中身を見ているとなにかムズムズしませんか?__

しますよね?

__それって行間のソーシャルディスタンスが保てていないからじゃないですか?__

__そんなムズムズを解消してくれるプログラムを GO で作ってみました!__

# ファイルがソーシャルディスタンスを保つ方法
ウェブサイトで推奨されているフォントサイズが__約 3 ~ 4 mm__ 、
日本の社会的距離の推奨距離である __2.0 m__ から、
__571 行__の行間を開けることで、ファイルに社会的距離を保たせることにしました。

# 環境
* OS : Windows10
* Go : 1.14.6
* エディタ : Visual Studio Code

# プログラム
プログラムのソースコードはこんな感じ。
Go

元記事を表示

【Go】Windowsでginフレームワーク触ってみた

Go言語でのWEBアプリは、どうなもんか軽く触れてみようという事で、
簡単なログイン認証の機能を作ってみました。

#参考
[公式](https://golang.org)
[goの環境構築](https://techfun.cc/go/golang.html)
[ginの環境構築](https://qiita.com/wsuzume/items/75d5c0cd2dd5a1963b9e)
[Go database/sql チュートリアル 01 – 概要 · golang.shop](https://golang.shop/post/go-databasesql-01-overview-ja/)

#環境
windows10
go1.14.7
エディタ:VisualStdioCode

#1.goの実行環境インストール

以下のサイトの通りに実施する事で、特にはまることも無く構築できました。
[goの環境構築](https://techfun.cc/go/golang.html)

あと、インストーラがupdateされたのか、環境変数は手動で設定しませんでした。
インストール完了時点

元記事を表示

Docker SDK & Go言語 を使ってAWS ECRのimageをpull & run する

「AWS ECRにログインして docker imageを pullし、docker runする」

このような作業はあまりプロダクションで手動でやることはありませんが、やるとすれば普通に “` aws-cli “`を使ってECRにLogin, 後は “` docker “`コマンドでの作業となるかと思います。

ところで、Go製であるDockerには公式SDKがあります。
今回とある事情があり、 “` github.com/aws/aws-sdk-go “` と “`github.com/docker/docker “` を使って**上記の作業をGoのコードのみでやる**機会がありました。

[Develop with Docker Engine SDKs](https://docs.docker.com/engine/api/sdk/)
[Examples using the Docker Engine SDKs and Docker API](https://docs.docker.com/engine/api/sdk/examples/)

ググっても出て

元記事を表示

OTHERカテゴリの最新記事