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

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

Golang mysql CREATE DATABASE IF NOT EXISTS

こんにちは!Golang 勉強中です!

今回はDB作成〜接続を行なっていきます!

DB接続の方法はすぐに見つかりましたが、DB作成は手動でしている記事が多い印象でした。
直接Mysqlから実行ではなく、GOからオートマチックに操作したかったので方法を調べてみました。

[参考記事](https://stackoverflow.com/questions/30235031/how-to-create-a-new-mysql-database-with-go-sql-driver)

“`

package main

import (
“database/sql”

_ “github.com/go-sql-driver/mysql”
)

// DbConnection grobal
var DbConnection *sql.DB

func checkDb() {
DbConnection, err := sql.Open(“mysql”, “root:@tcp(127.0.0.1:3306)/”)
if err != nil {
panic(err)
}
d

元記事を表示

GraphQLにおけるRelayスタイルによるページング実装再考(Window関数使用版)

# お題
以前、以下の記事で[Relayスタイル](https://facebook.github.io/relay/graphql/connections.htm#)のお試し実装をした。

– [GraphQLにおけるRelayスタイルによるページング実装(前編:バックエンド)](https://qiita.com/sky0621/items/1e8823200633f2c46013)
– [GraphQLにおけるRelayスタイルによるページング実装(後編:フロントエンド)](https://qiita.com/sky0621/items/fdcdaefeef7cf4b750ac)

ただ、「前後ページへの移動」と「任意の項目での昇順・降順並べ替え」という要件の組み合わせが想像以上の実装の煩雑さを生み、かなり消化不良だった。
今回、使用するRDBをPostgreSQL前提とするアーキテクチャ上の縛りを入れることで、バックエンド側の実装を(前回よりは)簡略化できないか試してみた。

# 今回のサンプル実装で使った言語やライブラリ等
なお、これら個々の言語やライブラリ等についての説明は

元記事を表示

Goで香水を実装してみる

# はじめに

この記事は,学校の帰りに思いついたものを勢いだけで実装したクソコードを載せているだけのネタ記事です.
間違ってもこれを見てGoの勉強をしようなどと思わないでください.

若干 「[Javaで湯婆婆を実装してみる](https://qiita.com/Nemesis/items/c7192a7c510788d2cba2)」にインスパイアされている部分があります.

# 実装する
## コード

“`main.go
package main

import (
“fmt”
)

type human struct {
Dolce bool
Gabbana bool
Kousui perfume
}

type perfume struct {
}

func (p *perfume) say() {
fmt.Println(`僕がフラれるんだ`)
}

func main() {

Kimi := human{true, true, perfume{}}

if Kimi.Dolce && Kimi.Gabbana {
Kimi.Kousui.sa

元記事を表示

Go クラス 基本

最近go言語を使い始めて、なんとなく書けるようになったのでそろそろクラスみたいな書き方をやっていこうと思い、ここに記しておきます!
とりあえず書いてあとで細かく説明していきます。

“`go:main.go
package main

import “fmt”

type Human struct {
Age int
Name string
}

func (h Human) getName() string {
return h.Name
}

func (h *Human) Birthday(newAge int) {
h.Age = newAge
}

func main() {
v := Human{Age: 3, Name: “mike”} // インスタンス作成
fmt.Println(v.getName())
v.Birthday(24)
}
“`

##クラス定義
“`go
type Human struct {
Age int
Name string
}
“`
クラス定義はstructという構造体という概念を使用し定義します。構造体はフィ

元記事を表示

Goで関数の引数でnilを指定したときにハマった話

# 前置き

goのnilの話は n番煎じだと思いますが、ハマってしまった記念に記事を書きます..

実際のコードはもうちょっと長くてフレームワークの中だったりするので、原因の特定が大変でしたが、エッセンスだけ抜き出したものを書きます。

# このようなメソッドを作りました(失敗例)

ちなみに、テストコードで何度もHTTPRequestを投げるのでラッパー関数のつもりでした。

“`go
func Request(method, url string, body *strings.Reader) error {
request, err := http.NewRequest(method, url, body)
if err != nil {
return err
}
request.Header.Set(“Content-Type”, “application/x-www-form-urlencoded”)

client := new(http.Client)
resp, _ := client.Do(request)
defer resp.Body.Clo

元記事を表示

Gormのhas manyなテーブルのAutoMigrate()でneed to define a foreign keyと怒られる

#ドキュメントのhas manyを見る
https://gorm.io/docs/has_many.html
##追記
根本的に間違っていました。
同じような間違いをしている誰かの参考になればと思います。

#エラー内容

“`
// Vote model
type Vote struct {
gorm.Model
ID uint
Title string
Description string
WorkSheets []Worksheet
}

// Worksheet model
type Worksheet struct {
gorm.Model
ID uint
Text string
VoteNumber uint
}
“`

~~VoteのWorksheetsには特に外部キーの指定等をしていません
すると・・・~~

“`
invalid field found for struct main.Vote’s field WorkSheets,
need to define a foreign k

元記事を表示

意外と知らないVSCode上でGoを爆速開発するためのTips5選

# はじめに
最近イケイケなGo!
今回はVSCodeでGoを爆速開発するためのTipsを5つ(+おまけ1つ)紹介したいと思います。

自分もつい最近これらを知って、めっちゃ活用して開発効率を上げています!
良かったら参考にしてください。
(良いと思ったらLGTM頂けると嬉しいです?)

# Fill Struct
空の構造体にフィールドをセットしてくれてめちゃ便利です。
よく使ってます。

## 使い方
空の構造体にカーソルが当たった状態で、Command Palette(`F1` or `Ctrl + Shift + P`)で`Go: Fill struct `と入力。

![fill.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113263/64fc58dc-a252-6a02-a0e0-9893fafa7a96.png)

## 例
“`go
package main

type person struct {
name string
age int
job string
}

元記事を表示

AtCoder Beginner Contest 183のメモ

# 前置き

Atcoderをやってみたので、自分用のメモです。
あとから加筆・修正する予定です。

# 問題

https://atcoder.jp/contests/abc183

# A

“`Q_A.go
package main

import (
“fmt”
)

func main() {
var x int
fmt.Scanf(“%d”, &x)

var ans int
if x > 0{
ans = x
} else{
ans = 0
}
fmt.Printf(“%d\n”, ans)

}
“`

# B
“`Q_B.go
package main

import (
“fmt”
)

func main() {
var S_x, S_y, G_x, G_y int
fmt.Scanf(“%d %d %d %d”, &S_x, &S_y, &G_x, &G_y)

var a float64
a = float64(G_y + S_y

元記事を表示

Goのスライスについて学ぼう

この記事は、 [Arrays, slices (and strings): The mechanics of ‘append’](https://blog.golang.org/slices) を翻訳、加筆したものです。

## Introduction

手続き型プログラミング言語の最も一般的な機能の1つは、配列の概念です。

配列は単純なもののように見えますが、言語に配列を追加するときのメカニズムには多くの疑問が残ります。

– 固定長 or 可変長?
– 要素の型は?
– 多次元配列はどうなっているか?
– 空の配列の意味は?

これらの疑問への回答は、配列が言語の単なる機能であるか、その設計のコア部分であるかにまで影響してきます。

Goの初期の開発ではこれらの疑問に対する答えを持った正しい設計を考えるのに約1年かかりました。

一番苦労したのは、スライスの導入でした。

スライスは、固定サイズの配列に基づいて構築され、柔軟で拡張可能なデータ構造を提供します。

しかし、Goを初めて使用するプログラマーは、スライスの動作に関してつまずくことがよくあります。 これは、おそら

元記事を表示

多言語からみるマルチコアの活かし方

# 多言語からみるマルチコアの活かし方
# はじめに
近年では1つのCPUに複数のコアが搭載されたマルチコアが一般的になっています。
しかし、現状のプログラミング言語ではエンジニアが意識せずにマルチコアをしたプログラムを作ることは難しいです。
そこで、様々な言語から見たマルチコアの活かし方について説明していきます。

# プロセスとスレッド
プロセスとは1つ1つのアプリケーションといった実行中のプログラムのことで、スレッドは CPU利用の単位です。プロセスは次のように1つ以上のスレッドを持っており、CPUのコア数分だけスレッドを処理することができます。(また、近年では[SMT](https://ja.wikipedia.org/wiki/%E5%90%8C%E6%99%82%E3%83%9E%E3%83%AB%E3%83%81%E3%82%B9%E3%83%AC%E3%83%83%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0)という技術によって1つの物理コアで2スレッドといった複数のスレッドを処理することができます。2コア4スレッドみたいなやつです)
![スレ

元記事を表示

log.Fatalはメッセージ出力後に終了ステータス1としてプログラムを終了しようとする

結論: APIを利用する場合はきちんとドキュメントを読みましょう(´・ω・`)

go言語の`log.Fatal`、`log.Fatalf`および`log.Fatalln`はメッセージ出力後に`os.Exit(1)`を発行し、プロセスを終了しようとします。たとえば以下のようなプログラムがあったとします。

“`go:main.go
package main

import (
“fmt”
“log”
)

func main() {
fmt.Println(“BEFORE”)

log.Fatalln(“FATAL”)

fmt.Println(“AFTER”)
}
“`

これをビルドして実行すると、`FATAL`を出力した後に終了ステータス1でプログラムが終了してしまっていることがわかります (`AFTER`が出力されていない)

“`
$ go build .
$
$ ./fataltest
BEFORE
2020/11/15 21:02:55 FATAL
$
$ echo $?
1
“`

ほかのプログラミング言語やライブラリによってはログレベルとしてFATA

元記事を表示

golangのテストでDoAndReturnのところでCall with too many input argumentsエラーが出たときの対処法

“`
m.EXPECT().SomeMethod(name string, number int).DoAndReturn(func() error {
// 様々な処理
return nil
})
“`

これだと、`panic: reflect: Call with too many input arguments`エラーが出る

なので、以下のようにする

“`
m.EXPECT().SomeMethod(name string, number int).DoAndReturn(func(name string, number int) error {
// 様々な処理
return nil
})
“`

つまり、mockにしたいメソッド(SomeMethod)の引数とDoAndReturnの引数の関数の引数は一致させなければならない

元記事を表示

http.Handle()とhttp.NewServeMux().Handle()について

以下のコードがあったとする。
どちらもやっていること同じじゃないか?と思い調査した結果。

“`
http.Handle(“/any/”, anyHandler)
http.ListenAndServe(“:8080”, nil)

mux := http.NewServeMux()
mux.Handle(“/any/”, anyHandler)
http.ListenAndServe(“:8080”, mux)
“`

## 結論
どちらも内部的にやっていることは基本的に同じでした。

## http.Handle()
URLパターンと対応するhandlerをDefaultServeMuxの中に登録している。

実装としては以下の形。

“`
// Handle registers the handler for the given pattern
// in the DefaultServeMux.
// The documentation for ServeMux explains how patterns are matched.
func Handle(pattern

元記事を表示

他言語プログラマが最低限、気にすべきGoのネーミングルール

# 概要

タイトルの通り、他言語から入門した人が最低限気にするべき、ネーミングルールをまとめました。

# 対象読者

Go の基本構文を理解している方を対象読者としています。

# この記事で説明する事、説明しない事

## 説明する事

Go のファイル名、変数名等の名前付けに関するルールや慣例等を説明します。

## 説明しない事

名前付け以外で気をつけるべき Go の書き方がいくつかあります。

しかし、それらに関してはこの記事では説明しません。

# 筆者のバックグラウンド

プログラマ歴はもうすぐ 8 年程で、Go の他には以下のような言語の経験があります。

– JavaScript
– TypeScript
– PHP
– Ruby
– Java
– Scala

Go は少し前に書いて、一時期書かない時期が続いていましたが、最近また書いています。

トータルすると Go の経験は 1 年半程度です。

# 意識すべき名前付けルール

## package名

### 利用して良い文字列

[Effective Go](https://golang.org/doc/

元記事を表示

Golang api get

Golangを勉強しています。

## やること

– GolangでRakutenRapidApiを叩く
– APIKeyをconfig.iniに設定して、main.goファイルから呼び出す。
– さらに関数を別ファイルに切り分けmain.goファイルから呼び出す。

### 今回使うパッケージ
– “fmt”
– “io/ioutil”
– “net/http”
– “log”
– “os”
– “gopkg.in/ini.v1”

#### api
RakutenRapidApiに提供されている[FearAndGreed Indexを取得するAPI](https://api.rakuten.net/rpi4gx/api/fear-and-greed-index)を使用させていただきます。

クエリもなくレスポンスは1種類のみです。

## config.ini config.go
ルートディレクトリにconfig.iniを作成し、api_keyを設置します。

“`
//config.ini
[fgi]
api_key = XXXXXXXXXXXXXXXX

元記事を表示

Golangのクロスコンパイル時にsqlite3がundefinedエラーになる問題の解決

# やろうとしたこと
GolangのスクリプトをAmazon Linux上で動すためにクロスコンパイルをしようとした
# 起きたこと
Mac向けにビルドすると普通にビルドできて動くが、linux向けにビルドするとエラーに。
linux向けのクロスコンパイルの設定が間違っているのかと思って調べたら違い、どうも**sqlite3のみで起きていそう**。
## MacOS向けは上手くいく
使用したコマンド

“`
$ GOOS=darwin GOARCH=amd64 go build -o main_for_mac ./main.go
“`
ビルドに成功し、動作も正常だった。

## linuxはsqlite3でundefinedが出る
使用したコマンド

“`
$ GOOS=linux GOARCH=amd64 go build -o main_for_linux ./main.go
“`

出たエラー

“`
# github.com/dinedal/textql/storage
../{中略}/.go/pkg/mod/github.com/dinedal/textql{中略}

元記事を表示

現場で使えるQPS制御(Rate Limit) 1秒間にn回の実行に制限する

1秒間に10回実行したい場合の例

https://godoc.org/golang.org/x/time/rate を使う

“`
func main() {
limiter := rate.NewLimiter(rate.Limit(10), 1)
ctx := context.Background()

for i := 0; i < 1000; i++ { if err := limiter.Wait(ctx); err != nil { fmt.Println(err) } fmt.Println(i) } } ``` https://play.golang.org/p/ByAz9VCkGFk # 参考 https://qiita.com/lufia/items/29bf1aeb0a0fe69d16f0 https://blog.lufia.org/entry/2016/08/28/000000

元記事を表示

【Go】sqlxでIN句を含むクエリをNamedStmtで扱う

sqlxでIN句を含むクエリをNamedStmtで扱う方法のサンプルコードです。
EXISTS句にも応用可能です。
※エラーは想定していません

## サンプルコード

“`go:main.go
func main() {
userIds := []int{1, 2, 3, 4, 5}
age := 20
select(ids, createdAt)
}
“`

“`go:select.go
var db *sqlx.DB

func select(userIds []int, age int) []User {

// SQLの雛形
originQuery := `SELECT * FROM USER WHERE USER_ID IN (:USER_ID) AND AGE > :AGE`

// バインドする値
arg := map[string]interface{}{
“USER_ID”: userIds,
“AGE”: age,
}

// NamedStmtでIN句を使える形式にする
query, params := formatQuery

元記事を表示

【Golang】文字列の中に特定の文字列が含まれているかをチェックする

## 概要

以下のような変数に特定の文字列が含まれているかをチェックする方法をメモしておく

“`go
package main

func main(){
str := “abcde”
}
“`

基本的には`strings`パッケージを使うことになるが、二つ方法がある

## strings.Index

特定文字列が文字列の何文字目にあるかをチェックするメソッドだが特定文字列が含まれない場合は`-1`を返すのでそれを利用する

“`go
package main

import (
“fmt”
“strings”
)

func main(){
str := “abcde”
fmt.Print(strings.Index(str, “fg”))
// 結果:-1
}
“`

## strings.Contains

strings.Indexを紹介したが、こちらはboolで返してくれるので基本的にはこっちを使用することになると思う

“`go
package main

import (
“fmt”
“strings”
)

func

元記事を表示

FirestoreとGoのデータ型変換の関係

## ソース
– Go から Firestore のデータ型変換
https://godoc.org/cloud.google.com/go/firestore#DocumentRef.Create

– Firestore から Go のデータ型変換
https://godoc.org/cloud.google.com/go/firestore#DocumentSnapshot.DataTo

## Firestoreのデータ型
https://firebase.google.com/docs/firestore/manage-data/data-types?hl=ja

## Go から Firestore のデータ型変換
| Go | Firestore |
| — | — |
| bool | Bool|
| string | String |
| int, int8, int16, int32 and int64 | Integer |
| uint8, uint16 and uint32 | Integer |
| uint, uint64 and uintptr

元記事を表示

OTHERカテゴリの最新記事