Go関連のことを調べてみた2020年05月09日

Go関連のことを調べてみた2020年05月09日

【Golang】パッケージのインポート

#【Golang】パッケージのインポート
Golangの基礎学習〜Webアプリケーション作成までの学習を終えたので、復習を兼ねてまとめていく。
基礎〜応用まで。

“`
//package
package main

//標準パッケージ(ライブラリ)
//内部(自分のsrc)=ライブラリ
//それ以外=パッケージ 特に違いはない
//公式ドキュメントにパッケージ一覧がある https://golang.org/pkg/
//import “fmt”
//import “time”

//独自ライブラリ
//GOPATH/src 以下にライブラリ用フォルダを作成する。
//GOPATHに無いとimportできない

//importしたパッケージは使用しないとエラーになる
//複数の場合()で囲んだほうがいい
//import()
import (
“fmt”
“time”

//読み込む アルファベット順にする。自分のパッケージと、標準と分ける。
//Aproject
// |- Alib – a.go
// | |-under – b.go
/

元記事を表示

golang やってみた mainに引数を入れつつ go routineを入れてみた

mainにコマンドライン実行時に引数を与えるには、flagを使う。
何も指定しないと、Stringの配列で取得されるので、数字をとるなら、strconvで型変換が必要だった。
引数に、引数名を指定できるので、その場合は型も指定できる。

go routineで、先に終わったものをselectで取得するようにしてみた。
単純な計算なので、先に始めた方が先に終わるのかな。
go routineの前後を入れ替えると、先に終わるのが変わる。

“`
package main

import (
“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 main

import (
“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 main

import (
“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 sub

func Sub() {
println(“sub func”)
}
“`

## 呼び出し方法
“`golang:main.go
package main

import (
//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 main

import (
“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 main

import (
“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)
エディタ:VisualStudioCode

Go言語の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 main

import (

元記事を表示

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 main

import (
“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 main

import (
“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 main

import “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 main

import (
“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
demo.jpg

# このツールでできること
コマンドラインから以下操作が可能です。
* ブック作成、削除
* シート作成、削除、リネーム、ダンプ(全値出力)
* セル値出力、更新

# バイナリ
以下においています。
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 main

import (
“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

元記事を表示

OTHERカテゴリの最新記事