Skip to content

Instantly share code, notes, and snippets.

@sanoyo
Last active January 14, 2020 21:42
Show Gist options
  • Save sanoyo/20ea034bea8b33e239a694d91969d2dd to your computer and use it in GitHub Desktop.
Save sanoyo/20ea034bea8b33e239a694d91969d2dd to your computer and use it in GitHub Desktop.
Go メモ

Goの学習記録[1ヶ月目]

AtCoder に登録したら次にやること ~ これだけ解けば十分闘える!過去問精選 10 問 ~
Go言語:文法基礎まとめ

1/14

AtCoder 086 C

22分から AtCoder Regular Contest 089/ Beginner Contest 086 解説放送

まず原点から、次の点(t1)へ移動できるかの確認を行う t1からt2の点へ移動できるかの確認

dt = t2 -t1
dx = x2 - x1
dy = y2 - y1

条件としてはdt秒間にdx,dy動く

1/13

AtCoder 049 C AtCoder 086 C

文字列の置き換え

文字列の置き換えで全検索みたいなこともできる。
Goで文字列の置き換えをする(strings packageのReplace)

文字を逆にする

Golang: 文字列を逆順に並べ替える

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)
}

1/12

AtCoder 049 C AtCoder 085 C

break

Goのラベル

1/11

ドワンゴの挑戦状

A - Falling Asleep

interface

Goのinterfaceがわからない人へ 急いで学ぶGo lang#6 インターフェイス

interfaceの中にある関数名と同一の関数が全て実装されている構造体に自動的に実装される

1/9

AtCoder 085 B

Go sort

sort.Sort
# interfaceを実装する必要がある

Go 標準パッケージの sort を読んでみる
sort パッケージ GolangのSort処理について

ソート

ソートを極める! 〜 なぜソートを学ぶのか 〜

クイックソート

クイックソート

map

Go言語 - マップの基本的な操作

1/8

AtCoder 088 B

スライス削除

Go言語: スライスから要素を削除する

1/7

AtCoder 083 B

各桁数の計算

入力した自然数の各桁の数字の和を計算 整数の各桁の和を求める方法 | Python

1/6

AtCoder 087 B

1/5

AtCoder 037 C AtCoder 081 B

CORS(コルス)

目的

同一オリジンポリシーを避け、異なるドメイン間でリソースを共有する仕組みのことをさす。

CORSまとめ CORS (Cross-Origin Resource Sharing) ってなに?

同一オリジンポリシー

あるオリジンから読み込まれた文書やスクリプトについて、そのリソースから他のオリジンのリソースにアクセスできないように制限するもの

同一オリジンポリシー

オリジンの定義

二つのページのプロトコル、ポート番号 (もしあれば)、ホストが等しい場合、両者のページは同じオリジンです。

037 C問題

順序

  1. 小さい方からK番目はXである
  2. X-1以下 K個未満、X以下 K個以上
  3. X以下 K個以上ある最小のXを求める
  4. 二分探索が使えるようになる
  5. Xを決めたときに、X以下の数字はK個以上あるのかを繰り返し探す

解説スライド

AtCoder Regular Contest 037 解説

無名関数

関数の中で、引数として渡すパターンと返り値として書くパターンがよく使われるイメージ。
Go言語 - 無名関数

range

下記で指定されているnumsの要素数だけ、for文が回る。

for i, v := range nums {
  fmt.Print(fmt.Sprintf("index:%d,value:%d\n", i, v))
}

Goでよく使用するデータ型

配列とスライスの違い

配列は固定長で、スライスは可変長

Go言語 スライスの確認 Go言語の基本 — array と slice の違い

make

スライスを定義するときに使用する。

make(型, 要素数, 容量)として使う。 スライスが初期化され、デフォルトではゼロ値として0が格納されている。 容量を省略すると、要素数==容量となる

Go言語 スライスの確認 Go言語の可変長配列(slice)を使う上での注意

1/4

二分探索 AtCoder 037 C

Go ポインタ渡し

Golangのポインタ渡し初心者を卒業した

ポインタ渡しを使用するのか

  • 値渡しと違って、間接的に参照・操作できる
  • 値渡しだと関数の引数として構造体を渡した場合に、その構造体のコピーが生成されてしまい、元の構造体に影響を与えない。ポインタ渡しだと影響を与えることができる。
  • 単純にORマッパーなどのライブラリがポインタを使うので使わざるを得ない
  • 大きな構造体を値渡しするとコピー処理で性能が劣化する。 ポインタ渡しの場合には固定で8バイト(64bit)/4バイト(32bit)なので性能が劣化しない。

ポインタ

変数のアドレスを指し示すもの。

ポインタ変数とは

ポインタ変数

変数の場所を指し示す変数。

ミカン箱Aは13番のマス目にあるよ

Go function

golangの関数をまとめてみた。

おすすめAtcoderの問題

AtCoder 版!蟻本 (中級編)

AtCoderのおすすめ勉強方法

  • コンテストに参加する
  • 間違えた箇所を復習する

AtCoderでの勉強の仕方(コンテスト編)

1/3

AtCoder

計算式

Go言語 計算のサンプル(a += 3やa++)

1/2

AtCoder

組合せ最適化問題を解く際に、ある要素を選んで損をすることがないので、その要素を選ぶと仮定して探索空間を小さくする、

複数の入力値受け取り 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)
}

1/1

AtCoder AtCoder

最小公倍数

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である

ユークリッドの互除法

書式指定子

忘れがちなGo言語の書式指定子を例付きでまとめた


12/31

レイヤードアーキテクチャ の実装

実装する順序

  • sql-migrate設定ファイル作成
  • sql-migrateがしようできるか確認

go mod についての理解

作成するまでの手順

  1. export GO111MODULE=on`を.bashrcとかに書く
  2. GOPATH配下に新規でプロジェクト(フォルダ)を作成する
  3. go mod init [ファイル名]とコマンドを実行する(go.modというファイルが生成される)
  4. 外部パッケージをimportしたGoのプログラムを書く

Go1.11でgo modを使う方法と注意点

12/25

AtCoder

基礎

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型

interface{}型

初期値として<nil>という特殊な値をとる

型推論

[変数名] := [変数の値]
もしくは  
var [変数名] = [変数の値]

型推論が行われ、型指定の必要がない

12/23

AtCoder

12/22

レイヤードアーキテクチャの実装

レイヤの必要性

依存関係を整理できる

なぜ依存関係が重要なのか?

依存関係が複雑になった場合、広範囲に渡って修正することになったり問題の切り分けが困難になる。 これを解決するためには、伝搬に工夫が必要になってくる。 この伝搬に関わってくるのが、依存関係になる。

レイヤ設計

UI(handler) → アプリケーション(useCase) → モデル(domain) ⇦ インフラストラクチャ(Infra)

単方向であると何が良いのか?

逆のパターンを考えると、答えが導ける。

依存関係が相互に存在すると変更に弱くなりがち。 依存関係が相互にあると、どちらか一方の変更でもう一方が壊れるリスクが発生してしまう。

つまり単方向にすると、この問題を解消できる。

レイヤードアーキテクチャ

クリーンアーキテクチャ

すべての依存が中心に向かっているこの状態が理想です。

APIリクエスト

ユーザからのリクエストは Handler で受け取られ、 UseCase を使って処理が行われます。 さらに、UseCase は Domain を使って処理を行います。

APIリクエスト→Handler→Usecase→Domain Domainの中心に向かって依存が発生している。

レイヤードアーキテクチャ

modelでやること

モデルという形で定義します。

repository層

interfaceを定義

Infra層

技術的関心事を扱う層

UseCase層

ユースケースを満たす処理の流れを扱う

Handler層

HTTPリクエストを受け取り、UseCaseを使って処理を行い、結果を返す層

参考記事

プログラムの依存関係とモジュール構成のこと
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
Goのinterfaceがわからない人へ
今すぐ「レイヤードアーキテクチャ+DDD」を理解しよう。(golang)
【Golang + レイヤードアーキテクチャ】DDD を意識して Web API を実装してみる

12/18

paiza

参考記事

Cで完全数を判定する golangを基礎から学ぶ 制御構造編

12/17

paiza

標準入力を受け取る時に大事なこと

var sc = bufio.NewScanner(os.Stdin)

func inputText() string  {
	sc.Scan()
	return sc.Text()
}

数値変換(String to int)

 var i int
  i, _ = strconv.Atoi("255")
  fmt.Println(i)  // => 255

Golangでの文字列・数値変換

12/16

paiza

VSCodeでのGoの設定

go mod init [フォルダ名]

Golang 1.11でGO111MODULE=onの状態でグローバルにgo getできない時の対処法

よく出くわすGoのエラーたち

エラーで学ぶGolang Go 言語(Golang) はまりどころと解決策 Go言語で「なかった」の返し方

12/ 15

paiza

標準入力

Go 言語で標準入力から読み込む競技プログラミングのアレ --- 改訂第二版
Goで標準入力から文字列や数値列を取得する

12/ 14

type Vertex struct {
	X int
	Y int
	S string
}

【golang】構造体の基本

基礎コマンド

コンパイル go build main.go

実行 go run main.go

パッケージ管理

buildgo.modが編集されるgo.sumが作成される

go1.11のmodulesの使い方について

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment