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

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

GO gorm DB作成 INSERT JSONUnmarshal Mysql

こんにちは! GO学習中です!

今回はgormでinsertしてみたいと思います!

[データは前回getしたapi](https://qiita.com/13Slhr77Cgzn892/items/22d4670a201fff221b61)
のデータを使用します。

DB自体をGOから作成した記事は[こちら](https://qiita.com/13Slhr77Cgzn892/items/7c28e4079e9b7407df6a)です。

では始めていきたいと思います。

### mysql.go

“`go
// root/app/models/fgi.go
package mysql

import (
“database/sql”

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

// SQLConnect DB接続
func SQLConnect() (database *gorm.DB, err error) {
DBMS := “mysql”
USER := “root”
P

元記事を表示

LeetCodeに毎日挑戦してみた 13. Roman to Integer (Python、Go)

## はじめに

無料英単語サイト[E-tan](https://your-e-tan.com/)を運営中の@ishishowです。

プログラマとしての能力を上げるために毎日leetcodeに取り組み、自分なりの解き方を挙げていきたいと思います。

#### Leetcodeとは

[leetcode.com](https://leetcode.com/)
ソフトウェア開発職のコーディング面接の練習といえばこれらしいです。
合計1500問以上のコーデイング問題が投稿されていて、実際の面接でも同じ問題が出されることは多いらしいとのことです。

Go言語入門+アルゴリズム脳の強化のためにGolangとPythonで解いていこうと思います。(Pythonは弱弱だが経験あり)

#### 4問目(問題13)

#### 13. Roman to Integer

– 問題内容(日本語訳)

> :ローマ数字は、7つの異なる記号で表され `I`、`V`、`X`、`L`、`C`、`D`と`M`。
> シンボル 値
> I 1
> V 5
> X 10
> L 50
> C 10

元記事を表示

Goのdeferの仕組みをきちんと理解する

deferって関数の最後で実行させたい処理に使うんでしょ、程度に考えていたが、きちんと理解をしようとdeferについて深堀りしてみた。

# deferについてざっくり説明
– deferで処理を記述しておくとfuncの最後で実行してくれる。
– 以下の例だと、”今日は”が実行され、funcの終わりになるので、その後”金曜日です。”が実行される。

“`go
func hogehoge() {
defer fmt.Println(“金曜日です。”)
fmt.Println(“今日は….”)
}
“`
“`
今日は….
金曜日です。
“`

# ちょっと深堀り
[Tour of Go](https://tour.golang.org/flowcontrol/12)の説明によると

1. 囲まれているfunctionがreturnされるまで実行が見送られる。
2. defer呼び出しの引数は即時に評価されるが、実行がreturnされるまで見送られる。

との説明がある。
1はなんとなく理解できるが、2の**”即時に評価される”**という記述が気になったの

元記事を表示

制限時間付き標準入力

プログラムを書いていて一度は制限時間のある、標準入力を作りたいと思ったことはあると思います。因みに僕はありません。
以外と簡単に Go で実現できたのでメモがてら書きます。いつかの自分のためですね。

## 方法

方法はいたって簡単で、標準入力を受け取るサブルーチンを作って、入力テキストをチャンネルで受け取るだけです。

“`go
in := make(chan string, 1)
go func() {
sc := bufio.NewScanner(os.Stdin)
sc.Scan()
in <- sc.Text() }() ```` 上記のチァンネルと `time.NewTimer` や `time.NewTicker` を組み合わせることで簡単に実現できます。 ```go timer := time.NewTimer(time.Second * 10) select { case text := <-in: // 入力を使った処理 case <-timer.C: // タイムアウト時の処理 } ``` ## 適当に作ったサンプル 上記の

元記事を表示

“go build”した時に何が起きているのか?

この記事は [How “go build” Works](https://maori.geek.nz/how-go-build-works-750bb2ba6d8e) の翻訳記事です。

`go build`はどのようにして最も単純なGolangプログラムをコンパイルしているのでしょうか?

この記事ではその疑問を解消することを目標にしています。

最も単純な以下のプログラムについて考えてみましょう。

“`go
// main.go
package main

func main() {}
“`

`go build main.go`を実行すると、1.1Mbの実行可能ファイル`main`が出力され、何も実行されません。 この何もしないバイナリを作成するために、`go build`は何をしたのでしょうか?

`go build`コマンドはいくつかの便利なオプションを提供しています。

1. `-work`: `go build`は、作業ファイル用の一時フォルダーを作成します。 この引数は、そのフォルダーの場所を出力し、ビルド後に削除しません
2. `-a`: Golangは、以前に

元記事を表示

LeetCodeに毎日挑戦してみた 9. Palindrome Number (Python、Go)

## はじめに

無料英単語サイト[E-tan](https://your-e-tan.com/)を運営中の@ishishowです。

プログラマとしての能力を上げるために毎日leetcodeに取り組み、自分なりの解き方を挙げていきたいと思います。

#### Leetcodeとは

[leetcode.com](https://leetcode.com/)
ソフトウェア開発職のコーディング面接の練習といえばこれらしいです。
合計1500問以上のコーデイング問題が投稿されていて、実際の面接でも同じ問題が出されることは多いらしいとのことです。

Go言語入門+アルゴリズム脳の強化のためにGolangとPythonで解いていこうと思います。(Pythonは弱弱だが経験あり)

#### 3問目(問題09)

#### Palindrome Number

– 問題内容(日本語訳)

> 整数が回文であるかどうかを判別します。整数は、前方と後方で同じように読み取られる場合、回文です。
>
> **フォローアップ:**整数を文字列に変換せずに解決できますか?

**Ex

元記事を表示

goのjson.Marshalで空のオブジェクトが返ってくる時の解決法

# 空のオブジェクトが入るとき
“` golang
func A() string {
type ResponseData struct {
//先頭が小文字なので公開されてない
name string
value int64
}
var rd []ResponseData
rd = append(rd,ResponseData{
name:”aaa”,
value:1
})
resRaw, _ := json.Marshal(rd)
resultJSON := string(resRaw)
return resultJSON
}

“`
ResponseDataのフィールドが公開されていません。
これをすると、resultJSONに[{}]←こんなんが入ります。

# OKなやつ
“` golang
func A() string {
type ResponseData struct {
//先頭が大文字なので公開されている
Name string
Value int

元記事を表示

Elasticsearch + Sudachi + Go + echoで城検索APIを作ってみた

ElasticsearchとGo言語の学習がてらに検索APIを作ってみたので、成果物の利用方法、構成について、困ったことについてまとめてみました。

実行環境
https://github.com/takenoko-gohan/castle-search-api-environment
検索API
https://github.com/takenoko-gohan/castle-search-api

## 環境構築

環境構築では、dockerとdocker-composeを使用します。

“`sh
git clone https://github.com/takenoko-gohan/castle-search-api-environment.git
cd castle-search-api-environment
docker-compose build –no-cache
docker-compose up -d
# elasticsearch 起動後しばらくしてから実行してください
sh es/script/es_init.sh
“`

## 利用方法

検索APIを

元記事を表示

【Go】標準入力から受け取ったポケモンの種族値を返すツールを作成

こんにちは、ヤマウチです!
2020/11/14に弊社の福岡支店にてデブキャンを行いました。
泊りがけでなんかしてそうな名前ですが、1年半くらい前から最低月1以上継続して行っているものの、未だに日帰りしかありません。。。
まあそれは置いとくとして、今回作ったツールを紹介していこうと思います!
ちなみにGo言語に関してはスーパー初学者でして、ツールみたいなのを作ったのも初めてなので、コードは色々と問題があると思いますw

## 今回のツールをざっくり紹介
今回のツールですが、APIとそれを叩く側を別で作成しました。
これがリポジトリです。
API:https://github.com/y-keisuke/pokemon
叩く側:https://github.com/y-keisuke/pokemon_command
レビューしてやるかってくらいの気持ちで見てくださいw

本当は一つのリポジトリにまとめたかったんですが、それが可能なのかもよくわからずにリポジトリを分けたので、あとから使ったコマンドの方だけリポジトリにcommandってついてます。っていうどうでもいい話。

ということでざっ

元記事を表示

LeetCodeに毎日挑戦してみた 7.Reverse Integer (Python、Go)

## はじめに

無料英単語サイト[E-tan](https://your-e-tan.com/)を運営中の@ishishowです。

プログラマとしての能力を上げるために毎日leetcodeに取り組み、自分なりの解き方を挙げていきたいと思います。

#### Leetcodeとは

[leetcode.com](https://leetcode.com/)
ソフトウェア開発職のコーディング面接の練習といえばこれらしいです。
合計1500問以上のコーデイング問題が投稿されていて、実際の面接でも同じ問題が出されることは多いらしいとのことです。

Go言語入門+アルゴリズム脳の強化のためにGolangとPythonで解いていこうと思います。(Pythonは弱弱だが経験あり)

####

#### 2日目(問題07)

#### Reverse Integer

– 問題内容(日本語訳)

> 32ビットの符号付き整数を指定すると、整数の逆桁になります。
>
> **注:**
> 我々は、32ビット符号付き整数の範囲内の整数を格納することができる環境を扱っていると仮定

元記事を表示

LeetCodeに毎日挑戦してみた 1.Two Sum(Python、Go)

## はじめに

無料英単語サイト[E-tan](https://your-e-tan.com/)を運営中の@ishishowです。

プログラマとしての能力を上げるために毎日leetcodeに取り組み、自分なりの解き方を挙げていきたいと思います。

#### Leetcodeとは

[leetcode.com](https://leetcode.com/)
ソフトウェア開発職のコーディング面接の練習といえばこれらしいです。
合計1500問以上のコーデイング問題が投稿されていて、実際の面接でも同じ問題が出されることは多いらしいとのことです。

Go言語入門+アルゴリズム脳の強化のためにGolangとPythonで解いていこうと思います。(Pythonは弱弱だが経験あり)

#### 1日目

#### Two Sum

– 問題内容(日本語訳)

> 整数の配列と整数が与えられた`nums` 場合`target`、*合計が`target`*。になる*ように2つの数値のインデックスを*返し*ます*。
>
> 各入力には***正確に\*1つの解**があると想定でき、*同じ*

元記事を表示

ngrok使ってみた

#概要
新卒,3回目の投稿です。
ngrokを使う機会があり、非常に便利だと感じたので使い方を書いていきます。
ngrokはlocalhostで立ち上げたサーバに外部からアクセスできるようにするツールです。
今回はGoをでlocalhostを立ち上げ、私物のスマホからlocalhostにアクセスしてみました。

## ngrokをインストールする
[公式サイト](https://ngrok.com/)よりユーザー登録をしたら、zipファイルをダウンロードし、解凍します。
ユーザー登録にはgithubまたはgoogleアカウントを使うことができます。
解凍が済んだら、`ngrok.exe`を起動し、コマンドを打ち込みます。

“`
ngrok http 8080
“`
下記のような表示が見えれば完了です。
localhost:8080に対し、`https://66336728576f.ngrok.io`で外部環境からアクセスすることができます。

“`
ngrok by @inconshreveable
(Ctrl+C to quit)
Session Status

元記事を表示

goでサーバーを立ちあげたらVSCodeがフリーズ&PCが落ちる

## 起こった事
`go run ***.go`でサーバーを立ちあげた後にエディターでgoファイルを編集すると`gocode-gomod`がかなりCPUを食いエディターがフリーズ&PCが落ちてしまう、、、、

## 環境
– go 1.15.3
– docker
– VSCode

## 解決策??
設定ファイル(`setting.json`)を開き以下のコードを追記すると治るそう

“`json:setting.json
{
“go.useLanguageServer”: true,
}
“`
と言ってもまだ動きモッサリしていてマシになった程度でした、、、

## 原因
>https://github.com/golang/vscode-go/issues/249#issuecomment-647902730

`go`の候補表示してくれる`gocode-gomod`は現在メモリをかなり食ってしまうようになっているらしくメンテナンス中かつ開発がストップしているそう、、
なので、変わりに`gopls`を使ってくれとの事でした!

~~これでgoでの開発に集中できる^^~~

元記事を表示

golangでnet.ConnのRead・Writeをcontextでcancel可能にする方法

##モチベーション
ソケットから読もうとするとブロックする可能性があるので、
それをcontextでキャンセルできる様にしたい。

可能なら以下の様なコードが書きたいが、それはできないので、代替案をメモ

~~~go
select {
case size, err := conn.Read():
// 略
case <-ctx.Done(): //略 } ~~~ ## 解決策 こんな感じでSetDeadlineを使うと良い。 なお、デッドラインの設定時間により、`ctx.Done()` への応答時間が伸びたりするが、 Readへの応答時間要求に比べてctx.Done()への応答時間要求はかなりゆるい場合が多いと思うので問題になることは少ないはず。 ```go continue_read := true for continue_read { err := conn.SetReadDeadline(time.Now().Add(time.Millisecond * 500)) if err != nil { return err }

元記事を表示

Golang: 指定した間隔でぴったり毎時00分とか30分に処理を実行したい件。

# tickerが思い通りにならない!
常駐して定期的に実行したいjobがあるが、普通のtickerだと起動してからtickerを作った時からintervalカウントが始まるので、時刻ぴったりに設定できない。しかも、tickerはちゃんと12:00:00になるようにintervalを設定しても、たまに11:59:59.999に動くことがあって、処理したデータがダブって登録されてしまうことがあった。

## tickerの使い方と、時刻制御の練習もかねて書いてみた。
https://github.com/xbridges/Scheduler
単純に、指定した時間間隔でぴったりにtickerが呼び出してくれる。

ex) sch, next := NewScheduler(3600, 0)

こんな感じで開始すると、毎時00分に一度tickerが発火します。
さらに、オフセット値を使うと、インターバルは毎時(3600)だけど、offset: 600とか設定すると、毎時05分にtickerが発火します。

## 偉そうに書いてるけど、やったことはただのラップ(笑
tickerを単純にラップし

元記事を表示

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

元記事を表示

OTHERカテゴリの最新記事