サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
災害への備え
cuto.unirita.co.jp
遅延実行とは Go言語では、deferキーワードを用いることで特定の処理を関数の一番最後に実行することができます。 package main import "fmt" func main() { defer fmt.Println("A") fmt.Println("B") } 上記のコード例では以下の出力が得られます。 B A また、deferを複数書くことができます。その場合、最初にdeferされた行が一番最後に実行されます。 package main import "fmt" func main() { defer fmt.Println("A") defer fmt.Println("B") defer fmt.Println("C") fmt.Println("D") } 上記のコード例では以下の出力が得られます。 D C B A 遅延実行の使いどころ 以下のコード例を見てくださ
go installコマンド GOPATH以下で開発を行う場合、go installコマンドを用いると実行ファイルを簡単に生成することができます。 go installコマンドは以下の様に発行します。 go install mainパッケージが格納されたディレクトリのパス コマンド発行例 例えば、以下の様なディレクトリ構成だったとします。 src/ ┗testpkg ┗main このとき、testpkgディレクトリ直下にmainパッケージが配置されている場合は、以下のコマンドで実行ファイルの生成ができます。 go install testpkg 同様に、testpkg/mainディレクトリ直下にmainパッケージが配置されている場合は、以下のコマンドで実行ファイルの生成ができます。 go install testpkg/main 実行ファイルの配置場所 go installコマンドによって
stringsパッケージ stringsパッケージは文字列操作を行う関数を提供します。 文字列が他の文字列を含むか調べる 文字列が、別の文字列を含んでいるか調べるにはContains関数を使用します。 package main import "fmt" import "strings" func main() { fmt.Println(strings.Contains("abcdefg", "cde")) fmt.Println(strings.Contains("abcdefg", "hij")) } true false より特殊なケースとして、文字列が別の文字列で開始しているかを調べるにはHasPrefix関数を、 文字列が別の文字列で終端しているかを調べるにはHasSuffix関数を使用します。 package main import "fmt" import "strings"
timeパッケージ Go言語で日時を扱うには、timeパッケージを使用します。 現在日時の取得 現在の日時を取得するには、Now関数を使用します。 package main import ( "fmt" "time" ) func main() { fmt.Println(time.Now()) } 2015-11-13 14:01:02.8911399 +0900 JST Now関数を呼び出すと、Time構造体を返します。 この構造体はナノ秒単位の日時を表す構造体になっています。 指定日時の取得 特定の日時を表すTime構造体を取得するには、Date関数を使用します。 package main import "fmt" import "time" func main() { t := time.Date(2015, 9, 13, 12, 35, 42, 123456789, time.L
マップとは Goの「マップ」とは、「キー」と「値」を組み合わせたデータ構造です。他の言語をかじったことのある人ならば、「連想配列」や「HashMap」という名称を聞いたことがあるのではないでしょうか。 値をマップに格納する場合、マップ内でユニークな値(キー)と、格納する値を関連づけます。また、マップから値を取得する倍は、キーを指定して値を取り出します。 マップの書式 宣言時の書式は、次の通りです。 map [キーの型] 値の型 マップのゼロ値は、nilになります。 マップの長さを取得 マップに格納されているキーと値の組み合わせの数は、配列と同様に「長さ」として取得します。 len(マップ型の変数) マップの作成方法 マップは、スライスと同じく「参照型」でのみ値を持つため、大容量なデータを格納したマップをコピーしても、メモリを圧迫することはありません。 Go言語では、マップに限らず「参照型」
コマンドパラメータの処理方法 Goでコマンドパラメータを扱うには、osパッケージを利用する方法と、flagパッケージを利用する方法があります。 osパッケージを利用する方法 osパッケージのos.Argsを扱う方法です。 os.Argsはstring型のスライスで定義されており、コマンドパラメータが代入されます。 package main import ( "fmt" "os" ) func main() { fmt.Println(os.Args) if len(os.Args) != 4 { fmt.Println("指定された引数の数が間違っています。") os.Exit(1) } fmt.Printf("実行ファイル名: %s\n", os.Args[0]) fmt.Printf("引数1: %s\n", os.Args[1]) fmt.Printf("引数2: %s\n", os
ゴルーチン間の連携方法 「ゴルーチン」(main含む)間で連携するには、「チャネル」と呼ばれる機能を利用します。「チャネル」を利用することで、「ゴルーチン」間で「通信」「同期処理」が可能になります。 チャネルの作成方法 「チャネル」を使用するには、「チャネル型」の変数を作成し、送信側・受信側ともに、その変数に対して何らかのデータを送受信します。他の型変数と違うのは、送信・受信ができることだけです。送受信は他のプログラミング言語とは一風変わった書式で行います。 // 宣言方法 chan 型 // 送受信可能なチャネル chan <- 型 // 送信専用チャネル <- 型 // 受信専用チャネル // 作成方法 make(chan 型, キャパシティ) make(chan 型)// キャパシティ0と同じ 送信専用・受信専用は、主に関数の引数として受け取る際に使用します。 また、「チャネル」はス
Go言語におけるポリモーフィズム Go言語は厳密にはオブジェクト指向プログラミング言語ではありませんが、 インタフェースを用いることでポリモーフィズムを実現することができます。 例えば以下のコードを見てください。 package main import "fmt" type Dog struct {} func (d *Dog) Cry() { fmt.Println("わんわん") } type Cat struct {} func (c *Cat) Cry() { fmt.Println("にゃーにゃー"); } func MakeDogCry(d *Dog) { fmt.Println("鳴け!"); d.Cry(); } func MakeCatCry(c *Cat) { fmt.Println("鳴け!"); c.Cry(); } func main() { dog := new
encoding/xmlパッケージ GoでXML形式を扱うには、encoding/xmlパッケージを使用します。 パース処理 XML形式の文字列をパースするには、あらかじめXMLのデータ構造に合わせて構造体を定義し、Unmarshal関数を使用します。 package main import ( "encoding/xml" "fmt" ) type Group struct { Name string `xml:"name"` Companies []Company `xml:"company"` } type Company struct { Name string `xml:"name"` Website Website `xml:"website"` } type Website struct { Name string `xml:",chardata"` URL string `
go getコマンドについて 外部ライブラリを導入するには、go getコマンドを利用すると便利です。 go get パッケージ名 go getコマンドを発行すると、以下の処理が自動的に行われます。 指定したパッケージのGitリモートリポジトリを$GOPATH/srcへダウンロード 依存パッケージのGitリモートリポジトリを$GOPATH/srcへダウンロード ソースコードのビルド(go installコマンド相当) 例えば、以下のコマンドを発行するとします。 go get github.com/unirita/cuto/master すると、以下のリポジトリが自動的にダウンロードされ、$GOPATH/src以下に配置されます。 (指定パッケージのリポジトリ) https://github.com/unirita/cuto (以下、依存パッケージのリポジトリ) https://github
なお、上記はすべて後ろに=を付けることで計算と代入を同時に行うことができます。 var a = 3 a += 2 fmt.Println(a) // 5 a <<= 3 fmt.Println(a) // 40 単項演算子 演算子 説明 使用例
ユニットテストの書き方 *_test.goの作成 Go言語は、ソースコードのファイル名で製品コードとテストコードを見分けます。 テストコードには、_test.goで終わるファイル名を使用します。 例 main_test.go data_import_test.go testingパッケージのインポート テストコードの冒頭では、testingパッケージをインポートします。 import "testing" testingパッケージには、テスト実行に役立つ以下の構造体が含まれています。 testing.T構造体 テストを失敗させたり、テストメッセージの出力をするために使用します testing.M構造体 テスト実行のメインルーチンを明示的に作成する際に使用します。(本項では触れません) testing.B構造体 ベンチマークテストをする際に使用します。(本項では触れません) テストメソッドの作
osパッケージ Goでファイルへの入出力を行うには、osパッケージを利用するのが基本です。 ファイルからの入力 ファイルからの入力を行うには、Open関数でファイルをオープンしてからRead関数でbyte配列へ読み込みを行います。 以下のコードはファイルの内容を標準出力するプログラムの一例です。 package main import ( "fmt" "os" ) const BUFSIZE = 1024 // 読み込みバッファのサイズ func main() { file, err := os.Open(`/path/to/file`) if err != nil { // Openエラー処理 } defer file.Close() buf := make([]byte, BUFSIZE) for { n, err := file.Read(buf) if n == 0 { break
Go言語のポインタ C言語でおなじみのポインタですが、Go言語にもポインタがあります。 宣言する方法もC言語と同じで、たとえばint型変数のポインタは、「*int」と記述します。変数のアドレスを取得するときも、C言語と同様に「&」をつけ、アドレスから変数の中身へアクセスする時は「*」を使います。 ポインタの使用例は次の通り。 package main import ( "fmt" ) func main() { // int型のポインタ変数 var pointer *int // int型変数 var n int = 100 // &(アドレス演算子)を使って、nのアドレスを代入 pointer = &n fmt.Println("nのアドレス:", &n) fmt.Println("pointerの値:", pointer) fmt.Println("nの値:", n) // *(間接参
パッケージについて Go言語では、名前空間を分けるための仕組みとしてパッケージを使用します。 パッケージの宣言 package somepkg var SomeVar int var someVar2 int func SomeFunc() { SomeVar = 10 someVar2 = 5 } func someFunc2() { SomeFunc() } 上記のコードでは、1行目でパッケージ名somepkgを宣言しています。 これにより、変数SomeVar・someVar2や関数SomeFunc・someFunc2はsomepkgパッケージのメンバとなります。 同パッケージ内のメンバは、無制限に参照することができます。 他パッケージメンバの参照 package otherpkg func OtherFunc() { SomeFunc() // エラー SomeVar = 5 //
encoding/jsonパッケージ GoでJSON形式を扱うには、encoding/jsonパッケージを使用します。 パース処理 JSON形式の文字列をパースするには、あらかじめJSONのデータ構造に合わせて構造体を定義し、Unmarshal関数を使用します。 package main import ( "encoding/json" "fmt" ) type Country struct { Name string `json:"name"` Prefectures []Prefecture `json:"prefectures"` } type Prefecture struct { Name string `json:"name"` Capital string `json:"capital"` Population int `json:"population"` } func m
Go言語からWindowsAPIを呼ぶ Go言語には、標準で多くのシステムコールが持つ機能が実装されていますが、それでも足りない場合があります。特にWindowsは、LinuxやMacOSXに比べて、不足していると感じる場合があります。 このような場合、直接自分でライブラリを読み込んで、システムコールを呼ぶ機能がGo言語には備わっています。 これはGoの標準パッケージでも行っている方法なので、syscallパッケージ内のソースコードを見るのが一番ですが、ここで簡単に説明します。 WindowsAPIを呼ぶ Goの標準パッケージ「syscall/zsyscall_windows.go」では、かなりの数のWindowsAPIがあらかじめ読み込まれています。ここにあるものは、syscallパッケージから簡単に呼ぶことができます。 ここで定義されていないWindowsAPIを使いたい場合の方法を説
目次 序章 まずは触ってみよう インストール ビルド・実行する IDEの紹介 第一章 Go言語の基本 基本的な文法 キーワード 基本的な型 型の宣言と変換 変数・定数・リテラル 演算子 条件分岐 繰り返し ポインタ ゼロ値 ラベル 第二章 中級者向け パッケージ GOPATHについて go installコマンド 構造体 関数・メソッド 遅延実行 インタフェース 配列 スライス(前編) スライス(後編) マップ init関数による初期化処理 第三章 エラーハンドリング 戻り値によるハンドリング パニック リカバリ 第四章 並列処理 ゴルーチン ゴルーチン間の通信 select文 syncパッケージを利用した同期処理 第五章 テスティング 基本的なユニットテスト カバレッジ測定 テクニック集 第六章 通信 ソケット通信 HTTP通信 第七章 便利な標準ライブラリ ファイル入出力 日時に関する
極めてシンプルな構成GoCutoはGo言語で開発されており、その構成は非常にシンプルです。たった二つの実行ファイルで動作します。
GoCutoGoCuto is a very simple solution to execute multi-server jobs in the order you like.
このページを最初にブックマークしてみませんか?
『cuto.unirita.co.jp』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く