- 0.1. golang やってみた mainに引数を入れつつ go routineを入れてみた
- 0.2. 【Golang】Print系関数について調べてみた
- 0.3. GoでSQL叩く時のライブラリまとめ 2020
- 0.4. GoでDBのトランザクション処理を書いてみた
- 0.5. GoでDFSを書く(ABC161 D – Lunlun Numberを解く)
- 0.6. パッケージの分け・呼び出し
- 0.7. aws-sdk-goでFargateタスクを実行する
- 0.8. Go言語でMysql操作
- 0.9. Golang勉強メモ①環境構築
- 0.10. GormのDELETEで誤爆しないために
- 0.11. golang でランダム文字列生成
- 0.12. GoでGoogle Sheets APIを利用する【セルの更新】
- 0.13. Go/Java は Windows の MAX_PATH(260) を超えるファイルにアクセスできるのか
- 0.14. golang 型switch記法
- 0.15. 【Go/GORM】構造体の中身がインサートされない場合の対処法(Create())
- 0.16. ExcelのCRUD操作ができるツールを作ってみた #golang
- 0.17. Go言語入門 コンポジット型(配列・スライス・マップ・構造体)
- 0.18. DockerでサクッとGolangの環境作ってみた
- 1. Golang+Dockerで環境構築
golang やってみた mainに引数を入れつつ go routineを入れてみた
mainにコマンドライン実行時に引数を与えるには、flagを使う。
何も指定しないと、Stringの配列で取得されるので、数字をとるなら、strconvで型変換が必要だった。
引数に、引数名を指定できるので、その場合は型も指定できる。go routineで、先に終わったものをselectで取得するようにしてみた。
単純な計算なので、先に始めた方が先に終わるのかな。
go routineの前後を入れ替えると、先に終わるのが変わる。“`
package mainimport (
“flag”
“fmt”
“strconv”
)func main() {
flag.Parse()
x_arg, _ := strconv.Atoi(flag.Arg(0))
chan_x := make(chan int)
chan_y := make(chan int)
go func()
【Golang】Print系関数について調べてみた
#【Golang】Print系関数
Golangの基礎学習〜Webアプリケーション作成までの学習を終えたので、復習を兼ねてまとめていく。
基礎〜応用まで。“`
package mainimport (
“fmt”
“os”
)func main(){
fmt.Println(“表示”)
//標準とfmtライブラリの違い//標準
print(“Hello”)
//改行が入る
println(“Hello!”)//fmtライブラリ
//fmt標準
fmt.Print(“Hello”)
//改行
fmt.Println(“Hello!”)//Fprint系 書き込み先指定
//Stdoutは標準出力に指定
fmt.Fprint(os.Stdout, “Hello”)
fmt.Fprintf(os.Stdout, “Hello”)
fmt.Fprintln(os.Stdout, “Hello”)//Sprint系 出力ではなくフォーマットした結果を文字列で返す。変数に代入時など
fmt.Sprint(“Hel
GoでSQL叩く時のライブラリまとめ 2020
#はじめに
標準ライブラリdatabase/sql(https://golang.org/pkg/database/sql/)
以外のGoのSQLライブラリの紹介
##sqlx
https://github.com/jmoiron/sqlx
生のSQLを書く必要があるが、学習コストが少なめ。
構造体へのマッピングと名前付きパラメータに対応している。##squirrel
https://github.com/Masterminds/squirrel
squirrelはクエリビルダ。
生のSQLを書く必要がなく、SQL構文を書くようにコードをかける。
学習コストもあまり多くはない。主観だが、、##gorm
https://github.com/jinzhu/gorm
ORMマッパーのgorm
オブジェクト間のリレーションをきちんと解釈してくれる。
goのライブラリの中では最もORMっぽい。
多機能すぎて、学習コストが高いのがたまに傷。##gorp
https://github.com/go-gorp/gorp
ORMぽいgorp
ExecはAPIがあるが、基本的には生のSQL
GoでDBのトランザクション処理を書いてみた
今回は、Goでトランザクション処理を書いてみます。
“`go
import (
“database/sql”
“log”
)func withTransaction(ctx context.Context, db *sql.DB, txFunc func(*sql.Tx) error) error {
tx, err := db.BeginTx(ctx, nil)
if err != nil {
log.Println(err.Error())
return err
}
defer func() {
if p := recover(); p != nil {
tx.Rollback()
panic(p) // re-throw panic after Rollback
} else if err != nil {
log.Println(err)
tx.Rollback()
} else {
err = tx.Commit()
}
}()
err = txFunc(tx)
return err
GoでDFSを書く(ABC161 D – Lunlun Numberを解く)
# はじめに
唐突ですがGoで競プロコードはどう書くのかなと気になったのでやります.
**Goが好きなので.**
競プロ経験者だけれどGoは知らない人がこの記事を読んで「Goってこんな感じなんだ~」って流し見してくれれば嬉しいです.
## 注意
ぼく自身,競技プログラミングは弱く,かつ普段はC++を使っているので最適でなく助長な記述等になっているかもしれませんがご容赦ください.あくまで雰囲気を感じてもらえたらとおもいます.ちなみにこの問題が初めてのGoでのACになりました.また,DFS自体についての解説,問題の解説は行っていません.#やる
問題は[ABC161D – Lunlun Number](https://atcoder.jp/contests/abc161/tasks/abc161_d)を解きます.
この問題の選定理由は特にないです.ここ最近でDFS使って解けるからって所でしょうか(ABC165-Cがありますが…)
早速ですが解答コードを先に見せてから解説(?)していこうと思います.“`golang
package mainimport (
“fmt”
“
パッケージの分け・呼び出し
## パッケージを作る
ディレクトリを作成してgoファイルを作成
ファイル名はパッケージの役割がわかるように一致させるのが好ましい![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434376/cc94320b-2f62-2366-af75-cdf3a1b2a96a.png)
“`golang:greeting/hello.go
//パッケージはディレクトリ名
package greeting//呼び出しができるように大文字から始める
func Do() string {
hello := “Hello for greeting”
return hello
}“`
“`golang:greeting/sub/sub.go
package subfunc Sub() {
println(“sub func”)
}
“`## 呼び出し方法
“`golang:main.go
package mainimport (
//importはプロジェクト名から
aws-sdk-goでFargateタスクを実行する
# 背景
GolangのSDKからFargate起動タイプのECSタスクを起動したかったが、意外と情報が無かったのでまとめます。# 検証環境
– goバージョン
– go version go1.14.2 darwin/amd64
– OS
– macOS Catalina バージョン 10.15.1# コード
“`golang
package mainimport (
“fmt”
“github.com/aws/aws-sdk-go/service/ecs”
“github.com/aws/aws-sdk-go/aws”
“github.com/aws/aws-sdk-go/aws/awserr”
“github.com/aws/aws-sdk-go/aws/session”
)func main() {
svc := ecs.New(session.New(aws.NewConfig().WithRegion(“ap-northeast-1”)))
input := &ecs.RunTaskInput
Go言語でMysql操作
# 必要ライブラリのインストール
https://github.com/go-sql-driver/mysql
のライブラリーをインストールする。“`
go get github.com/go-sql-driver/mysql
“`# フォルダ構成
“`
/
├── main.go
├── mysql
│ └── mysql.go
└── sqlscan.go
“`# 個別ソース
“` golang:main.go
package mainimport (
“fmt”
“math/rand”
“strconv”
“time”_ “github.com/go-sql-driver/mysql”
)const dbuser = “root”
const dbpassword = “root”
const conecttype = “tcp”
const ipaddr = “127.0.0.1”
const port = “33060”
const databs = “my_database”func main() {
var e
Golang勉強メモ①環境構築
# 環境
Go:1.14.2
OS:Mac
git:2.20.1 (Apple Git-117)
エディタ:VisualStudioCodeGo言語のIDEとしては、他にGolandが有名だが、
一旦はフィジ確認程度で、VisualStudioCodeで不満なく使用できそうなので
VisualStudioCodeを選択。# Go本体のインストール
下記からApple MacOS向けの最新版(1.14.2)のモジュールをインストール。
https://golang.org/dl/
ダウンロードが完了したらインストーラーが起動するので、
画面の指示に従いインストールする。
インストール完了後、ターミナルを開き`go -version`と入力し
下記のように表示されたらインストール成功。“`
$ go version
go version go1.14.2 darwin/amd64
“`# パスの設定
`go env`コマンドでgoの環境変数の設定確認ができる。
今回、デフォルト設定でインストールしたところ、下記の通り設定されていた。“`
$ go env
GO11
GormのDELETEで誤爆しないために
# はじめに
**[Gormが本番テーブルの数億件のデータを消そうとした話](https://scrapbox.io/keroxp/Gorm%E3%81%8C%E6%9C%AC%E7%95%AA%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB%E3%81%AE%E6%95%B0%E5%84%84%E4%BB%B6%E3%81%AE%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E6%B6%88%E3%81%9D%E3%81%86%E3%81%A8%E3%81%97%E3%81%9F%E8%A9%B1)** が盛り上がってますね。
ゼロ値に関していうとGoの仕様上structの`0`や`空文字`が未定義(ゼロ値)なのか検索条件にゼロ値の値を設定しているのか判断出来ず
Gorm v1では取り敢えずゼロ値ならWhere句を生成しないという判断にしているため全件削除するような動きになっています。
sliceのlengthが0件の場合は流石にerrorにせいよと思う部分はありますが…この件は**GormのWhere句を生成する処理に関する
golang でランダム文字列生成
Go では乱数を返すライブラリはあれど、ランダム文字列を返すライブラリがない(少なくとも今の所は)。
というわけで、パスワードなどでランダムな文字列を生成したい場合は自分で書く必要がある。ちなみに乱数を生成するには [math/rand](https://golang.org/pkg/math/rand/) と [crypto/rand](https://golang.org/pkg/crypto/rand/) があり、本記事ではcrypto/randを使っているが、どちらでも良い。
# 方法1 乱数を使って、定義しておいた定数からランダムに抽出する
以下のような定数 letters を定義しておいて、乱数を使ってランダムに取り出す方法。よく見る。
`”abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789″`
[この記事](https://qiita.com/srtkkou/items/ccbddc881d6f3549baf1)が詳しい。“`main.go
package mainimport (
GoでGoogle Sheets APIを利用する【セルの更新】
今回はGoでGoogle スプレッドシートへの書き込みについてまとめたいと思います。
Google Sheets APIを利用する事前準備、サービスアカウントの認証については[こちら](https://qiita.com/takenoko-gohan/items/2cd6ab9463334e4acfcb)を参照してください。
Go言語、Google Sheets APIは学習途中なので間違った記述、非推奨なコードの書き方があった場合、ご指摘いただければ幸いです。## 単一の範囲を更新する場合
単一の範囲対して更新を行う際は、`Spreadsheets.Values.Update()`を使用します。
`Spreadsheets.Values.Update()`の引数は、`(スプレッドシートID, 更新範囲, sheets.ValueRange)`となります。### サンプルコード
“`go
package mainimport (
“encoding/json”
“io/ioutil”“golang.org/x/net/context”
“golan
Go/Java は Windows の MAX_PATH(260) を超えるファイルにアクセスできるのか
調査した結果、特に何もしなくてもアクセスできるようだった。
Windows の場合 CreateFile API を通じてさらにパスのプリフィクスに \\?\ をつける(「\\?\C:\Windows\test.txt」みたいに)必要があるが、Go/Java だと内部でやってくれる模様。まずは Go の場合のテスト
“`go:main.go
package mainimport (
“fmt”
“io/ioutil”
“os”“github.com/blono/win” // Fork of lxn/win see https://qiita.com/manymanyuni/items/c41f5bf0fd141e299336
)func main() {
longPath := `C:\Users\manymanyuni\Desktop\long\loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\loo
golang 型switch記法
golang勉強。
型switch記法というのが本に載ってたので、動くように書いてみた。
どの値を入れるとどう返すかをint型だけにして、main の中で直接書いてみた。“`
package mainimport “fmt”
func main() {
var x interface{} = 4 //この値をswitchのcaseで判定
switch x := x.(type) {
case int:
fmt.Printf(“%#v %T\n”, x, x)
}fmt.Println(“Hello”)
}
“`reflectを使ってtypeを判定する例
“`
package mainimport (
“fmt”
“reflect”
)func main() {
var x float64 = 3.4
fmt.Println(“type:”, reflect.TypeOf(x))
}
“`##
【Go/GORM】構造体の中身がインサートされない場合の対処法(Create())
##【はじめに – 経緯】
Go(Gin)を利用して、簡単なCRUDアプリ(今回はTodoアプリ)を作成しようと思い、ORマッパーにGORMを利用しました。
登録処理の実装時に、行のみが追加され、フロントからのデータが期待通りにインサートされずハマってしまいました。
同様の事象で悩まれている方々への共有の意味も込めて、記事にさせていただきました。
記述的に誤っている部分、ここ直せ!!的な部分がありましたら、ご教示いただけると幸いです。【参考になった記事】
https://stackoverflow.com/questions/60163323/go-gorm-cannot-insert-value
【日本語版GORMリファレンス】
https://gorm.io/ja_JP/docs/create.html
##【環境】
・MySQL 5.7.30
・Docker-composeでMySQLとGoを起動。GoのフレームワークにGinを利用。##【原因】
先に結論から言うと、Insert時に送る構造体の定義が、GORMが期待する形になっていなかったでした。
DBのカラム名を小文字
ExcelのCRUD操作ができるツールを作ってみた #golang
# はじめに
`excelize`という便利なライブラリを見つけたので、`cobra`と組み合わせてコマンドラインツールを作ってみました。
`CRUD`操作したかったので、`kubectl`調のサブコマンド構成にしてみました。# man
# このツールでできること
コマンドラインから以下操作が可能です。
* ブック作成、削除
* シート作成、削除、リネーム、ダンプ(全値出力)
* セル値出力、更新# バイナリ
以下においています。
https://github.com/kuritayu/gotools/releases# impl
## cobra
コマンドライン部分は、
* `cobra init –pkg-name パッケージ名`
* `cobra add サブコマンド`
Go言語入門 コンポジット型(配列・スライス・マップ・構造体)
プログラミング初学者が学習したことを記録するために書いています。間違っている部分があれば指摘していただけると幸いです。
Go言語の特徴と基本構文については[前回の記事](https://qiita.com/IamK/items/400ba10de1b8ad6316f7)でまとめています。
# 目次
– コンポジット型とは
– 配列
– rangeの使い方
– スライス
– マップ# コンポジット型とは
ひとことで表すと、**複数のデータ型を1つのデータ型にまとめてもの**である。
Go言語における具体的なコンポジット型を以下にまとめた。※構造体については別でまとめる予定
| 種類 | 説明 |
| — | —- |
| 配列 | 同じ型のデータを並べたデータ型 |
| スライス | 可変長な配列 |
| マップ | キーと値を連結させたデータ型 |
| 構造体 | 異なるデータ型を集めたデータ型 |# 配列
## 配列の基本
– 要素の型はすべて同じ
– 最初に決めた要素数から変更することができない## 配列の定義(その1)
宣言と代入を別で
DockerでサクッとGolangの環境作ってみた
golangの勉強のためにDockerでサクッと開発環境作ってみた。
フォルダ構成
golang_docker_api
-Dockerfile
-main.goそれぞれのファイルの内容は以下参照
Golang+Dockerで環境構築
【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 mainimport (
“fm
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
# goenvexport 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に