狠狠撸

狠狠撸Share a Scribd company logo
闯补惫补厂肠谤颈辫迟経験者のための骋辞言语入门
shoarai
_shoarai
アジェンダ
このスライドの目的
Goの特徴
Goの言語仕様
Goツール
まとめ
2
このスライドの目的
JavaScript経験者がGoを書くきっかけなること
3
アジェンダ
このスライドの目的
Goの特徴
Goの言語仕様
Goツール
まとめ
4
Goの特徴
言語仕様がシンプル
静的型付け
処理速度が速い
クロスコンパイルが可能
並行処理が可能
5
Goは言語仕様がシンプル
Go
ループはforのみ、whileがない
ifの{}が省略できない
forやifの()がいらない
三項演算子がない? ? ? ? ? ? など
JavaScript
ECMAScript6、それ以前、AltJSなど言語仕様が多種多様...
ループ1つとっても、for、forEach、for in、$.each、$.map ... orz
6
Goが提供していないもの
他の多くの言語で提供しているものが、Goにはない
暗黙の数値変換
コンストラクタ
デストラクタ
演算子オーバーロード
デフォルトのパラメータ値
継承
ジェネリクス
例外
マクロ
関数アノテーション
スレッドローカルな領域
7
Goは静的型付け
Go
静的型付けであり、コンパイル時に型をチェックする。
JavaScript
動的型付けであり、実行しないと型がチェックできない。
8
Goは処理速度が速い
Go
バイナリにコンパイルされるため、処理速度が速い。
JavaScript
インタプリタ言語なので、比較的遅い。
9
クロスコンパイルが可能
Go
OSとCPUアーキテクチャを指定して、クロスコンパイルできる。
JavaScript
Webブラウザがあれば動く。
10
並行処理が可能
Go
go func() と書くだけで、関数funcが別スレッドで動く。
JavaScript
Web Workersで可能。
11
つまりGoは...
学習?デバッグ?速度向上?環境対応にかかる時間を減らし、
何を創るか?に集中できる。
12
アジェンダ
このスライドの目的
Goの特徴
Goの言語仕様
Goツール
まとめ
13
Goの言語仕様1/3
以下の内容について説明します。
Setup
Hello World
パッケージと関数
変数宣言
if
ループ
switch
14
Setup
インストール
公式サイトからインストールできる。
あるいは、Homebrewからもインストールできる
$ brew install go
環境設定
$ export GOROOT=$HOME/go
$ export PATH=$PATH:$GOROOT/bin
15
Hello World
helloworld.go
// このファイルが属するパッケージ名
package main
// 利用するパッケージ名
import "fmt"
// mainパッケージのmain関数からプログラムが実行される
func main() {
fmt.Println("Hello, 世界")
}
実行
$ go run helloworld.go
> Hello, 世界
16
パッケージと関数
Go
package main
import "fmt"
func main() {
fmt.Println("Hello, 世界")
}
JavaScript
(function(main, win) {
main.main = function() {
win.alert("Hello, 世界");
};
}(main | main = {}, window));
17
変数宣言
Go
// どちらもsは、空文字
s := "" // 初期値から型が推測される
var s string // 型のゼロ値が設定される
// 以下のようにも書ける
var s = ""
var s string = ""
JavaScript
let s = ""; // ES6
var s = ""; // 関数ブロックスコープ
18
if
Go
x := 1
if x > 0 {
// ...
} else x < 0 {
// ...
}
JavaScript
var x = 1;
if (x > 0) {
// ...
} else (x < 0) {
// ...
}
19
ループ
Go
strs := {"あ", "い"}
for i := 0; i < len(strs); i++ {
// ...
}
JavaScript
var strs = ["あ", "い"];
for (var i = 0; i < strs.length; i++) {
// ...
}
20
ループ(range)
Go
strs := {"あ", "い"}
for i, s := range strs {
// ...
}
JavaScript
var strs = ["あ", "い"];
strs.forEach(function(s, i) {
// ...
});
21
ループ(条件のみ)
Go
for count < 10 {
// ...
}
// 無限ループ
for {
// ...
}
JavaScript
while (count < 10) {
// ...
}
// 無限ループ
while (true) {
// ...
} 22
switch
Go
x := 0
switch x {
case 0:
num = 1
// breakは不要
case 1:
num = 3
default:
num = -1
}
return num // 1
23
ここまでで
Goは基本的な構文が、少ない単語で書けます。
()や;は不要、ループはforのみ。
whileも、憎きdo whileもありません。
24
Goの言語仕様2/3
以下の内容について説明します。
データ型
コンポジット型
関数宣言
遅延関数呼び出し
エラー処理
パニック
25
データ型
Go JavaScript
整数 int, int8, int6 number
正の整数 uint, uint8, uint16, uint32, uint64 number
ポインタ uintptr -
浮動小数 ?oat32, ?oat64 number
複素数 complex64, complex128 -
ブーリアン bool bool
バイト byte -
文字 rune string
文字列 string string
エラー error - 26
コンポジット型(配列?マップ)
Go
a := [3]int{1, 2, 3} // 配列(長さが固定)
b:= []int{0, 1, 2, 3, 4, 5} // スライス(長さが可変)
c := map[string]int { // 文字列からintへのマップ
"a": 1,
"b": 2,
}
JavaScript
var a = [1, 2, 3]; // ※長さが固定はない
var b = [1, 2, 3, 4, 5];
var c = { // マップをオブジェクトで表現
"a": 1,
"b": 2
}; 27
コンポジット型(構造体)
Go
// 構造体型の宣言
type Employee struct {
ID int
Name string
}
// 構造体変数の宣言
alice := Employee{0, "alice"}
JavaScript
// 構造体をオブジェクトで表現
var alice = {
ID: 0,
Name: "alice"
};
28
関数宣言
Go
// 引数と戻り値それぞれの型を宣言する
func hypot(x, y float64) float64 {
return math.Sqrt(x*x, y*y)
}
fmt.Println(hypot(3, 4)) // "5"
JavaScript
function hypot(x, y) {
return math.Sqrt(x*x, y*y);
}
console.log(hypot(3, 4)); // "5"
29
関数宣言(可変個引数)
Go
func sum(vals ...int) int {
total := 0
for _, val := range vals {
total += val
}
return total
}
JavaScript
// 可変個引数はES6のみ
function sum(...vals) {
var total = 0
vals.forEach(function(val, i) {
total += val;
});
return total;
}
30
遅延関数呼び出し
正常な完了でも異常な完了でも、関数の最後に到達するまで関数
の呼び出しが遅延される。
Go
func lookup(key string) int {
mu.Lock()
// lookup関数が完了する直前に呼ばれる
defer mu.Unlock()
// ...
return m[key]
}
Javascript
なし
31
エラー処理
Go
Goでは、関数ごとにエラー処理を行う。
resp, err := html.parse(text)
if err != nil {
return err
}
JavaScript
tryで複数の関数のエラーをまとめて扱えるため、エラーと関数の
関連がわかりにくい。
try {
parseHtml(text);
parseJson(json);
} catch (err) {
throw err;
} 32
パニック
パニックとは、例えば境界外への配列アクセス、nilポインタによ
る参照など、実行時の誤りが検出された時に発生する。
Go
func Reset(x *Buffer) {
if x == null {
panic("x is nill")
}
x.element = x
}
JavaScript
なし
33
Go言語の仕様3/3
メソッド
インタフェース
並行処理
34
メソッド宣言
Go
type Point struct{ X, Y float64 }
func (p *Point) ScaleBy(factor float64) {
p.X *= factor
p.Y *= factor
}
JavaScript
function Point(x, y) {
this.X = x;
this.Y = y;
}
Point.prototype.ScaleBy= function(factor) {
this.X *= factor;
this.Y *= factor;
};
35
メソッド呼び出し
Go
p := Point{1, 2} // 初期化
p.ScaleBy(10) // X=10, Y=20
JavaScript
var p = new Point(1, 2);// 初期化
p.ScaleBy(10); // X=10, Y=20
36
インタフェース
Goでは、インタフェースが持つ関数と同じ名前?同じ型の関数が
あれば、暗黙的にそのインタフェースの振る舞い要件を満たす。
type Getter interface {
GetText() string
}
type Text struct {
text string
}
func (t Text) GetText() string {
return t.text
}
// Text型はGetter型の変数に代入できる
var getter Getter
getter = Text{"test"}
fmt.Println(getter.GetText()) // "test"
37
並行処理
Goには、並行処理の仕組みとしてゴルーチンとチャネルがあ
る。
38
並行処理(ゴルーチン)
Goでは、並行に実行される個々の動作をゴルーチン、
main関数を呼び出すゴルーチンをメインゴルーチンといいます。
HTTP Server
// メインゴルーチンがmain関数を呼び出す
func main() {
l, _ := net.Listen("tcp", "localhost:8000")
for {
// クライアントの接続要求を待つ
conn, _ := l.Accept()
// メインゴルーチンが新たなゴルーチンを生成する
go handleConn(conn)
}
}
func handleConn(c net.Conn) {
// 接続ごとの処理を行う...
}
39
並行処理(チャネル)
1つのゴルーチンが他のゴルーチンへ値を送ることができる通信の
仕組みをチャネルといいます。
func main() {
// int型のチャネルを作成する
ch := make(chan int)
// 生成されたゴルーチンはチャネルに値を送信し続ける
go func() {
for x := 0; ; x++ {
ch <- x
}
}()
// メインゴルーチンはチャネルの値を受信し、出力し続ける
for {
fmt.Printf(<-ch) // 0123456...
}
}
40
アジェンダ
このスライドの目的
Goの特徴
Goの言語仕様
Goツール
まとめ
41
Goの標準ツール
ドキュメンテーション
コンパイル
コードの整形
テスト
ベンチマーク? ? ? ? など
42
ドキュメンテーション
# 例:timeパッケージのドキュメントを表示する
$ go doc time
> package time // import "time"
>
> Package time provides functionality for measuring and display
>
> The calendrical calculations always assume a Gregorian calend
>
> const ANSIC = "Mon Jan _2 15:04:05 2006" ...
> const Nanosecond Duration = 1 ...
> ...
43
コンパイル
# 実行ファイルを生成する
$ go build helloworld.go
# 実行する
$ ./helloworld
> Hello, 世界
44
クロスコンパイル
# Linux、32ビット用の実行ファイルを生成する
$ GOOS=linux GOARCH=386 go build helloworld.go
# 実行する
$ ./helloworld
> Hello, 世界
45
コードの整形
package main
import "fmt"
func main () {
fmt.Println("Hello, 世界");
}
↓? ? ? ? ↓
$ go fmt main.go
↓? 整形? ↓
package main
import "fmt"
func main() {
fmt.Println("Hello, 世界")
}
46
テスト
package word
// テストに使用するパッケージ
import "testing"
// Test...から始める
func TestIsPalindrome(t *testing.T) {
// 回文チェックの関数
if !IsPalindrome("kayak") {
// エラー報告
t.Error(`IsPalindrome("kayak") = false`)
}
}
実行結果
$ go test
> PASS
> ok gopl.io/ch11/word2 2.430s
合計の処理時間:2.430 秒 47
ベンチマーク
func BenchmarkIsPalindrome(b *testing.B) {
for i := 0; i < b.N; i++ {
IsPalindrome("kayak")
}
}
実行結果
$ go test -bench=.
> BenchmarkIsPalindrome-4 3000000 605 ns/op
> PASS
> ok gopl.io/ch11/word2 2.430s
使用するコア数:4(設定可能)
実行回数:300,000(処理時間が安定する回数が推定される)
個々の処理時間:605 ナノ秒
合計の処理時間:2.430 秒
48
アジェンダ
このスライドの目的
Goの特徴
Goの言語仕様
Goツール
まとめ
49
まとめ
Goは、構文が非常にシンプルで学びやすいです。
環境構築も簡単なので、ぜひ一度動かしてみてください。
50
より詳しく
この本で、本スライドの内容がより精細に学べます。
Amazon
51

More Related Content

闯补惫补厂肠谤颈辫迟経験者のための骋辞言语入门