- 1. 【Goのデバッガーdelveを使えるようにするまでの苦労・プロセス】
- 2. Goの良さを語りたい
- 3. Go言語について
- 4. DockerでSFTPサーバ立ててGoでアクセスしてみる
- 5. ubuntuに最新のgolangをインストールする
- 6. Raspberry Pi4 で GO言語を書いてみた(1)
- 7. 【Go】APIサーバを構築する② ~データの作成(Create)/更新(Update)/削除(Delete)~
- 8. Goで動くフロントエンドが作れるSSRライブラリkyotoを使ってみた話
- 9. MongoDBのfindで配列フィールドの登録数を不等号条件でfilterしたい
- 10. Golangに入門してみた
- 11. GoでのWeb Framework選択時にルーティングの問題でGinを諦めてしまった人へ
- 12. [golang error] go: gopkg.in/yaml.v2@v2.2.2: unknown revision v2.2.2を解決した話
- 13. multipass + docker on Mac
- 14. 【Go】APIサーバを構築する① ~データの読み取り(Read)~
- 15. 【Golang】go path / go get / go install / go mod tidyについて
- 16. Go の気になったコミット (2021 年 12 月)
- 17. カフェでプログラミングしてる風(でも何もやってない)Go(クソ)コード
- 18. S3にCSVファイルをアップロードしたらDynamoDBに書き込んでくれるLambdaをGolang1.xで書いてSAMでデプロイする
- 19. 【Go】http.Client に独自ルート証明書を追加する
- 20. Go Modulesの使い方
【Goのデバッガーdelveを使えるようにするまでの苦労・プロセス】
## デバッガを扱う前にGoのmodule関連でつまづいた
go get で `dlv`をinstallしたらビルド時にエラーが出た。
“`yaml
go: inconsistent vendoring in /go/src/app/xxxx:
github.com/go-delve/delve@v1.8.0: is explicitly required in go.mod, but not marked as explicit in vendor/modules.txt
golang.org/x/sys@v0.0.0-xxxxxxxx: is marked as explicit in vendor/modules.txt, but not explicitly required in go.mod
To ignore the vendor directory, use -mod=readonly or -mod=mod.
To sync the vendor directory, run:
go mod vendor
“`> go: /go/src/app/xxxx
Goの良さを語りたい
一言で言うなら「はやく作って はやく改(なお)せる」のが Go 最大のメリット
Googleが開発した言語、流行らないわけがない…!(個人的感想)もちろん苦手な領域もある
→ https://zenn.dev/nobonobo/articles/3f5310248567a1> ◆Go入門(基礎の基礎)
https://zenn.dev/ak/articles/1fb628d82ed79b> ◆初心者がGoで気を付けること
https://zenn.dev/nobonobo/articles/e0af4e8afc6c38b42ae1ネイティブコード出力で実行効率が良い
コードの可読性を重視している
開発でよく使うツールがバンドル
クロスビルドが簡単にできる
コンパイルが遅くない(LLライクにrunできる)
並行処理の抽象化を組み込み言語仕様にもつ
メモリ安全である各解説は以下で
https://zenn.dev/nobonobo/articles/e651c66a15aaed657d6e#シンプルさがGo言語が成功に至った本質的な理由
少なくとも既存の
Go言語について
#目次
1 Go言語の概要
2 Go言語の特色
3 Go言語で開発されているもの
4 まとめ
#Go言語の概要
Go言語は2009年にGoogleが開発したオープンソースのプログラミング言語である。
開発にはC言語の設計者やUNIXの開発者等の人物がかかわっている。
また、初期はLinuxとMac OSのサポートだったが、2013年にリリースされたバージョン1.0からはWindowsにも対応するようになった。
#Go言語の特色
Go言語はシンプルで高い信頼性をもつ効率的なソフトウェアを構築できる言語とされている。
Go言語はシンプルな構文のため、ほかの人が読んでも分かりやすいプログラミングを書きやすい。
また、高速な処理や並列処理が可能なため作業効率を上げることができる。
しかしGo言語はシンプル性を高めるために機能が最小限に抑えられており「例外処理」、「Generics」、「継承」等の機能が無いというデメリットも存在する。
#Go言語で開発されているもの
Go言語は主にスマートフォンアプリの開発、ドローンやロボットの組み込み開発、Webサービス、Webサーバーの構築等に使われている
DockerでSFTPサーバ立ててGoでアクセスしてみる
# 最初に
GoのSFTPパッケージ触りたかったけど、サーバ立てるのも面倒だったのでコンテナでサクッとやっちゃおうと思ったメモ## SFTPサーバ立てるメモ
[atmoz/sftp](https://github.com/atmoz/sftp)を使って“`yaml:docker-compose.yml
version: ‘3’services:
sftp:
image: atmoz/sftp
container_name: sftp-server
volumes:
– ./sftp-server/upload:/home/foo/upload
ports:
– “2222:22″
command: foo:pass:::upload
“`
な感じでyaml用意して“`
mkdir sftp-server
mkdir sftp-server/upload
docker-compose up -d –build
sftp -oPort=”2222” foo@localhost
“`
な感じでコマン
ubuntuに最新のgolangをインストールする
## 環境
Ubuntu 16.04.7## 既にgoが入っている場合は、アンインストール
ubuntuのデフォルトでインストールできるバージョンは古いので、
もし入れてしまった場合は下記でアンインストールしてください“`
$ sudo apt-get remove golang-go
$ sudo apt-get remove –auto-remove golang-go
$ sudo apt-get purge golang*
“`#### goの最新のバージョンを確認
・今回はubuntuに入れるので、「Linux」の「x86-64」から選択
https://go.dev/dl/#### 作業スペースに移動して圧縮ファイルをダウンロードし、「/usr/local」に解凍します
“`
$ wget https://go.dev/dl/go1.17.6.linux-amd64.tar.gz
$ tar -C /usr/local -xzf go1.17.6.linux-amd64.tar.gz
“`#### GO のbinの場所を環境変数に追加
`
Raspberry Pi4 で GO言語を書いてみた(1)
**はじめに**
初めての Go言語 を自分なりに理解した内容をメモ書きとして記載する。
動作は、Raspberry Pi4 上で Go言語 と 「ECHO」の環境であり その構築方法は、
[『Raspberry Pi4 に Go言語 と 「ECHO」の環境を構築する』](https://qiita.com/ytetsuo/items/60b654c0bac40d17c575)に記述している。—
***基本機能のソースコード***
ここでは、下記の基本機能に絞ったソースコードを記載する。
1. 引数(flag)
2. 表示(fmt)
3. Webサーバ(net/http)ソースコードの意味は、コメントを見て下さい。
「ECHO」に関するコードは、[https://github.com/labstack/echo](https://github.com/labstack/echo)を そのまま用いた。~~~test.go
//////////////////////////////////////////////////
// go言語 / Echo 環境下での基本動作
【Go】APIサーバを構築する② ~データの作成(Create)/更新(Update)/削除(Delete)~
#はじめに
前記事の続きでデータの作成、更新、削除の処理を追加しました。https://qiita.com/suzuki0430/items/f4396a337209cd1e37b7
#実装
各処理の実装内容について記述します。##削除(Delete)
まずは`routes.go`にルートハンドラーを追加します。“`go:routes.go
router.HandlerFunc(http.MethodGet, “/v1/admin/deletemovie/:id”, app.deleteMovie)
“`
処理の内容を`movie-handlers.go`に記述します。
パスパラメータを取得するとき、`strconv.Atoi(params.ByName(“id”))`でidの型をStringからIntに変換することに注意します。“`go:movie-handlers.go
func (app *application) deleteMovie(w http.ResponseWriter, r *http.Request) {
params := httpro
Goで動くフロントエンドが作れるSSRライブラリkyotoを使ってみた話
# 注意
本記事は試しに使ってみた程度の記事です。今回使用した[kyoto](https://github.com/kyoto-framework/kyoto)は開発初期であり、今後も多くの変更が予定されているようです。本記事はv0.2を使用しています。
https://github.com/kyoto-framework/kyoto/milestone/3
# [kyoto](https://github.com/kyoto-framework/kyoto)とは
kyotoはSSR(Server Side Rendering)のライブラリです。
https://github.com/kyoto-framework/kyoto
[ドキュメント](https://kyoto.codes/prologue/)にあるMotivationを以下に引用します。
> **Motivation**
> Main motivation is to reduce usage of popular SPA/PWA frameworks where it’s not needed becau
MongoDBのfindで配列フィールドの登録数を不等号条件でfilterしたい
## 概要
MongoDBではフィールドに配列の型を持てますが、その登録数をfindで条件にしたい時もあるかなと思います。
特定の数(例えば配列の中に1個登録)を条件にしたい場合は、[$size](https://docs.mongodb.com/manual/reference/operator/query/size/)のオペレーターを使用すれば大丈夫ですが、1個以上とか不等号を使いたくなる場合もありますよね。ただ、`$size`は数値型しか設定できないので、例えば`array_field : { $size: { $gt : 1 }`のような指定は不可となります。
では、このように不等号を使いたい場合は、どのように対応すれば良いのかというのをメモ書きします。## 対応方法
[Is there a way to query array fields with size greater than some specified value?](https://www.mongodb.com/community/forums/t/is-there-a-way-to-query-arra
Golangに入門してみた
# Golangに入門してみた
最近、転職活動をしているときにgRPCについての話があり、あまり詳しく知らなかったのでハンズオンしたいな、と思いどうせならgRPCの醍醐味である別言語間での通信を実現してみたいなと思い、現在使えるJavaScript, Python, Rubyに加え、流行のGolangを用いてAPI作ってみたいなと思い、Glangのtutorialをやってみました。
そこで、とりあえずGolangのfor文 + if文を使って平方根を求めるエクササイズがあったので、それをググりながら書いてみた。そこまで難しくないし、ヒントも出されているので、5分くらいで終わったのですが、その回答を載せます。答えは見てないので、非効率なプログラム書いているかもしれませんが、まぁいいでしょう。
## エクササイズ内容
こちらのページのエクササイズを行いました。
https://go-tour-jp.appspot.com/flowcontrol/8![](https://storage.googleapis.com/zenn-user-upload/99d4cb256a76-2
GoでのWeb Framework選択時にルーティングの問題でGinを諦めてしまった人へ
## 前置き
久しぶりに記事を書いています。(結構雑にですが)
なんで書く気になったかというと、あまりに嬉しい修正が入っていたことに気が付いたからです。
恥ずかしながら結構前のアップデートだったようですが、12月中頃に気付きました・・・GoでAPIサーバを作成する際にWAFの選択肢は様々だと思います。
`go-swagger`を使ってみようかなんて考えたり、`Echo`と`Gin`ってどっちが良いんだろうと悩んだり。ちなみに僕は過去に`Gin`を選択したり、WAFというかRouterとして`gorilla/mux`を使用したりもしていました。
そして`Gin`についてはRouterのPathの記述というか、ルーティングに悩まされることがありました。
いくつかそのような記事も見かけたので気になる方は検索してみてください。
上記のようにPathが柔軟に作れないことで一定数`Gin`を選択肢から外してしまった方もいるのでは無いでしょうか。
今回はそんなルーティングに難があったGinでかなり問題が解決されていた部分について書いていこうと思う。
## 前提
– go versi
[golang error] go: gopkg.in/yaml.v2@v2.2.2: unknown revision v2.2.2を解決した話
### 状況
Dockerでgolangとmysqlの環境構築### エラー内容
“`
go: gopkg.in/yaml.v2@v2.2.2: unknown revision v2.2.2
go: error loading module requirements
“`### さきに結論
– version (1.17)にupdateしましょう
– [上記をすでに試した場合](#自分の場合)### より詳しく
結論の繰り返しになりますが
versionを更新することで解決できます
*参考にしたissueは[こちら](https://github.com/go-yaml/yaml/issues/791)*解決できてない方は自分と同じ場合かもしれないので
先にお進みください___
そもそも**versionが本当に更新されているか**
コンテナ内で確認してみてください– **コンテナが動いてる場合**
ログインしてgo versionで調べられます– **コンテナがbuild時に失敗し強制終了している場合**
Dockerfl
multipass + docker on Mac
# Mac でのDocker環境構築
いよいよ DockerDesktopの猶予期限がくるので、移行しました。
下記どちらでコマンドをうっているのか分かりづらいので セクションタイトルに Macで実行する場合は “on Mac”、 仮想環境のUbuntuで実行する場合は ”on Ubuntu”と入れる## multipass (ubuntu の仮想起動環境)インストール on Mac
https://multipass.run/
1. 上記からmac用binaryをDownload
2. installer を起動## multipass でubuntu:latest(20.04) 起動 on Mac
あとからmemory, disk sizeを変更するのがとても大変なので最初から必要な分指定する。目的としてkubernetesのローカルデバッグをkindを使用して動かすので以下のようにmemory 10G, disk 20G, cpu core 4 程度は最低必要。“` shell
% multipass launch –name ryujidev -m 10G –
【Go】APIサーバを構築する① ~データの読み取り(Read)~
#はじめに
Go学習の一環として、簡単なAPIサーバを作成してみました。その他のGoの記事については以下をご覧ください。
https://qiita.com/suzuki0430/items/6674ffa239dc539e0fd7#%E3%83%9D%E3%82%A4%E3%83%B3%E3%82%BF
https://qiita.com/suzuki0430/items/dc82131e5e26e2cf3ae0
#実装
DBにmovies, genres, movies_genresテーブルを作成し、指定したIDのmovieを取得するようなAPIをつくります。movies
![スクリーンショット 2022-01-07 21.41.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/92ef94ef-8163-7b74-ad69-0cf08ff42ed8.png)
genres
![スクリーンショット 2022-01-07 21.41.41.png](https://qii
【Golang】go path / go get / go install / go mod tidyについて
## はじめに
Go1.17のエコシステムをまとめました。
意外に情報が少なく、私がGoを学ぶ上で最初に苦戦した領域でした。
もし間違いがあれば優しくご指摘いただけると幸いです><## GOPATHについて
GOPAHTのデフォルトは`~/go`。この下に `src/` `bin/` `pkg/`という3つのディレクトリがある。
### `bin/`
mainパッケージをビルドしたバイナリーファイルが格納される。コマンドとして実行できる。
(mainパッケージはビルドするとコマンドになる!!コマンド=実行可能なファイル)### `src/`
Goのソースコードが格納される。かつてはこのディレクトリ以下で開発する必要があった。GitHubからダウンロードしたライブラリもかつてはここに配置されていた。
### `pkg/`
ダウンロードしたパッケージのソースコード(ビルド前)が格納されるディレクトリ。コマンド以外(つまりmain pacakge以外)のビルド済のバイナリーファイルが置かれる場所でもある。mainパッケージ以外の名前のパッケージをビルドすると`hoge.
Go の気になったコミット (2021 年 12 月)
[golang/go](https://github.com/golang/go) の master ブランチに行われたコミットから個人的に気になったものをリストにしたものです。
前回作成したリストはこちら。
https://qiita.com/sg0hsmt/items/c3c3523e4f0fe6b69320
軽く説明を追加していますが勘違いや誤りがあるかもしれません。
## Topic
https://go.dev/blog/go1.18beta1
– Go 1.18 Beta 1 がリリースされました。 :rocket:
## Commits
### 2021-12-02
https://github.com/golang/go/commit/08ecdf7c2e9e9ecc4e2d7c6d9438faeed2338140
弱いメモリ一貫性モデル (メモリ参照命令が任意に並び変えられる) のアーキテクチャで実行した場合に GC が nil アクセスする不具合が修正されています。
関連 Issue を見ると以前から CI で発生していたようです。 [^1] [
カフェでプログラミングしてる風(でも何もやってない)Go(クソ)コード
# 概要
[こちら](https://qiita.com/3S_Laboo/items/660883a0184dabaea65b “こちら”)と[こちら](https://qiita.com/YottyPG/items/e988ebacab94a8f4645f “こちら”)の記事を拝見し、学び始めの言語を使うにはちょうど良さそうだと思ったので、Goで作ってみました。# 見た目
こんな感じで、ただただ何かをダウンロードしているだけの人間になります。
数秒程度であれば周りの目を誤魔化せるはず、、、、
![go_cofe.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521898/1f1f4d8b-dbef-8306-4a35-2402921fc003.gif)# 実装
“`go
package installsimport (
“fmt”
“math/rand”
“time”
)func PrintInstall() {
// 時刻からランダムなシード値を設定
rand.S
S3にCSVファイルをアップロードしたらDynamoDBに書き込んでくれるLambdaをGolang1.xで書いてSAMでデプロイする
GoでLambdaを書いてる記事が意外と少なかったので、備忘録を兼ねてさくっとまとめます。
ハマりどころもメモ程度にいくつか併記したので、別途ググってみてください。完成したコードは最後にあります。
また、DynamoDBのテーブルは「アプリ内のお知らせ機能で新しいお知らせを打つために、データのCSVをバッチ処理でDynamoDBに書き込む」という目的でつくったものです。
後半でそんな感じの記述が出てきますので、それぞれの用途に応じてよしなに読み替え書き換えてください。# 諸々のバージョン
“`:go.mod
module hogego 1.16
require (
github.com/aws/aws-lambda-go v1.27.1
github.com/aws/aws-sdk-go v1.42.25
)
“`Goは1.16である必要はなく、動かしたいものが動くバージョンであればOKです。
aws-sdk-goのREADMEには「Go1.5で`go get`するならちょっと注意が必要だよ」みたいな注意書きがあるので、少なくとも1.5以上なら動くのでしょう
【Go】http.Client に独自ルート証明書を追加する
次のようなコードになります。
実行するディレクトリに独自ルート証明書ファイルとして `my-cacert.pem` があることを想定しています。“`go
package mainimport (
“crypto/tls”
“crypto/x509”
“fmt”
“log”
“net/http”
“os”
)func main() {
pem, err := os.ReadFile(“my-cacert.pem”)
if err != nil {
log.Fatal(err)
}caCertPool, err := x509.SystemCertPool()
if err != nil {
log.Fatal(err)
}if !caCertPool.AppendCertsFromPEM(pem) {
log.Fatal(“failed to add ca cert”)
}defaultTransport, ok := http.DefaultTransport.(*http.Transport)
if !ok {
Go Modulesの使い方
## v2以上のバージョンを持つライブラリのimport
[golang/goのWiki](https://github.com/golang/go/wiki/Modules#semantic-import-versioning) に書いてある通り、v2以上ではモジュールのパスに `/vN` をいれる必要がある。これを読むだけだとわかりにくいのだが、具体的には、importする際に `import “github.com/k0kubun/pp”` のかわりに“`go
import (
pp “github.com/k0kubun/pp/v3”
)
“`とする必要がある。`/v3` なしで書くとgo.mod内で `v3.0.1+incompatible` とかになってしまう。
k0kubun/ppのリポジトリがディレクトリをv3で開始していたり、ブランチにv3を持っていたりといったことをする必要はない。
## go mod tidy
“`bash
go mod tidy
“`をやるとgo.modがいい感じになる。使わなくなったものを消したい時などに使うと