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

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

Go言語で使用できる変数名、使用できない変数名

Go言語では変数名に「nil」を使っても怒られない(コンパイルが通る)と知り、
じゃあ何が使えて、何が使えないのか気になったので確認しました。
(他にもあれば追記するかも知れません)

##使用できる
###英数字で始まる
hoge, fuga, piyo2 など

###\_ で始まる(ただし、 \_ 単体は不可)
\_hoge, \_fuga, \_piyo2 など
###定義済み識別子
| 識別子の種類 | 識別子 |
|:———–|:——————|
| 型 |bool, byte, complex64, complex128, error,
float32, float64, int, int8, int16, int32, int64,
rune, string, uint, uint8, uint16, uint32, uint64, uintptr
| 定数 | true, false, iota
| ゼロ値 | nil |
| 関数 | append, cap

元記事を表示

AlertmanagerのSilence作成をslackに通知する

最近PrometheusのAlertmanagerを使う機会があったので、ちょっとしたツールを作ったのでメモ。

## 何が作りたかったか
AlertmanagerではSilenceを登録することで、発生したアラートの通知有無を制御することができる。
SilenceはActive, Pending, Expiredの3つのステータスを持っていて、指定時間が経過すると勝手にステータスが遷移する。
しかし、ステータス遷移は都度確認しないとわからないし、Expiredされて数時間経ったSilenceはGCにより削除されてしまうため、履歴も追えない。
これだとオペレーションを後追いできず、若干不便なので、Silenceのステータス変更をslackに通知するツールを作りたい。

## 実行
内容はシンプルで、Alertmanager APIで定期的にSilenceを取得し、前回取得時との差分をSlackに通知しているだけ。

https://github.com/m-masataka/alertmanager-silence-notifier/

APIでの取得先hostとかportとかを指定す

元記事を表示

GolangでのRootディレクトリ取得方法

“`golang
package projectpath

import (
“path/filepath”
“runtime”
)

var (
_, b, _, _ = runtime.Caller(0)
Root = filepath.Join(filepath.Dir(b), “../../../”)
)

// —–
// projectpath.Root // root dir
“`

GolangでRootディレクトリが簡単には取得できなかったのですが、上記方法で取得できます。

テスト実行時などでも機能します。

しかし、トリッキーですね?

元記事を表示

Golang – How to Get Private Repository Module

# 410 Gone Problem

“`
$ go get -u gitlab.com/johnny/logger

go: finding gitlab.com/johnny/logger latest

go: downloading gitlab.com/johnny/logger v0.0.0-20190921175342-61a76c096369

verifying gitlab.com/johnny/logger@v0.0.0-20190921175342-61a76c096369

reading https://sum.golang.org/lookup/gitlab.com/johnny/logger@v0.0.0-20190921175342-61a76c096369: 410 Gone
“`

# Solution

“`
$ go env -w GOPRIVATE=gitlab.com/johnny
“`

https://medium.com/mabar/today-i-learned-fix-go-get-private-repository-

元記事を表示

Golangのコンストラクタとその利用方法についての考察

#概要
golangにおけるモデル(struct)の初期化関数とその利用方法について考えたことの書き起こし。
ベストプラクティスではなく、あくまで個人的な考えなので「ウチではこうしてる」的な意見をいただけると助かります。

#前提
この項目では当記事に用いる例の前提を書きます。

ユーザーによる何かしらの投稿機能を想定してください。
投稿に用いるモデルはPostモデルでそれぞれ以下のプロパティを持ちます。

“`golang:model
type Post struct {
Message string //=> テキストメッセージ。ユーザーによる任意の値。
Key1 bool //=> ユーザーに入力させる属性その1。システム投稿の際はtrue。
Key2 bool //=> ユーザーに入力させる属性その2。システム投稿の際はtrue。
Default1 bool //=> とあるデフォルト値その1。初期化時はtrue。
Default2 bool //=> とあるデフォルト値その1。初期化時はfalse。
}
“`

また、システムに

元記事を表示

「Go 1.4 “Internal” Packages」の挙動を確認してみる

## はじめに

Go の internal パッケージの仕様について実際にコードを動かして確認します。

[Go 1.4 “Internal” Packages](https://docs.google.com/document/d/1e8kOo3r51b2BWtTs_1uADIA5djfXhPT36s6eHVRIvaU/edit)
[Internal packages | Go 1.4 Release Notes](https://golang.org/doc/go1.4#internalpackages)

## 要約

internal の一個上の階層のパスを見て、そのパスの下に配置されているパッケージからならアクセス可能です。たぶん。

**架空の例**

– github.com/xxxx/foo/internal/bar というパッケージがある
– internal の一個上は github.com/xxxx/foo
– github.com/xxxx/foo の下に属する全てのパッケージは github.com/xxxx/foo/internal/bar にアクセス可能

元記事を表示

Go言語*(ポインタ)を使う必要性の簡単な例

##背景

– Go言語のプロジェクトでよく*(ポインタ)を見かける。

例1

“`golang
func setName(user *User,name string){
user.username = name
}
“`

例2

“`golang
type (
Users []*User
)
“`

– ではなぜそうなるでしょうか?

##結論
*(ポインタ)を使わないと構造体(struct)の値が編集できない ***

###例1 *(ポインタ)を使わず、structを編集する

“`golang

type User struct {
username string
password string
}

type (
Users []User
)

func setName(user User,name string){
user.username = name
}

func (user User) setName(name string){
user.username = name
}

func main(){
changeTheValu

元記事を表示

日本語のオノマトペを3000個あつめてGAE/GoとFirebaseでサービスを作る

[![logo_full_fill.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532297/fb144390-ea94-0370-423b-6c4cfb47b3f2.png)](https://matopee.com)
https://matopee.com

Firebaseを管理画面側に、GAEを公開側に使って、日本語のオノマトペを集めて辞典などとして公開するサービスを作っています。まだまだ不足だらけですが、まずは3200件ちょっと集めた[オノマトペの五十音別全一覧](https://matopee.com/indexes/kana)を中心に公開しています。

[![“五十音全一覧のスクリーンショット。「あ」から「お」までのオノマトペの一部を抜粋している。”](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532297/152a0876-a217-3284-5a55-b5da602beba5.jpeg “オノマトペの五十音

元記事を表示

[Golang]strings.Join関数の中身を、初学者向けに解説してみた

# はじめに

今日は、標準パッケージでもよく使われる関数、`strings.Join`関数について中身を見てみたいと思います。

# 公式のコード

まずは、コードを貼っておきます。

“`golang
// Join concatenates the elements of a to create a single string. The separator string
// sep is placed between elements in the resulting string.

func Join(a []string, sep string) string { // => A
switch len(a) { // => B
case 0:
return “”
case 1:
return a[0]
}
n := len(sep) * (len(a) – 1) // => C
for i := 0; i < len(a); i++ { n += len(a[i]) } var

元記事を表示

Go言語のインストール方法(Mac)

## はじめに

私の感覚ですが、Vimを使っている人はGo使いが多い気がします。
私もVimを使いたいのでGoを書くことにします。(手段が目的)

## 「Go言語」とは?

Googleが2009年に発表した、オープンソースのプログラミング言語です。

## 環境

– OS:macOS Catalina 10.15
– Go:1.13.4

## セットアップ

### インストール

公式サイトからパッケージファイルをダウンロードします。
https://golang.org/dl/

スクリーンショット_2019-11-19_22_47_36.jpg

パッケージファイルを実行し、ウィザードに従ってインストールします。

[続ける]をクリックします。
スクリ</p></blockquote>
</blockquote>
<aside class='widget widget-post'>
<div class='tag-cloud-link'>Go</div>
<div class='tag-cloud-link'>Mac</div>
</aside>
<div><a style='width:100%;' class='btn__link' href='https://qiita.com/uhooi/items/f1bca01d76080d82fbef'>元記事を表示</a></div>
<h3 id=【Go】Qiita 週間ストック数ランキング【自動更新】

## 他のタグ

– [【Python】Qiita 週間ストック数ランキング【自動更新】](https://qiita.com/kou_pg_0131/items/01127f188250a2d68dbf)
– [【Ruby】Qiita 週間ストック数ランキング【自動更新】](https://qiita.com/kou_pg_0131/items/6e5603cb6155c1d91f71)
– [【Rails】Qiita 週間ストック数ランキング【自動更新】](https://qiita.com/kou_pg_0131/items/e94bfc7467c96ff2c7f2)
– [【Go】Qiita 週間ストック数ランキング【自動更新】](https://qiita.com/kou_pg_0131/items/269fec563f49f0eb2bcd)
– [【Swift】Qiita 週間ストック数ランキング【自動更新】](https://qiita.com/kou_pg_0131/items/a6dc270783ec6e68e8a8)

## 集計期間

2019年11月16日 –

元記事を表示

GKE上にwebアプリケーションを構築する方法

記事の目的

– GKEについての紹介
– 簡単なwebアプリケーションを構築して、GKEにデプロイする方法の紹介

# A. GKEの概要

Googleを中心に開発されているDockerコンテナの管理ソフトウェアKubernetes(k8s)のクラスタを簡単にデプロイできるサービスです。Dockerコンテナの実行にはGCE(Google Compute Engine)を利用します。

各基本概念

## クラスタ(Cluster)

クラスタは1つの小さいクラウドと考えることができます。なぜかと言うとクラスタの中でVMからネットワーク、アクセス権限など色々なリソースを設定とコントロールできるからです。

クラスタは複数Nodeで構成されて、各Node間に内部ネットワークがあります。
![devsamurai_gcp_gke_kubernetes_001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535698/05332f9d-b053-d2d5-0552-34213172c8dc.png)

元記事を表示

【Go】AWS SSMパラメータストアの値を取得する

## サンプルコード

今回はAWS SSM パラメータストアに以下のようなパラメータが作成してある。

| パラメータ名 | 値 |
| —————- | ———- |
| sample-parameter | HOGEHOGE!! |

“`go
package main

import (
“fmt”

“github.com/aws/aws-sdk-go/aws”
“github.com/aws/aws-sdk-go/aws/session”
“github.com/aws/aws-sdk-go/service/ssm”
)

func main() {
svc := ssm.New(session.New(), &aws.Config{
Region: aws.String(“ap-northeast-1”),
})

res, _ := svc.GetParameter(&ssm.GetParameterInput{
Name: aws.String(“sample-para

元記事を表示

GCP – Google App Engine(GAE)入門

# Google App Engine(GAE)
GAEはGoogleが提供するPaaS(Platform as a Service)サービスです。
PaaSとはアプリケーションが動作するためのハードウェアやOSなどのプラットフォーム一式を、インターネット上のサービスとして提供する形態のことを指します。メンテナンスやスケーラビリティなどを意識する必要がないためインフラ面の作業コストが削減され、アプリ開発に専念できる点が特徴です。

# GAEの種類
GAEには以下の二つの実行環境が用意されています。

– GAE SE(Google App Engine Standard Environment)
– GAE FE(Google App Engine Flexible Environment)

## スタンダード環境(GAE SE)とフレキシブル環境(GAE FE)の違い
スタンダード環境(GAE SE)ではGoogleが管理する専用インスタンスを利用しますが、フレキシブル環境(GAE FE)ではGCE(※)上のDocker コンテナ上でアプリケーションを動作させます。

メンテナン

元記事を表示

【GitHub Actions】Go言語の自動テストからリリースまでを作ってみた

## はじめに

今回作成したのはGo言語リポジトリ用ワークフロー。
GitHubに指定されたタグがPushされた時点でテストを実行し問題が無ければ、クロスコンパイルを実施しリリースまで行う。
以下にアップロードしているので利用したい方はこちらからどうぞ。

– [github-actions-workflows/release_go.yml at master · x-color/github-actions-workflows · GitHub](https://github.com/x-color/github-actions-workflows/blob/master/workflows/release_go.yml)

ワークフローの流れは以下となっている。

1. タグがPushされたことをトリガーにワークフローが起動
1. 依存したモジュールをダウンロード
1. テストを実施
1. テストに合格した場合、リリースプロセスが始動
1. ソースコードをzipにまとめリリース
1. クロスコンパイルを実施し、それぞれ生成物をzipにまとめてリリース

以下が実際のworkfl

元記事を表示

Golang – Custom Zap Log

“`golang

w := zapcore.AddSync(&lumberjack.Logger{
Filename: “app.log”,
MaxSize: 1, // megabytes
MaxBackups: 30,
MaxAge: 30, // days
})

c := zapcore.EncoderConfig{
MessageKey: “msg”,
LevelKey: “level”,
TimeKey: “time”,
NameKey: “logger”,
CallerKey: “file”,
StacktraceKey: “stacktrace”,
LineEnding: zapcore.DefaultLineEnding,
EncodeLevel: zapcore.LowercaseLevelEncoder,
EncodeTime: zapcore.ISO8601TimeEncoder,
EncodeDu

元記事を表示

Golang – How to Get Local Mac and IP Address?

“`golang
//———————-
// Get the local machine IP address
// https://www.socketloop.com/tutorials/golang-get-local-ip-and-mac-address
//———————-

addrs, err := net.InterfaceAddrs()

if err != nil {
fmt.Println(err)
}

var currentIP, currentNetworkHardwareName string

for _, address := range addrs {

// check the address type and if it is not a loopback the display it
// = GET LOCAL IP ADDRESS
if ipnet, ok := address.(*net.IPNet); ok && !ipnet.IP.IsLoop

元記事を表示

【golang】ネストしたstructに値を入れる方法

#概要
ネストしたstructに値を入れる方法と実践での注意点。
#記述方法
基本的には以下のルールで記述が可能。

“`golang:main.go
package main
import “fmt”

type A struct {
AKey1 string
AKey2 string
B
}

type B struct {
BKey1 string
BKey2 string
}

func main() {
// key:valueで記述が可能
var st1 = A{
AKey1: “val1”,
AKey2: “val2”,
B: B{
BKey1: “val3”,
BKey2: “val4”,
},
}

// keyの省略も可能
var st2 = A{
“val1”,
“val2”,
B{
“val3”,
“val4”,
},
}

//宣言してから 変数.key = val でも可能
var st3 = A{}
st3.AKey1 = “val1”
st3.AKey2

元記事を表示

gitコマンドのTypoをGopherくんが教えてくれるコマンドを作ってみた

# 概要

**※この記事を書いている途中に[こちら](https://qiita.com/ramenjuniti/items/fd502b4870f8e4ea87bb)が公開されびっくりしました。(まさかこの内容がピンポイントに被るとは…)**

最近go言語を勉強し始めたので、勉強がてらgitコマンドをgotとTypoしたときに、Gopherくんが教えてくれるコマンドを作成しました。

[https://github.com/aojiru-ts/Got-Gopher-kun](https://github.com/aojiru-ts/Got-Gopher-kun)

こんな感じです↓
![alt](https://github.com/aojiru-ts/Got-Gopher-kun/raw/master/img/ex.gif)

※コマンドプロンプトやPowerShellでは動かないみたいです…

# やったこと

[mattnさんの記事](https://qiita.com/mattn/items/b7889e3c036b408ae8bd)よりGopherくんが

元記事を表示

初見でGo言語Webアプリケーションをやってみる(POST JSON編)

# はじめに
Go初心者が、初見でWebアプリケーションを作るまでの過程をつづっていきます。

[初見でGo言語Webアプリケーションをやってみる(パラメータを受け取る編)](https://qiita.com/yutaka_m03/items/3345977dd0e252a153cd)の続き
今回は、APIでよく使うJson形式のPOSTをやってみます。

# 実装と結果
## 環境
macOS:Catalina
goバージョン:go1.12.9

## サンプルコード
「JSON形式でPOSTをして、同じ値をJSON形式で返す」という実装にしてみます。
JSONと同じ構造を`type xxx struct{ }`で定義してあげれば、変数に入れてくれます。

“`go:post_json.go
package main

import (
“github.com/gin-gonic/gin”
“net/http”
)

func main() {
router := gin.Default()
router.POST(“/post”, PostTest)
router.R

元記事を表示

OTHERカテゴリの最新記事