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

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

AtCoder Beginner Contest 184のメモ

# 前置き

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

# 問題

https://atcoder.jp/contests/abc184

# A

“`Q_A.go
package main

import (
“fmt”
)

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

ans := a * d – b * c

fmt.Printf(“%d\n”, ans)

}
“`

# B
“`Q_B.go
package main

import (
“fmt”
“strings”
)

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

var S string
fmt.Scanf(“%s”, &S)

result := strings.Split(S, “”)

元記事を表示

LeetCodeに毎日挑戦してみた 20. Valid Parentheses(Python、Go)

## はじめに

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

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

#### Leetcodeとは

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

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

#### 6問目(問題20)

#### 20. Valid Parentheses

– 問題内容(日本語訳)

> 文字列を考える`s`だけで文字を含む`'(‘`、`’)’`、`'{‘`、`’}’`、`'[‘`と`’]’`、入力文字列が有効であるかどうかを決定。
>
> 入力文字列は、次の場合に有

元記事を表示

SOLID原則を理解するためにGo言語で書いてみた

# SOLID原則について

## SOLID原則とは

– SRP(単一責任の原則)
– OCP(オープン・クローズドの原則)
– LSP(リスコフの置換原則)
– ISP(インターフェース分離の原則)
– DIP(依存関係逆転の原則)

の頭文字を取ったものである。

## なぜSOLID原則?

SOLIDを適用する理由として、

– 変更に強くなる
– 理解しやすくなる
– 多くのソフトウェアシステムで利用できること

が挙げられます。
以下から、各原則の説明、コードについて触れていきます。

# SOLIDの各原則について

## SRP(単一責任の原則)

###説明

1つのモジュールやクラス、関数などを変更する際に、理由が複数あってはいけないという原則
理由としては以下のような事象が起きることを防ぐため

– 複数の人が一つのソースファイルを変更した際に、マージやコンフリクトが発生
– 変更した内容が予期しないところに影響を受ける

### コード

#### 悪い例

一つのインタフェースで従業員の管理、従業員のデータの保存と複数の責務を負っている。

“`go

元記事を表示

Go言語のTwitter APIで定期的にツイートする

###用意するもの
・MAC(PC)
・AWS Lambda
・Twitter API
・Twitterアカウント

###やったこと
####1.Twitter API申請
下記URLからTwitter API申請をします。
https://developer.twitter.com/ja/docs

API key & secretとAccess token & secretを取得します。

####2.Go言語で書く
Twiiter認証用のソースコードを書きます。
別にファイルは分けなくてもいいです。

“`go:keys.go
package keys

import
(
//Twitter APIに必要なimportになります。なければインストールしましょう。
“github.com/ChimeraCoder/anaconda”
)

func GetTwitterApi() *anaconda.TwitterApi {
anaconda.SetConsumerKey(“API Key”)
anaconda.SetConsumerSecret(“

元記事を表示

gRPCに入門する~gRPC-Webで実装もしてみる~

# はじめに
タイトルにもある通りgRPCに入門してみたので実際に動かしてみようと思います。

この記事は、僕がgRPCに入門して、「gRPCって何?」から「gRPCちょっとわかってきたな」になるまでにやったことをまとめた(説明した)ものになっているので、同じような状況の方におすすめです。

**この記事の内容**

– gRPCについて軽く説明
– gRPC-Webについて軽く説明
– Go × TypeScript × gRPC-Webで実際に動かしてみる

入門したでなので、訂正や補足などありましたら、是非コメントお願いします!?‍♂️

# gRPC とは
## RPC とは
gRPCとはなんぞや、という話に行く前にRPCとはなんでしょうか。

**RPC**はRemote Procedure Callの略で、「遠隔手続き呼び出し」とも呼ばれます。
簡単に説明すると、他サーバー上の関数を呼び出し、実行することを可能にする手法です。
また、同じRPCの仕様に準拠していれば、呼び出される関数は別の言語で実装されていてもかまいません。

そして、呼び出しの規約は**インタフェース記述

元記事を表示

現場で使えるゴルーチン(並列制御)

“`
func main() {
ch := make(chan struct{}, 10)
var wg sync.WaitGroup
for i := 0; i < 1000; i++ { ch <- struct{}{} wg.Add(1) go func(i int) { defer func() { <-ch wg.Done() }() fmt.Println(i) }(i) } wg.Wait() } ``` https://play.golang.org/p/Cry94fFpeFH

元記事を表示

GOでPostgresqlへ接続する

## DockerでPostgreを起動する

“`docker-compose.yml
version: “3”
services:
postgres:
image: postgres
container_name: postgres
ports:
– 5432:5432
environment:
– POSTGRES_USER=root
– POSTGRES_PASSWORD=password
tty: true
restart: always
user: root
volumes:
– ./init:/docker-entrypoint-initdb.d
– /etc/localtime:/etc/localtime:ro
pgweb:
image: sosedoff/pgweb
container_name: pgweb
ports:
– “8081:8081”
environment:

元記事を表示

Go言語の特徴

# 概要
* [Gocci.me](“https://gocci.me/”)と言うサービスをGo言語で開発しており、そのGo言語の持つ特徴をまとめました

# 言語設計と文法
## シンプル
Go言語はいろいろな書き方が存在するわけではなく、ある程度書き方が決まっているので、シンプルに実装することができます。
比較的昨日の割には言語仕様を理解しやすくなっています。

## コンパイル言語
コンパイル言語とは実行をする前に**一括で全てのコードを機械語もしくは中間言語にコンパイル(翻訳)する言語**のことです。
コンパイル言語は**記述方法が厳密**と言う特徴がありますが、一括で機械語に変換してコンピュータに処理させるため、**処理が高速**であると言う特徴を持ちます。
Go言語は**コンパイル速度も早い**と言われています。

## 静的型付け
Go言語ではプログラムを書く際に**予め型を指定しなければいけません**。
静的型付けは事前にコンパイルを行うことで、プログラムの実行時には型の生合成チェックをする必要がなく、処理が高速になります。
また、コンパイル時に型のチェックを行うため、

元記事を表示

LeetCodeに毎日挑戦してみた 14.Longest Common Prefix (Python、Go)

## はじめに

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

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

#### Leetcodeとは

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

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

#### 5問目(問題14)

#### 14.Longest Common Prefix

– 問題内容(日本語訳)

> 文字列の配列の中から最も長い共通のプレフィックス文字列を見つける関数を記述します。
>
> 共通のプレフィックスがない場合は、空の文字列を返します`””`。

**Ex

元記事を表示

golangのos/execでMakefileのmakeコマンドを実行しようとすると2回目以降の実行がエラーになる

## 原因
わからん

## 対処方法
シェルでmakeコマンドを呼び出すようにする

### Go側
– フルパスじゃなくても大丈夫のはず

“`golang

cmd := exec.Command(“/home/yuta/AWS/go/bin/exec.sh”, domain.Name)
cmd.Run()
“`

### シェル側

– 事前にchmodで実行権限をつけてあげる

“`exec.sh
#!/bin/sh

cd /home/yuta/AWS
make make-env-config ENV_FILE=.env DOMAIN_NAME=${1}
“`

元記事を表示

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ビット符号付き整数の範囲内の整数を格納することができる環境を扱っていると仮定

元記事を表示

OTHERカテゴリの最新記事