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

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

Go言語入門 コンポジット型(配列・スライス・マップ・構造体)

 プログラミング初学者が学習したことを記録するために書いています。間違っている部分があれば指摘していただけると幸いです。

Go言語の特徴と基本構文については[前回の記事](https://qiita.com/IamK/items/400ba10de1b8ad6316f7)でまとめています。

# 目次
– コンポジット型とは
– 配列
– rangeの使い方
– スライス
– マップ

# コンポジット型とは

 ひとことで表すと、**複数のデータ型を1つのデータ型にまとめてもの**である。
Go言語における具体的なコンポジット型を以下にまとめた。

 ※構造体については別でまとめる予定

| 種類 | 説明 |
| — | —- |
| 配列 | 同じ型のデータを並べたデータ型 |
| スライス | 可変長な配列 |
| マップ | キーと値を連結させたデータ型 |
| 構造体 | 異なるデータ型を集めたデータ型 |

# 配列

## 配列の基本

– 要素の型はすべて同じ
– 最初に決めた要素数から変更することができない

## 配列の定義(その1)
宣言と代入を別で

元記事を表示

goalng+Dockerでサクッと環境作ってみた。

goalngの勉強のためにDockerでサクッと開発環境作ってみた。

フォルダ構成
golang_docker_api
-Dockerfile
-main.go

それぞれのファイルの内容は以下参照


【Dockerfile】
ローカルのmain.goをコンテナイメージにコピーしてビルド→実行をするDockerfile

“`ruby:Dockerfile
FROM golang:alpine
# フォルダ作成
RUN mkdir /app/
# 作成したフォルダ内にmain.goを配置
COPY . /app/
# 作業場所を/appに設定(main.goがある場所)
WORKDIR /app/
# main.goをbuild
RUN go build -o main .
CMD [“/app/main”]
“`
【main.go】
localhostにアクセスしたときに「golang api access」を出力するmain.go

“`ruby:main.go
package main

import (
“fmt”
“net/http”
)
func in

元記事を表示

golangでkubernetes APIにアクセスする

## 事前条件

– 利用できるkubernetesクラスタがある(参考: [GNU/Linuxにkindを使ってkubernetesをセットアップする](https://qiita.com/yendo0206/items/30a81f51cfc37b4b74e1))
– goがインストールされている(参考: [GNU/Linuxにgoenvでgolangをセットアップする](https://qiita.com/yendo0206/items/33689cccd926e0162a2a))
– go modulesが利用できる(go v1.13以降ならデフォルトで利用できる)

## Kubernetes APIにアクセスするコードを用意する

Kubernetes APIにアクセスするには[client-go](https://github.com/kubernetes/client-go)を使います。この場合client-goを使うコードを1から書いてもよいですが、[kyaml2go](https://kyaml2go.prasadg.dev/)を使うと、yamlファイルからc

元記事を表示

GNU/Linuxにgoenvでgolangをセットアップする

## goenvのインストールと設定

git cloneでインストールします。

“` bash
$ git clone https://github.com/syndbg/goenv.git ~/.goenv
“`

環境変数などの設定を行います。ログインシェルやシステムによって[多少異なります](https://github.com/syndbg/goenv/blob/master/INSTALL.md#basic-github-checkout)。以下はDebian系でbashの場合です。

“` bash
$ vi ~/.bashrc
“`

“` bash
# goenv

export GOENV_ROOT=”$HOME/.goenv”
export PATH=”$GOENV_ROOT/bin:$PATH”
eval “$(goenv init -)”
export PATH=”$GOROOT/bin:$PATH”
export PATH=”$PATH:$GOPATH/bin”
“`

編集後、一度ログアウトします。

※面倒なGOPATHの設定はgoenvに

元記事を表示

VSCodeのGo言語拡張から学ぶGOROOT

# はじめに
[A Tour of Go](https://go-tour-jp.appspot.com/list)をやるためにローカルにGoをインストールしたのですが、環境変数設定やPathを通していないのにVSCodeで**デバッグなしで実行**が選べた為、不思議に思い拡張のソースコードを読んで疑問を解決したので一応の共有です。

# 結論
デフォルトインストールディレクトリの`/usr/local/go/bin/go`を直接見ていたので環境変数設定やPathを通してなくても実行できた。

# 調査環境
– Ubuntu 20.04LTS
– go version go1.14.2 linux/amd64

# 調査内容
環境変数設定やPathを通していないのに実行できるということは、どこかでインストールディレクトリを見ているという予想ができるので拡張の中身をそれっぽい文字列で検索してみる

“`bash
jh1ovv@ThinkPad-X1:~$ pwd
/home/jh1ovv
jh1ovv@ThinkPad-X1:~$ cd .vscode/extensions/
jh1o

元記事を表示

XamarinでGomobileを使う

# Xamarinでもgomobileを使いたい!

Visual Studioが好きなのでXamarinでaarを使いたいと思いました
Android Studio重いから好きじゃないの

じゃぁC#で書けよって言われそうですが、最近のC#はC++程ではないにしろ仕様が膨らんできてなんだかしんどいです
F#やIronPythonも試してはみたのですがいまいちしっくりこなかったのでgomobileを試してみることにしました

## 試してみたら意外と動きました
うちの環境だとOreo以上対象にしないと動かないのですが、Android Studioでも同じような状況ですし、
単なる私の知見不足なのだろうと思います

“`
gomobile bind -target android
“`

で普通に生成したaarを使っています
コードのサンプルは下の方にあります

ただ下でも詳しく書きますが、Go単体時のテスト・Java/Kotlin側だと正常に動いていたaarが一部Xamarinでは動きませんでした。

## gomobileで生成したaarをC#側で認識させられるようになるまで

元記事を表示

GitHub CLI のビルド方法

# GitHub CLI のビルド方法

[GitHub CLI](https://cli.github.com/) のビルド方法です。

## 準備

1. [Golang](https://golang.org/) をダウンロードしてインストールします。
2. git をインストールします。
3. git で ソースを取得します。

git の場合

“`
git clone https://github.com/cli/cli.git
“`

GitHub CLI をインストール済みの場合

“`
gh repo clone cli/cli
“`

## ビルド (Windows, Linux 共通)

“`
go mod download
go build -v ./cmd/gh
“`

参考:
https://github.com/cli/cli/blob/master/.github/workflows/go.yml

元記事を表示

go mod プロジェクトを go build したら invalid version: unknown revision ってエラーが出たときのメモ

Same as title. go modプロジェクトのあるブランチを `go build` したら

“`
$ go build
go: @v0.0.0-20200503112449-: invalid version: unknown revision
“`

というエラーになった。SSHもGOPRIVATEも正しく設定できているはずだ。GithubのWeb上で、commit hashが存在することも確認した。なぜunknown refisionなのか。しばらくハマったが、このIssueがヒントになって解決した。

[cmd/go: invalid version: unknown revision when GOPROXY/GOSUMDB disabled · Issue \#36624 · golang/go](https://github.com/golang/go/issues/36624)

GithubのWeb上では確かにcommitがあったが、実はこれはただのキャッシュである。ローカルで `git

元記事を表示

Golang 型確認

“`golang
package main

import (
“fmt”
“reflect”
“strings”
“time”
)

func main() {
// 数値
P(1) // int
P(1.2) // float64

// 文字列
P(“string”) // string

// 配列
P([]int{0,1,2}) // []int
P([2]int{0,1}) // [2]int
P([]string{}) // []string
P(strings.Split(“a b”, ” “)) // []string
P([1]string{“1”}) // [1]str

元記事を表示

Azure SDK for Goでの認証方式

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

本セクションでは、[Azure SDK for Go](https://github.com/Azure/azure-sdk-for-go)を使ってAzureで認証するための形式と方式が紹介されています。

ここでは、対象ページの内容をベースに…というか結果的にGoogle翻訳による日本語翻訳状態となり、私なりの言い回しを加えています。ちなみに、”type”は”形式”に、”method”は”方式”に、日本語訳しています。

## 利用可能な認証の形式と方式

Azure SDK for Goは複数の資格情報セットと認証形式を

元記事を表示

goreleaserで簡単にオレオレコマンドをbrew installできちゃう

# はじめに

[gorillang](https://github.com/momotaro98/gorillang)というゴリラ語で遊べるコマンドツールを作りました。

> ウホゥホウホッッホゥ ウホゥホウホ!!ゥゥ ウホゥホウホ!!オホ ウホ?ゥゥオホ!! ウホうほホッウウウッホ ウホウォホホウウウホ ウホホホウォ ウホゥホウホォ!ウウ ウホゥホウホウッホッ! ウホゥホウホッッホッ ウホホッウォウォ?

このとき、[goreleaser](https://goreleaser.com/)を使うことで簡単にGo言語で作ったプログラムを[Homebrew](https://brew.sh/index_ja)化して配布できるとわかったので記事にします。

# バージョン・環境

* Go: go version go1.13.1 darwin/amd64
* goreleaser: version: 0.131.1

# やり方

## GitHubにHomebrewのFormula用のレポジトリを事前に作っておく

事前にHomebrewのFormula用のレポジトリを作る必要があ

元記事を表示

terminal操作メモ

## 近況報告
 勉強ってなんのためにするの?って聞かれたら,どう答えるべきなのかって,教師を目指していた時に考えていたことがあります。当時の自分はどう答えてたんだろう。今の自分はこう答えます。 **その勉強「は」意味がないよ**。

というのも,勉強は手段であって第一の目的になり得ないので,目的がない状態で勉強の意義を問うことを僕はできません。モテるために勉強する,いい大学に進学するために勉強する。。。なんでもいいんです。どんな小さなことでもいいから目的をつくってあげる,きっかけを一緒に見つけてあげるのが,教師。方位磁針,道しるべ、、、教師ってそういうものであるべきなんだろうな。余談ですが,僕の好きな漫画で我が子を叱る父親のシーンでこんなセリフがあるんです。「目的もなしにだらだら手段を行使するのは時間の無駄だし身にならない,そして何よりつまらねぇ」って。鞠山さん大好き。

# 今回のお題
terminal操作を全くわかってなかった件

## 背景
techcanp卒業して1週間。過去の復習したりGoの勉強していたりしていると,いつもディスプレイ上でクリックしたりしていたことをテキスト

元記事を表示

RubyからGo(ジャンル:勉強日記vol.1)

## 近況報告
 テックキャンプを卒業し,ついに就職活動です。前の記事で述べた通り,
  ・個人アプリの修正及び機能付与
  ・カリキュラムのドリル
  ・新しいことへのチャレンジ(dockerとGo言語)
  ・就職活動
を軸に勉強を進めています。個人アプリの大まかな修正は順調に進んでいます。ドリルに関しては,先輩曰く,スクールの料金の半分の価値があるとのことなので,進めています。正規表現など穴がわかるので助かります。dockerは意義を理解してインストールし,起動まで進みました。環境構築はまだ解読が進んでいません。Golangは後述。就活は今週面接があるのですが,ラフな気持ちで行こうと思います。

# 今回のお話
 Golangの勉強を始めた経緯
 いまなにしてる
 気づきメモ(rubyでは出会わなかった話メイン)
## Golangの勉強を始めた経緯
### 勢いのある言語のため
 golangは2009年にオープンソースとして発表された言語であり,機能性,高速という面で脚光を浴びた言語です。最近のエンジニアが学びたい言語としても上位に位置し,近年はアプリケーションの一部をGoに

元記事を表示

Goの代入可能性についてちゃんと理解してみる

# はじめに
今月でGolangに触れてからちょうど一年になりますが、未だにGoについて初めて知ることが多々あります。その一つを紹介したいと思います。

以下のGoでなぜキャストが必要なのでしょうか? 当たり前だろ、GoはCなどとは違って明示的なキャストが必要な言語だろとツッコミが入りそうですが、

“`golang
type INT int
var i1 int
var i2 INT
i1 = 1
i2 = INT(i1) // 明示的なキャストが必要
“`
では、以下はキャスト不要で代入できますが、これはなぜでしょうか? といわれると案外答えられない人もいるのではないでしょうか?
そのあたりを[Goの仕様](https://golang.org/ref/spec)をちゃんと読んで理解しましょうというのが今回のテーマです。

“`golang
type INTSLICE []int
var l1 []int
var l2 INTSLICE
l1 = []int{1,2,3}
l2 = l1 // 明示的なキャストが不要
“`

# 仕様をよんでみる
代入可能性(`Assi

元記事を表示

Golang シェル実行

“`golang
package main

import (
“fmt”
“os”
“os/exec”
“strings”
)

func getstatusoutput(args …string) (status int, output string) {
exec_command := exec.Command(args[0], args[1:]…)
std_out, std_err := exec_command.Output()
status = exec_command.ProcessState.ExitCode()
if std_err != nil {
output = std_err.Error()
} else {
output = string(std_out)
}
return
}

func main() {
// command := []string{“echo”, “-n”, “HelloWorld”}
com

元記事を表示

Go言語でJSONを扱う

# JSON形式をstruct型に変換

`encoding/json`パッケージを使用する

“`go:
package main

import (
“encoding/json”
“fmt”
)

type Person struct {
Name string `json:”name,omitempty”`
Age int `json:”age,string,omitempty”`
Roles []string `json:”roles,omitempty”`
}

func main() {
// json形式でデータを作成
jsonData := []byte(`{“name”:”yamada”, “age”:”18″, “roles”: [“admin”, “user”]}`)
// jsonデータを入れるstruct型を宣言
var person Person
// struct型にjsonデータを入れる
if err := json.Unmarshal(jsonData, &person); err != nil {
f

元記事を表示

go lang やってみた ファイル名に_testをつけたらだめだった。

前にやったことをい出しながら、試しにやってみたら、うまく動かない。

srcの下に、hoge_testというのをつくって、hoge_test.goに、printだけをいれてみたのだけど、

下記のようなエラーがでてしまう。

no non-test Go files in

ファイル名に_testをつけると、テストファイルになるもよう。

元記事を表示

AtCoderのKeyence2019 C(Exam and Wizard)で、条件を誤解したまま実装したメモ

過去問を解いてる過程でkeyence2019_c(Exam and Wizard)を解いてみて、結局よくわからなくて解説を見たんですが、そのときはなぜその実装でいいのかがよくわかりませんでした。
https://atcoder.jp/contests/keyence2019/tasks/keyence2019_c

結果としては、
$A_1,A_2,…,A_n$と$C_1,C_2,…,C_n$の合計が同じ、という条件しか書いてないのを、
勝手に
$A_1,A_2,…,A_n$を並べ替えたものが$C_1,C_2,…,C_n$
と解釈してしまっていた(サンプルを見てそう思ってしまった)ので、前提条件を誤解していました。

ただ、その前提条件を誤解したまま実装して通ったので、自分への備忘録という意味でも残しておきます。

# 基本方針

この問題のやり方は解説PDFの通りです。
https://img.atcoder.jp/keyence2019/editorial.pdf
個人的には @drken さんのブログが大変わかりやすかったです。
https://drken1215

元記事を表示

Go で Interactive な Slack Bot を作る (2020年5月版)

[Go で Slack Bot を作る (2020年3月版)](https://qiita.com/frozenbonito/items/cf75dadce12ef9a048e9) の続編です。今回は [Interactive Message](https://api.slack.com/messaging/interactivity) を活用してちょっとリッチな Slack Bot を作っていきます。
順を追って作り方を解説していくので「サンプルコードだけ見たいよ」という方は [「まとめ」](#まとめ) に記載されているものをご参照ください。

## 作るもの

今回は ChatOps を意識した Bot を作ります。

下図のように Bot に `deploy` と命じると、デプロイするバージョンの候補がセレクトメニューで提示されます。

![interactive1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586035/5cb7a911-19f8-8bd3-0c75-1aa3a8070a4d

元記事を表示

Goで月末日の時は増加減した月の月末日を返す

GoのtimeパッケージのAddDate()関数ですが、例えば10月31日に1ヶ月を足すと11月31日となりDateの正規化によって12月1日になります。

“`Go
package main

import (
“fmt”
“time”
)

func main() {
t := time.Date(2019, 10, 31, 0, 0, 0, 0, time.Local)
fmt.Println(t)
fmt.Println(t.AddDate(0, 1, 0), “(Add 1 month)”)
}

実行結果

2019-10-31 00:00:00 +0000 UTC
2019-12-01 00:00:00 +0000 UTC (Add 1 month)
“`

そこで、月末日の時は増減した月の月末日、すなわち、10月31日に1ヶ月を足すと11月30日となる関数「AddMonth()」を考えてみました。(注意:横スクロールしてください)

– [Go Playgound へ](https://play.golang.org/p/8McHRpONKlC)

“`

元記事を表示

OTHERカテゴリの最新記事