技術向上

プログラミングの学び、気になるテクノロジーやビジネストレンドを発信

2018-11-01から1ヶ月間の記事一覧

タイプアサーション、switch type【Go】

Go

タイプアサーション タイプアサーションとは、interfaceを型変換する機能です。 interfaceは中身に何も指定しないことで、「どのような型も受付ける」型を表現できます。 その受付けた型を、「<変数名>.(<型>)」の形でタイプアサーション(型変換)します。 …

interface、ダックタイピング【Go】

Go

interfaceを使うと、持つべきメソッドを指定した型(の様なもの)を宣言することができます。 type Human interface { Say() string // Human interfaceは、引数なしで、string型を返すメソッドSay()を持つ必要がある、と指定 } type Person struct { Name s…

embedded【Go】

Go

他の言語における継承にあたるものです。 他で定義したtypeを中に取り込んで、新たなtypeを定義することができます。 type Vertex struct { x, y int } type Vertex3D struct { Vertex // 継承 z int } func NewVertex3D(x, y, z int) *Vertex3D { return &V…

コンストラクタ【Go】

Go

Javaなど他言語に存在するコンストラクタは、Goには存在しません。 それでも、オブジェクト指向ライクを実現するための慣習があります。 コンストラクタは、初期化処理ですが、goの場合、typeに関する初期化処理は、 typeで定義したstructの中身の頭文字が、…

type、メソッド、レシーバー【Go】

Go

メソッド type定義した型に対する関数は、このように書くことができますが、 type Vertex struct { X, Y int } func Area(v Vertex) int { return v.X * v.Y } 次のように書くことで、オブジェクト指向ライクに表現できます。 type Vertex struct { X, Y int…

struct【Go】

Go

宣言 変数をまとめたもの、すなわち構造体を意味します。 type Vertex struct{ X, Y int } func main(){ v := Vertex{X:1, Y:2} // v := Vertex{1, 2} // このようにも書ける v.X = 100 fmt.Println(v) // {100 2} fmt.Println(v.X, v.Y) // 100 2 } struct…

new【Go】

Go

ポインタ型を宣言する際、同時にメモリ領域を確保する場合に使用します。 var p *int = new(int) fmt.Println(*p) // 0 p番地の実体を出力。メモリ領域を確保したため、初期値0が設定されている *p++ fmt.Println(*p) // 1 newを使わずに宣言した場合、メモ…

panicとrecover【Go】

Go

panic()を用いて強制終了させることができます。 panic("error!") また、recover()を用いて、実行したpanicを取り消すこともできます。 deferを使って、panicより先に宣言し、関数内の処理の最後に実行する必要があります。 defer func(){ str := recover() …

エラーハンドリング【Go】

Go

返されたエラーをifを使ってハンドリングします。 file, err := os.Open("hello.go") // 読み取り専用でファイルを開く if err != nil { log.Fatalln(err) // errが返されたらプログラム終了 } defer file.Close() data := make([]byte, 100) count, err := …

log【Go】

Go

ログの出力 実行時間とともに任意の内容を出力します。 log.Println("logging") // 2018/11/27 11:45:52 logging fmt.Println("print") // print log.Fatalln("error") // 2018/11/27 11:45:52 error fmt.Println("not executed") // (log.Fatalによりプロ…

defer【Go】

Go

deferは、処理の実行を遅らせます。 func greet() { fmt.Println("よろしくお願いします。") } func main() { defer greet() fmt.Println("マイケルです。") // マイケルです。\nよろしくお願いします。 } deferがつけられた処理は、その関数の全ての処理が…

switch【Go】

Go

if文と似ていますが、条件分岐が3つ以上ある場合には、 switchを利用すると見やすくなるかもしれません。 choice := "イタリアン" switch choice { case "和": fmt.Println("rice") case "洋": fmt.Println("bread") case "中": fmt.Println("noodle") defau…

range【Go】

Go

配列、スライス、mapからループ処理で要素を取り出す際に、便利な機能です。 nums := []int{100, 200, 300} for i, v := range nums { fmt.Println(i, v) } インデックスと値を順に取り出しています。 どちらかを破棄する場合にはアンダースコアを用いて破棄…

for文【Go】

Go

次の様に、continueを用いると以降の処理はスキップされ、 breakを用いると、処理が終了します。 for i := 0; i < 10; i++ { if i == 3 { fmt.Println("continue") continue // 以降の処理はスキップされ、iはインクリメントされる } if i > 8 { fmt.Println…

if文【Go】

Go

上から条件に当てはまるものを探します。 1度当てはまるものがあれば、その後は判定しません。 num := 9 if num%2 == 0 { fmt.Println("even") } else if num%3 == 0 { fmt.Println("by3") // by3 } else { fmt.Println("odd") } また、判定する対象を、if文…

可変長引数【Go】

Go

定義の際には引数の数を決めずに、 実行時に委ねる方法です。型の前に「...」を記述します。 func p(params ...int) { fmt.Println(params) } func main() { p(1, 2, 3) // [1 2 3] } 可変長引数は、関数の内部でスライスとして扱われます。 ですので、実行…

クロージャ【Go】

Go

クロージャとは、関数と関数内で参照する変数をまとめた機能のことです。 引数で指定されない変数を、内部に保持する事ができます。 Goでは、返り値に無名関数を使用して実現します。 func incrementGenerator() func() int { x := 0 // 内部で使用する変数…

関数【Go】

Go

返り値なし 引数も取らない場合は次のようになります。 func p() { fmt.Println("printed.") } 引数をとる場合は( )内に記載します。 func cal(x int, y int) { fmt.Println(x + y) } 連続した引数が同じ型である場合、型の表記をまとめる事ができます。 fun…

byte【Go】

Go

ASCIIコードはstring()で囲むと文字に変換されます。 a := []byte{68, 90} fmt.Println(a) // [68 90] fmt.Println(string(a)) // DZ 次のようにキャストすることもできます。 fmt.Println([]byte("DZ")) // [68 90] ネットワークやファイルの読み込みで主に…

map【Go】

Go

宣言と代入 宣言と同時に代入する方法は下記の通りになります。 a := map[string]int { "usa" : 1 "china": 2 } [ ]で指定するのが、keyの型、[ ]の後に指定するのがvalueの型です。 宣言 代入せずに、map変数を宣言するには、makeを使用します。 b := make(…

スライス【Go】

Go

スライス スライスは配列と異なり、宣言時のサイズを持ちません。 あくまで「配列の参照」です(配列はサイズも含めて型情報となります)。 a := []int{1, 3} b := a b[0] = 3 fmt.Println(a) // [3 3] fmt.Println(b) // [3 3] a、b共に同じ配列の実体を参…

配列【Go】

Go

宣言の後に代入する場合 var a [3]int a[0] = 2 a[1] = 5 宣言と同時に代入する場合 var b = [2]string{"me", "you"} 指定した配列内の要素数より代入した値が少なければ、 数値型の場合は0が、文字列型の場合には空文字が代入されます。 指定した要素数を上…

型変換【Go】

Go

数値 var x = 1 xx := float64(x) 数値から文字 var y = 2 yy := strconv.Itoa(y) 純正のライブラリstrconvをimportします。 そのライブラリのItoA (int to ASCII) 関数を使用します。 文字から数値 var z = "5" zz, _ := strconv.Atoi(z) Pythonなどは異な…

ApacheとNginx

Apache リクエストごとにプロセスを起動して処理するため、メモリの消費量がかさ張る メモリ空間が独立しているため、PHPなどのスクリプト言語を組み込みやすい CPUリソースを多く消費するような動的コンテンツの処理でも速い Nginx キューに溜まったリクエ…

ミドルウェア

ミドルウェアとは OSとアプリケーションの中間に入るソフトウェアのことです。 OSは基本機能を備えているものの、動的動的コンテンツやデータ処理など、 システムとして求められる機能は備えていないため、ミドルウェアが必要となります。 ミドルウェアの出…

数値と文字列【Go】

Go

数値 func main() { var ( u8 uint8 = 255 i8 int8 = 127 f32 float32 = 3.1 c64 complex64 = -5 + 12i ) fmt.Println(u8, i8, f32, c64) fmt.Printf("%T %v\n", u8, u8) fmt.Printf("%T %v\n", i8, i8) fmt.Printf("%T %v\n", c64, c64) ) %Tはtypeを、%vは…

RESTful API

API

RESTful APIとは 文字通りに言いますと、RESTフルなAPIとなります。 RESTとは、REpresentational State Transferの略で、Webアーキテクチャの考え方です。 リソース指向アーキテクチャ(Resource Oriented Architecture)の考え方に沿ったものになります。 特…

Web API

API

Web APIとは HTTPプロトコルを利用してネットワーク経由に呼び出すアプリケーションインターフェースを指します。 SNSをはじめとして、現在多くのWebサービスが公開しています。 自らのサービスのコア情報(SNSであれば、ユーザーが発信する情報など)を公開す…

定数【Go】

Go

宣言方法 const ( j = 3 ) 関数の外でも中でも宣言する事ができます。 注意点 constは定数ですので、宣言後の値変更はできません。 宣言時に数式によって値を代入していても、それが実行されるのは出力などで定数を使用した時になります。 const ( j = 3 + 1…

変数【Go】

Go

宣言の仕方 varを使う方法と:=を使う方法があります。 func foo() { xi := 2 xf64 := 1.8 xs := "test2" xt, sf := true, false fmt.Println(xi, xf64, xs, xt, sf) } :=で記述すると関数外で宣言する事ができません。 また、必ず値を代入する必要があります…