SlideShare uma empresa Scribd logo
1 de 51
Baixar para ler offline
JavaScript経験者のためのGo言語入門
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 -
浮動小数 float32, float64 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

Mais conteúdo relacionado

Mais procurados

セグメント?クラスタリング? ユーザーを分類し、サービスの改善に活かすポイント
セグメント?クラスタリング? ユーザーを分類し、サービスの改善に活かすポイントセグメント?クラスタリング? ユーザーを分類し、サービスの改善に活かすポイント
セグメント?クラスタリング? ユーザーを分類し、サービスの改善に活かすポイント
Naoto Tamiya
 
Autoware: ROSを用いた一般道自動運転向けソフトウェアプラットフォーム
Autoware: ROSを用いた一般道自動運転向けソフトウェアプラットフォームAutoware: ROSを用いた一般道自動運転向けソフトウェアプラットフォーム
Autoware: ROSを用いた一般道自動運転向けソフトウェアプラットフォーム
Takuya Azumi
 

Mais procurados (20)

いまさら聞けないarmを使ったNEONの基礎と活用事例
いまさら聞けないarmを使ったNEONの基礎と活用事例いまさら聞けないarmを使ったNEONの基礎と活用事例
いまさら聞けないarmを使ったNEONの基礎と活用事例
 
テスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるなテスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるな
 
優れた研究論文の書き方―7つの提案
優れた研究論文の書き方―7つの提案優れた研究論文の書き方―7つの提案
優れた研究論文の書き方―7つの提案
 
いまさら聞けない!CUDA高速化入門
いまさら聞けない!CUDA高速化入門いまさら聞けない!CUDA高速化入門
いまさら聞けない!CUDA高速化入門
 
今なら間に合う分散型IDとEntra Verified ID
今なら間に合う分散型IDとEntra Verified ID今なら間に合う分散型IDとEntra Verified ID
今なら間に合う分散型IDとEntra Verified ID
 
Rustに触れて私のPythonはどう変わったか
Rustに触れて私のPythonはどう変わったかRustに触れて私のPythonはどう変わったか
Rustに触れて私のPythonはどう変わったか
 
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture
 
概念モデリング再考
概念モデリング再考概念モデリング再考
概念モデリング再考
 
深層学習フレームワークにおけるIntel CPU/富岳向け最適化法
深層学習フレームワークにおけるIntel CPU/富岳向け最適化法深層学習フレームワークにおけるIntel CPU/富岳向け最適化法
深層学習フレームワークにおけるIntel CPU/富岳向け最適化法
 
Kotlinアンチパターン
KotlinアンチパターンKotlinアンチパターン
Kotlinアンチパターン
 
マッチングサービスにおけるKPIの話
マッチングサービスにおけるKPIの話マッチングサービスにおけるKPIの話
マッチングサービスにおけるKPIの話
 
tf,tf2完全理解
tf,tf2完全理解tf,tf2完全理解
tf,tf2完全理解
 
基礎線形代数講座
基礎線形代数講座基礎線形代数講座
基礎線形代数講座
 
セグメント?クラスタリング? ユーザーを分類し、サービスの改善に活かすポイント
セグメント?クラスタリング? ユーザーを分類し、サービスの改善に活かすポイントセグメント?クラスタリング? ユーザーを分類し、サービスの改善に活かすポイント
セグメント?クラスタリング? ユーザーを分類し、サービスの改善に活かすポイント
 
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS   更新系と参照系で異なるORMを併用して上手くいった話DDD x CQRS   更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
 
例外設計における大罪
例外設計における大罪例外設計における大罪
例外設計における大罪
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行
 
コンテナにおけるパフォーマンス調査でハマった話
コンテナにおけるパフォーマンス調査でハマった話コンテナにおけるパフォーマンス調査でハマった話
コンテナにおけるパフォーマンス調査でハマった話
 
Autoware: ROSを用いた一般道自動運転向けソフトウェアプラットフォーム
Autoware: ROSを用いた一般道自動運転向けソフトウェアプラットフォームAutoware: ROSを用いた一般道自動運転向けソフトウェアプラットフォーム
Autoware: ROSを用いた一般道自動運転向けソフトウェアプラットフォーム
 
イミュータブルデータモデルの極意
イミュータブルデータモデルの極意イミュータブルデータモデルの極意
イミュータブルデータモデルの極意
 

Semelhante a JavaScript経験者のためのGo言語入門

G*workshop sendai 20100424(v2)
G*workshop sendai 20100424(v2)G*workshop sendai 20100424(v2)
G*workshop sendai 20100424(v2)
Nobuhiro Sue
 
Buildinsider OFFLINE TypeScriptの基礎から実践・利用事例まで
Buildinsider OFFLINE TypeScriptの基礎から実践・利用事例までBuildinsider OFFLINE TypeScriptの基礎から実践・利用事例まで
Buildinsider OFFLINE TypeScriptの基礎から実践・利用事例まで
Masahiro Wakame
 
Boost.Flyweight
Boost.FlyweightBoost.Flyweight
Boost.Flyweight
gintenlabo
 
GNU awk (gawk) を用いた Apache ログ解析方法
GNU awk (gawk) を用いた Apache ログ解析方法GNU awk (gawk) を用いた Apache ログ解析方法
GNU awk (gawk) を用いた Apache ログ解析方法
博文 斉藤
 

Semelhante a JavaScript経験者のためのGo言語入門 (20)

Aizu lt tokyo_luxion
Aizu lt tokyo_luxionAizu lt tokyo_luxion
Aizu lt tokyo_luxion
 
G*workshop sendai 20100424(v2)
G*workshop sendai 20100424(v2)G*workshop sendai 20100424(v2)
G*workshop sendai 20100424(v2)
 
Buildinsider OFFLINE TypeScriptの基礎から実践・利用事例まで
Buildinsider OFFLINE TypeScriptの基礎から実践・利用事例までBuildinsider OFFLINE TypeScriptの基礎から実践・利用事例まで
Buildinsider OFFLINE TypeScriptの基礎から実践・利用事例まで
 
JDK 10 へようこそ
JDK 10 へようこそJDK 10 へようこそ
JDK 10 へようこそ
 
とあるFlashの自動生成
とあるFlashの自動生成とあるFlashの自動生成
とあるFlashの自動生成
 
Pfi Seminar 2010 1 7
Pfi Seminar 2010 1 7Pfi Seminar 2010 1 7
Pfi Seminar 2010 1 7
 
Flutterを体験してみませんか
Flutterを体験してみませんかFlutterを体験してみませんか
Flutterを体験してみませんか
 
Clojure programming-chapter-2
Clojure programming-chapter-2Clojure programming-chapter-2
Clojure programming-chapter-2
 
Groovy Shell Scripting 2015
Groovy Shell Scripting 2015Groovy Shell Scripting 2015
Groovy Shell Scripting 2015
 
Dsl&Builder
Dsl&BuilderDsl&Builder
Dsl&Builder
 
Boost.Flyweight
Boost.FlyweightBoost.Flyweight
Boost.Flyweight
 
Lisp Tutorial for Pythonista : Day 3
Lisp Tutorial for Pythonista : Day 3Lisp Tutorial for Pythonista : Day 3
Lisp Tutorial for Pythonista : Day 3
 
Ajax 応用
Ajax 応用Ajax 応用
Ajax 応用
 
Erlangやってみた
ErlangやってみたErlangやってみた
Erlangやってみた
 
Groovyで楽にSQLを実行してみよう
Groovyで楽にSQLを実行してみようGroovyで楽にSQLを実行してみよう
Groovyで楽にSQLを実行してみよう
 
Scala on Hadoop
Scala on HadoopScala on Hadoop
Scala on Hadoop
 
ggplot2をつかってみよう
ggplot2をつかってみようggplot2をつかってみよう
ggplot2をつかってみよう
 
GNU awk (gawk) を用いた Apache ログ解析方法
GNU awk (gawk) を用いた Apache ログ解析方法GNU awk (gawk) を用いた Apache ログ解析方法
GNU awk (gawk) を用いた Apache ログ解析方法
 
Vim の話
Vim の話Vim の話
Vim の話
 
今日からはじめるGPars
今日からはじめるGPars今日からはじめるGPars
今日からはじめるGPars
 

JavaScript経験者のためのGo言語入門