Skip to content

Instantly share code, notes, and snippets.

View nasa9084's full-sized avatar
🙇‍♂️
Go / Kubernetes engineer

nasa9084 nasa9084

🙇‍♂️
Go / Kubernetes engineer
View GitHub Profile
package main
import (
"context"
"io"
"log"
"os"
"strings"
"github.com/docker/docker/api/types"
@nasa9084
nasa9084 / main.go
Created July 30, 2019 14:33
IR API server
package main
import (
"encoding/json"
"fmt"
"log"
"net/http"
"os"
"os/exec"
)

Go言語の実装パターン

他の言語同様、Go言語にも、実装パターン・デザインパターンの様なものがあります。 それは他の言語でも使われるようなものであったり、Go言語独自のものであったりします。 本稿では、Go言語の実装パターンをいくつか紹介します。

Functional Option Pattern

Go言語では、関数の引数に規定値を持たせたり、一部の引数のみを選んで値を与えたり、ということができません。 そのため、指定しても指定しなくてもいいような、オプションの引数を作りたいと思うと、あまり単純には書くことができません。

Golang 101

事前準備

Go言語での開発をするために、まずは環境整備をしましょう。

Go言語のインストール

公式サイトより、ご自身の環境に合わせてインストーラをダウンロードし、Go言語の実行環境をインストールしてください。 バージョンは最新(本ガイドを書いた時点では1.12.6)をインストールしてください。

事前準備ガイド

イベント当日、手元で実際にプログラミングを行うにあたり、ある程度環境を整える必要があります。 参加当日までに、次の手順で準備をお願いします。

Go言語のインストール

公式サイトより、ご自身の環境に合わせてインストーラをダウンロードし、Go言語の実行環境をインストールしてください。 バージョンは最新(本ガイドを書いた時点では1.12.6)をインストールしてください。

@nasa9084
nasa9084 / benchmark_test.go
Created May 30, 2019 04:05
Joining strings with + is faster than fmt.Sprintf
package benchmark_test
import (
"fmt"
"strconv"
"testing"
)
var label = "FOOBARBAZ"
@nasa9084
nasa9084 / tdtt.go
Last active November 19, 2019 01:53
table driven test template
func TestFoo(t *testing.T) {
tests := []struct {
// test case structure
}{
// test cases
}
for i, tt := range tests {
t.Run(strconv.Itoa(i) + "/" /* if you have any labels, append to test title */, func(t *testing.T) {
// test
})
@nasa9084
nasa9084 / pgp.go
Last active November 28, 2018 06:22
how to symmetrically encrypt/decrypt using x/crypto/openpgp
func promptFn(passphrase []byte) func([]openpgp.Key, bool) ([]byte, error) {
var alreadyCalled bool
return func([]openpgp.Key, bool) ([]byte, error) {
if alreadyCalled {
return nil, errors.New("the passphrase is incorrect")
}
alreadyCalled = true
return passphrase, nil
}
}
  1. create a new PersistentVolumeClaim
  2. create migration Pod
---
apiVersion: v1
kind: Pod
metadata:
  name: migrate
spec:
 containers:
func orDone(done <-chan bool, ch <-chan Data) <-chan Data {
stream := make(chan Data)
go func() {
defer close(stream)
for {
select {
case <-done:
return
case v, ok := <-ch:
if !ok {