- 1. Goは本当に1980年代の言語みたいなのか。
- 2. main.goを複数ファイルに分ける
- 3. Go1.15改訂版、Go言語アプリのDockerイメージをscratchから作る
- 4. [Go言語]構造体の型入力で処理を分ける
- 5. GoでOSの環境変数を利用する
- 6. 【GORM】公式ドキュメントのメモ・その2「CRUDについて(Query)」
- 7. 【GORM】公式ドキュメントのメモ・その1「モデル、CRUDについて」
- 8. ある型があるinterfaceを実装しているかを保証する
- 9. R50 のリープフロッグ ~ Golang はお前と戯れるアイツを OS とは認めていない
- 10. [Go]文字コードのUTF-8変換を行う – autodetect
- 11. Dockerでmysqlに接続できない(GO/gin/GORM)
- 12. 【Go】ルーティングライブラリgo-chiの使い方
- 13. MAC OSに言語(GO&Python)をインストール
- 14. revel(go)のアプリケーション環境を構築
- 15. go言語でHTMLをスクレイピングしてそれを送信するslackbotを作成する
- 16. Golang 基礎(並列処理) part3
- 17. 【Go】【Ginkgo】FizzBuzzをGinkgoでテストしてみる
- 18. nuxtのformからPOSTされたデータをgoのサーバで受け取る(私的メモ)
- 19. Go構造体の`json:hoge`の正体を探る
- 20. Golang + Sonarqube + Codebuild
Goは本当に1980年代の言語みたいなのか。
# The Why of Go / Goにまつわる「なぜ」
2020年8月15日現在、[golang.org](https://golang.org/)のトップページに、[The Why of Go](https://www.youtube.com/watch?v=bmZNaUcwBt4)という動画が、Featured Videoとして紹介されています。Goに初めて触れて、ちょうどなぜこうなっている?と思う機会が多かったので、自分なりにまとめてみようと思います。
注: 要約というよりは、気になる部分をピックアップして解釈して文字にしているものなので、総合的な内容は動画を見てください。# Goとは1980年代の言語なのか
Goとは1980年代の言語のようだと批判される。糖衣構文、多態、Genericsが使えない、依存性管理が粗末等と批判する人にとってGoは、1980年代以降のプログラミング言語の進化の歴史を無視しているように見えるようだ。だけど、それらの要素があったら21世紀のプログラミング言語といえるということなのだろうか?
このプレゼンテーションでは、そういう疑問をきっか
main.goを複数ファイルに分ける
## コード
“`main.go
package mainfunc main() {
test()
}
“`“`test.go
package mainimport “fmt”
func test() {
fmt.Printf(“%s”,”Hello”)
}
“`## 実行
– `main.go`を指定するとエラーというか、test関数を読み込めないでいる“`
yuta:~/func $ go run main.go
# command-line-arguments
./main.go:4:2: undefined: test
“`## 正しい実行
– `*` で実行しよう!“`
yuta:~/func $ go run *.go
Hello
“`# 参考
https://qiita.com/taqm/items/8eed4371bab199b01b65
Go1.15改訂版、Go言語アプリのDockerイメージをscratchから作る
こんばんは、ねじねじおです。
Go言語アプリの Docker イメージを scratch からつくるとき、builder ステージから `/usr/share/zoneinfo` ディレクトリをコピーしていますか?
それとも、 `/usr/local/go/lib/time/zoneinfo.zip` ファイルをコピーしていますか?
あなたはどちら派ですか?もう、そんなことで争う必要はないのです。Go 1.15 がリリースされたから。
## Go 1.14 まで
Go 1.14 までは、タイムゾーンを解決するためにbuilderステージからタイムゾーンデータベースをコピーする必要がありました。
下記の最後の行です。“`Dockerfile:Dockerfile
FROM golang:1.14.7 AS builder
WORKDIR /go/src/app
COPY ./ ./
RUN go mod download
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o ./server ./server.go
[Go言語]構造体の型入力で処理を分ける
# はじめに
go言語でintefaceを使えば、C言語などのポインタ渡しに似た処理を行うことができます。
そのやり方について、覚書の意味で記載します。
# ソースコード
本資料では、入力した構造体の型別で別の処理を行うように関数を作ってプログラムをします。
また、行列にした構造体で複数にわたって異なる構造体が入っていた時の処理別方法についても関数で作ってみます。“`golang:maing.go
package mainimport (
“fmt”
“reflect”
)type User struct {
Name string
Age string
Sex string
}
type User2 struct {
Name string
Age string
Sex string
}
type TextBord struct {
Name string
Text string
}
//個別処理
func Output(v interface{}) {
switch reflect.TypeOf(v) {
case reflect.Ty
GoでOSの環境変数を利用する
– `os.Getenv(“INSTANCE_ID”)`のように書く
“`golang
import “os”
func getInstanceID() string{
var instanceId = os.Getenv(“INSTANCE_ID”)
return instanceId
}
“`
【GORM】公式ドキュメントのメモ・その2「CRUDについて(Query)」
# はじめに
[GORM公式ドキュメント](http://gorm.io/ja_JP/docs/index.html)を読んだ際、頭に残すために書き写したものです。
ほとんど公式通りですが、パッと見で理解しづらかった言い回しなどを書き直しています。
この記事では[【GORM】公式ドキュメントのメモ・その1「モデル、CRUDについて」](https://qiita.com/schwertwal97/items/ae1cb42e174b652d546a)に書ききれなかったCRUDのQuery部分についてのメモを載せています。# Query
“`go
// 主キーでソートし、最初のレコードを取得する
db.First(&user)
//// SELECT * FROM users ORDER BY id LIMIT 1;// ソートせずにレコードを1行取得する
db.Take(&user)
//// SELECT * FROM users LIMIT 1;// 主キーでソートし、最後のレコードを取得する
db.Last(&user)
//// SELECT * FROM use
【GORM】公式ドキュメントのメモ・その1「モデル、CRUDについて」
# はじめに
[GORM公式ドキュメント](http://gorm.io/ja_JP/docs/index.html)を読んだ際、頭に残すために書き写したものです。
ほとんど公式通りですが、パッと見で理解しづらかった言い回しなどを書き直しています。# インストール
“`sh
go get -u github.com/jinzhu/gorm
“`# モデル
## モデルの例
“`go
type User struct {
gorm.Model
Name string
Age sql.NullInt64
Birthday *time.Time
Email string `gorm:”type:varchar(100);unique_index”`
Role string `gorm:”size:255″` // フィールドサイズを255にセットします
MemberNumber *string `gorm:”unique;not null”` // MemberNumberを
ある型があるinterfaceを実装しているかを保証する
## 目的
ある型がinterfaceを実装しているかを保証したい。
## 環境
Go: go1.14 darwin/amd64
## サンプルコード
“`go
package main// 適当なinterfaceを定義する。
type Somether interface {
Method() bool
}// 適当な type alias を定義する。Sometherを満足することを期待する。
type MyType string// メソッドリストにないメソッドを定義する。つまりインターフェースを満足していない。
func (m *MyType) Method2() bool {
return true
}// Somether型の変数を定義する。変数は利用しないので _ で無視する。
// インターフェース値の型にMyType型のポインタ、値はnilをアサインする。
var _ Somether = (*MyType)(nil)func main() {}
// 実行結果
// cannot use (*MyType)(ni
R50 のリープフロッグ ~ Golang はお前と戯れるアイツを OS とは認めていない
# 対象読者
この投稿は、以前書いた「[R50 のリープフロッグ ~ 西暦2020年の今、偏差値50のプログラマを目指すお前が学ぶべきこと](https://qiita.com/y-bash/items/09575a8e3d85656015bc)」という 20 年前の自分に宛てて書いた手紙の追伸にあたるものです。
本稿では Golang がサポートするプラットフォームについて軽く触れていますが、内容が薄いのと、とても個人的なものなので、多くの方にとってはまったく有益な情報ではないでしょう。
# 後日譚
どうだ? その後も元気にしてるか?
お前はそろそろ結婚する時期だし、忙しくてあまり時間もないとは思うが、まあ今回はとても短い文章だから最後まで読んでくれたら嬉しい。
そうか、そもそも前回の手紙が 20 万字もあったから、そっちがまだ読み終わってないかもしれないな(笑)
だけどな、信じられないことに、文庫本 2 冊分にも及ぶあの分量で、しかも酷く拙いあの殴り書きを本当にたくさんの人が読んでくれ、しかもたくさんの人が反応してくれたんだ。とても嬉しかったよ。
そして、その後 Q
[Go]文字コードのUTF-8変換を行う – autodetect
文字コードが分からない際にautodetectする場合、自前でゴリゴリ書いていたのですが
ICU実装をgoで書いた[saintfish/chardet](https://github.com/saintfish/chardet)という便利libraryがありました。# 実装
“`Go
package mainimport (
“errors”
“fmt”
“github.com/saintfish/chardet”
“golang.org/x/net/html/charset”
“golang.org/x/text/transform”
)// Converts to UTF-8.
// Charset automatically detected.
func DecodeAutoDetect(src []byte) (string, error) {
d := chardet.NewHtmlDetector()
r, err := d.DetectBest(src)
if err != nil {
return string(src), err
Dockerでmysqlに接続できない(GO/gin/GORM)
# 状況
Dockerで簡単なSPAアプリケーションの作成中にDBサーバとして作成したMySQLコンテナにバックエンドサーバ(GO/gin)がアクセスする際に“`console
panic: dial tcp 127.0.0.1:3306: connect: connection refused
“`というエラーが発生する。
以下にエラーが発生したコンテナの情報とソースコードを記載し、最後に解決策を示す。## コンテナの設定
### ネットワーク
“`console
$ docker network create app-nw
“`### DBコンテナ
“`console
# コンテナを作成して起動
$ docker run –name app-db –network app-nw -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql
# 作成したMySQLコンテナに入りテーブルとレコードを作成
$ docker exec -it app-db bash
$ mysql uroot proot
mysql >
【Go】ルーティングライブラリgo-chiの使い方
# go-chi
– net/http
– go-chi
– gorilla
– echoとかがあると思います(他にもあるけど省略)が、go-chiやgorillaはその中でもフレームワークとして使いやすいながらにハンドラでは標準パッケージのnet/httpをそのまま使用できたり導入しやすい部類に入ると思います。実際に見ていきましょう。
“`
$ go get github.com/go-chi/chi
“`## 使っていきます
まずはハンドラを定義します。ハンドラ自体はnet/httpを使うので、ライブラリを消したくなった場合はルーティングの記述だけを変更すれば良いです。
“`go:handler.go
package handlerfunc Get(w http.ResponseWriter, req *http.Request) {
// ハンドラを記述
fmt.Println(“呼ばれた”)
return
}
“`ルーティングでハンドラを呼び出します。
“`go:router.go
package routertype R
MAC OSに言語(GO&Python)をインストール
## はじめに
今更ながらMacMini 2020を購入しため、プログラミングの勉強を最近行っているので、
備忘録も兼ねて言語のインストール履歴を記載しておきます。## HomeBrewのインストール
Mac OSのパッケージ管理システムで、CentOSで言うところのyumやdnfと同じです。
インストールにては以下コマンドを実行します。“`conseole
/usr/bin/ruby -e “$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)”
“`私は現在GOとPythonを使ってプログラミング学習を行っているので、以下2つをインストールしておきます。
## GOのインストール
“`conseole
$ brew install go$ go version
go version go1.14.6 darwin/amd64
“`## Python 3系のインストール
“`conseole
$ brew install pyenv
$
revel(go)のアプリケーション環境を構築
goのアプリ開発するためのフレームワークがいくつかあります。
その中でも、revelがMVCの思想を深く取り入れているものの一つとされています。
本記事では、goをインストールしていない状態からrevelのアプリ起動までを行った際の手順を残していきます。# 前提
brew がインストールされていることが前提です。# brewをアップデートする
まず初めにbrewを最新のものにアップデートしましょう。“`
$ brew update
“`# goenvをインストールする
“`
# goenvをインストール
$ git clone https://github.com/syndbg/goenv.git ~/.goenv
“`利用しているシェルに環境変数を設定する。
“`~/.zshrc
export GOENV_ROOT=$HOME/.goenv
export PATH=$GOENV_ROOT/bin:$PATH
eval “$(goenv init -)”
“`設定が完了したら、シェルに反映させ、
goenvが利用できる状態になっているか確認します
go言語でHTMLをスクレイピングしてそれを送信するslackbotを作成する
# はじめに
普段はvueとかtypescriptとか使って、フロントエンドを書いています。
純粋に興味がありgo言語を1から勉強し始め、試しにスクレイピングして取ってきたデータを定時実行で送るslackbotを作成しました。
結構似たようなこと書いてる記事が多いのですがあまり最新の情報がなくメモのためでもあります。
go言語触り始めたばかりなのでコードが理解できず不要なのが混じっているかもしれませんがご了承ください。完成したのはこんな感じです、ローカルで試したときなので時間はおかしいです。
ソースコードは[こちら](https://github.com/mmmommm/unigurikun)にあります、よかったらstar押していってください!
Golang 基礎(並列処理) part3
[part2](https://qiita.com/mi11km/items/8b336736ed66ec48705c)の続き
## goroutine
goroutine: 並列処理。
go 処理 とかく。処理が終わらなくても、プログラムのコードは終了する。
対策①sync.WaitGroupを使う!“`golang
package mainimport (
“fmt”
“sync”
)func goroutine(s string, wg *sync.WaitGroup) {
defer wg.Done() // 並列処理が終了したと伝える
for i := 0; i < 5; i++ { fmt.Println(s) } } func normal(s string) { for i := 0; i < 5; i++ { fmt.Println(s) } } func main() { var wg sync.WaitGroup wg.Add(1) // 処理するべき並列処理を1つ追加する go goroutine("world"
【Go】【Ginkgo】FizzBuzzをGinkgoでテストしてみる
## はじめに
最近Goの勉強をしてて、簡単なWebサーバーを作ってみたり、コマンドラインで動作するツールを作ったり、、、としているんですけど、そういやテスト書いたことないなあと思って今回の記事を書くことにしました!## Ginkgoを選んだ理由
Ginkgoの書き方がなんとなくrspecに似てるからです。
昔Railsを書いていたことがあるので、簡単に書けるんじゃないかな〜っていう安易な発想です。## テストの準備
Ginkgoをインストールします。“`
go get github.com/onsi/ginkgo/ginkgo
go get github.com/onsi/gomega/…
“`ディレクトリとテスト用ファイルを作成します。
“`
mkdir fizzbuzz
cd fizzbuzz
ginkgo bootstrap
ginkgo generate fizzbuzz
“`## 実装
今回作成するテストケースは以下の通りとします。よく見るFizzBuzzですね。– 数値が3の倍数であれば「Fizz」を返す
– 数値が5の倍数であれば「
nuxtのformからPOSTされたデータをgoのサーバで受け取る(私的メモ)
## nuxt.js(vueファイル)
Vuetifyのコンポーネントを活用し、formを作成、validationとresetボタンを実装しました。
“`vue
Go構造体の`json:hoge`の正体を探る
# TL;DR
“`go:
type Person struct {
Name string `json:”name”`
}
“`– “ `json:”name”` “ は構造体のタグ
– `reflect.TypeOf(Person).Field(0).Get(“json”)`で取り出せる!# はじめに
Go言語でjsonを扱うとき、構造体定義にjsonのフィールド名を書くと思います。“`go:
type Person struct {
Name string `json:”name”`
Age int `json:”age”`
Address string `json:”address”`
}
“`おまじないと思って深く考えず使っていましたが、
– そもそも“ `json:”name”` “って何?
– ただのコメント?
– jsonのためだけの特別構文?という疑問がわいたので調べてみました。
# json:hoge は構造体のタグ
公式ドキュメントに早速答えがありました。~~ちゃんとふだんから読みなさ
Golang + Sonarqube + Codebuild
https://qiita.com/fake-deli-ca/items/e01a42a9d04cf0bab8c4
の後にJenkinsじゃなくてCodeBuildも対応してみたんだけど、異様にわかりにくくて、時間かかった…。# 結論
最初に結論から。
関係する箇所のみ抜粋してある。“`buildspec.yml
version: 0.2env:
variables:
GO_VERSION : “”
PROJECT_VERSION : “”
# 本来はParameter-Storeにすべき
SONARQUBE_TOKEN : “XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX”phases:
install:
runtime-versions:
golang: ${GO_VERSION}
commands:
– type go && go version
– chmod +x ./gradlew
– export