AtCoder に登録したら次にやること ~ これだけ解けば十分闘える!過去問精選 10 問 ~
Go言語:文法基礎まとめ
22分から AtCoder Regular Contest 089/ Beginner Contest 086 解説放送
まず原点から、次の点(t1)へ移動できるかの確認を行う t1からt2の点へ移動できるかの確認
dt = t2 -t1
dx = x2 - x1
dy = y2 - y1
条件としては、dt秒間にdx,dy動く
文字列の置き換えで全検索みたいなこともできる。
Goで文字列の置き換えをする(strings packageのReplace)
func Reverse(s string) string {
runes := []rune(s)
for i, j := 0, len(runes)-1; i < j; i, j = i+1, j-1 {
runes[i], runes[j] = runes[j], runes[i]
}
return string(runes)
}
Goのinterfaceがわからない人へ 急いで学ぶGo lang#6 インターフェイス
interfaceの中にある関数名と同一の関数が全て実装されている構造体に自動的に実装される
sort.Sort
# interfaceを実装する必要がある
Go 標準パッケージの sort を読んでみる
sort パッケージ
GolangのSort処理について
入力した自然数の各桁の数字の和を計算 整数の各桁の和を求める方法 | Python
同一オリジンポリシーを避け、異なるドメイン間でリソースを共有する仕組みのことをさす。
CORSまとめ CORS (Cross-Origin Resource Sharing) ってなに?
あるオリジンから読み込まれた文書やスクリプトについて、そのリソースから他のオリジンのリソースにアクセスできないように制限するもの
二つのページのプロトコル、ポート番号 (もしあれば)、ホストが等しい場合、両者のページは同じオリジンです。
- 小さい方からK番目はXである
- X-1以下 K個未満、X以下 K個以上
- X以下 K個以上ある最小のXを求める
- 二分探索が使えるようになる
- Xを決めたときに、X以下の数字はK個以上あるのかを繰り返し探す
AtCoder Regular Contest 037 解説
関数の中で、引数として渡すパターンと返り値として書くパターンがよく使われるイメージ。
Go言語 - 無名関数
下記で指定されているnums
の要素数だけ、for文が回る。
for i, v := range nums {
fmt.Print(fmt.Sprintf("index:%d,value:%d\n", i, v))
}
配列は固定長で、スライスは可変長
Go言語 スライスの確認 Go言語の基本 — array と slice の違い
スライスを定義するときに使用する。
make(型, 要素数, 容量)として使う。 スライスが初期化され、デフォルトではゼロ値として0が格納されている。 容量を省略すると、要素数==容量となる
Go言語 スライスの確認 Go言語の可変長配列(slice)を使う上での注意
二分探索 AtCoder 037 C
- 値渡しと違って、間接的に参照・操作できる
- 値渡しだと関数の引数として構造体を渡した場合に、その構造体のコピーが生成されてしまい、元の構造体に影響を与えない。ポインタ渡しだと影響を与えることができる。
- 単純にORマッパーなどのライブラリがポインタを使うので使わざるを得ない
- 大きな構造体を値渡しするとコピー処理で性能が劣化する。 ポインタ渡しの場合には固定で8バイト(64bit)/4バイト(32bit)なので性能が劣化しない。
変数のアドレスを指し示すもの。
変数の場所を指し示す変数。
ミカン箱Aは13番のマス目にあるよ
- コンテストに参加する
- 間違えた箇所を復習する
組合せ最適化問題を解く際に、ある要素を選んで損をすることがないので、その要素を選ぶと仮定して探索空間を小さくする、
複数の入力値受け取り Go 言語で標準入力から読み込む競技プログラミングのアレ --- 改訂第二版
func nextInt() int {
sc.Scan()
i, e := strconv.Atoi(sc.Text())
if e != nil {
panic(e)
}
return i
}
var sc = bufio.NewScanner(os.Stdin)
func main() {
sc.Split(bufio.ScanWords)
n := nextInt()
x := 0
for i := 0; i < n; i++ {
x += nextInt()
}
fmt.Println(n)
fmt.Println(x)
}
package main
import (
"fmt"
)
// 最大公約数
func gcd(a, b int) int {
if b == 0 {
return a;
}
return gcd(b, a%b);
}
func main() {
var a, b int
fmt.Scan(&a, &b)
// 最小公倍数
cal := a * b / gcd(a, b)
fmt.Println(cal)
}
3つ以上の数の最大公約数と最小公倍数
プログラミング言語 Go 最大公約数と関数型プログラミング
(問題) 1071 と 1029 の最大公約数を求める。
1071 を 1029 で割った余りは 42
1029 を 42 で割った余りは 21
42 を 21 で割った余りは 0
よって、最大公約数は21である。
レイヤードアーキテクチャ の実装
- sql-migrate設定ファイル作成
- sql-migrateがしようできるか確認
作成するまでの手順
- export GO111MODULE=on`を.bashrcとかに書く
- GOPATH配下に新規でプロジェクト(フォルダ)を作成する
go mod init [ファイル名]
とコマンドを実行する(go.modというファイルが生成される)- 外部パッケージをimportしたGoのプログラムを書く
引数 戻り値
func div(a, b int) (int, int) {
q := a / b
r := a % b
return q, r
}
func 関数名(引数の定義) 戻り値型 {
関数本体
}
// 戻り値のない関数
// 戻り値のない関数
func hello() {
fmt.Println("Hello!")
return
}
interface{}型
初期値として<nil>という特殊な値をとる
[変数名] := [変数の値]
もしくは
var [変数名] = [変数の値]
型推論が行われ、型指定の必要がない
レイヤードアーキテクチャの実装
依存関係を整理できる
依存関係が複雑になった場合、広範囲に渡って修正することになったり、問題の切り分けが困難になる。 これを解決するためには、伝搬に工夫が必要になってくる。 この伝搬に関わってくるのが、依存関係になる。
UI(handler) → アプリケーション(useCase) → モデル(domain) ⇦ インフラストラクチャ(Infra)
逆のパターンを考えると、答えが導ける。
依存関係が相互に存在すると変更に弱くなりがち。 依存関係が相互にあると、どちらか一方の変更でもう一方が壊れるリスクが発生してしまう。
つまり単方向にすると、この問題を解消できる。
すべての依存が中心に向かっているこの状態が理想です。
ユーザからのリクエストは Handler で受け取られ、 UseCase を使って処理が行われます。 さらに、UseCase は Domain を使って処理を行います。
APIリクエスト→Handler→Usecase→Domain Domainの中心に向かって依存が発生している。
モデルという形で定義します。
interfaceを定義
技術的関心事を扱う層
ユースケースを満たす処理の流れを扱う
HTTPリクエストを受け取り、UseCaseを使って処理を行い、結果を返す層
プログラムの依存関係とモジュール構成のこと
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
Goのinterfaceがわからない人へ
今すぐ「レイヤードアーキテクチャ+DDD」を理解しよう。(golang)
【Golang + レイヤードアーキテクチャ】DDD を意識して Web API を実装してみる
paiza
Cで完全数を判定する golangを基礎から学ぶ 制御構造編
paiza
var sc = bufio.NewScanner(os.Stdin)
func inputText() string {
sc.Scan()
return sc.Text()
}
var i int
i, _ = strconv.Atoi("255")
fmt.Println(i) // => 255
paiza
go mod init [フォルダ名]
Golang 1.11でGO111MODULE=onの状態でグローバルにgo getできない時の対処法
エラーで学ぶGolang Go 言語(Golang) はまりどころと解決策 Go言語で「なかった」の返し方
paiza
Go 言語で標準入力から読み込む競技プログラミングのアレ --- 改訂第二版
Goで標準入力から文字列や数値列を取得する
type Vertex struct {
X int
Y int
S string
}
コンパイル
go build main.go
実行
go run main.go
build
→go.modが編集される
→go.sumが作成される