プログラミング言語 Go は Google が 2009 年秋にオープンソースで公開した新しいプログラミング言語です。C や C++ のようなコンパイル言語の良さをもちつつ、Python のような動的言語でのプログラムの書き易さを兼ねそなえた特徴をもっています。クラスを使わないオブジェクト指向の言語で、コンカレントに実行するための仕組みもそなえています。 プログラミングをより速く、より生産的に、そしてより楽しくしてくれる新しいプログラミング言語 Go について説明します。
PHPerがgolangでもがいてる話
-- Gopherくん
The Go gopher was designed by Renee French.
The gopher stickers was made by Takuya Ueda.
Licensed under the Creative Commons 3.0 Attributions license.
PHPerがgolangでもがいてる話
-- Gopherくん
The Go gopher was designed by Renee French.
The gopher stickers was made by Takuya Ueda.
Licensed under the Creative Commons 3.0 Attributions license.
Introduction to Vim plugins developed by non-Japanese Vimmer (Japanese version)deris0126
?
This is vimconf 2015 slide. that title is "Introduction to Vim plugins developed by non-Japanese Vimmer" (Japanese version)
English version is here(http://www.slideshare.net/deris0126/vimconf2015-en)
The document discusses static analysis in Go. It describes how the Go programming language and standard library packages like go/scanner, go/token, go/parser, and go/types enable easy static analysis of Go code. These packages allow tokenizing, parsing, building abstract syntax trees, and type checking Go source code. Examples of static analysis tools for Go are provided, including tools for formatting, linting, and refactoring code. Static analysis is also discussed in the context of building products like documentation generators and configuration evaluation tools.
16. 基本的な文法 その4
package main
import "fmt"
func fact(n int) int {
m := 1
for i := 2; i <= n; i++ { ← forの()はいらない
m *= i
}
return m
}
func main() {
fmt.Println(fact(5))
}
17. 基本的な文法 その5
package main
import "fmt"
func main() {
strs := [5]string{"A", "B", "C", "D", "E"}
slice := strs[1:3] ↑
// 0 B 配列
// 1 C ポインタではなく値でやり取り
for i, s := range slice {
(重要)
fmt.Println(i, s)
}
}
18. 基本的な文法 その5
package main strs : "A" "B" "C" "D" "E"
import "fmt"
func main() {
slice
strs := [5]string{"A", "B", "C", "D", "E"}
slice := strs[1:3] ←スライス
// 0 B 配列を切り取ったもの
// 1 C 値ではなく参照
for i, s := range slice {
※ 通常は配列は使わない
fmt.Println(i, s) slice := []{1, 2, 3}
}
}
19. 基本的な文法 その5
package main
import "fmt"
func main() {
strs := [5]string{"A", "B", "C", "D", "E"}
slice := strs[1:3]
// 0 B
// 1 C
for i, s := range slice { ← rangeでfor each
fmt.Println(i, s)
}
}
20. 基本的な文法 その6
package main
import "fmt"
type Student struct { ← typeで型を宣言
no string type 名前 実体
name string
}
func main() {
s := &Student{"041701", "Takuya Ueda"}
fmt.Println(s)
}
21. 基本的な文法 その6
package main
import "fmt"
type Student struct {
no string
name string
}
func main() {
s := &Student{"041701", "Takuya Ueda"}
fmt.Println(s) ↑
} 構造体の初期化
&でポインタ
22. 基本的な文法 その7
package main
import "fmt"
type Hex int ← 組込み型のエイリアス
func (h Hex) String() {
return fmt.Sprintf("%x")
}
func main() {
fmt.Println(Hex(100))
}
23. 基本的な文法 その7
package main
import "fmt"
type Hex int
func (h Hex) String() string { ← メソッド
指定した型の値を
return fmt.Sprintf("0x%x", int(h))
} レシーバとして
メソッドを作る
func main() {
fmt.Println(Hex(100))
}
24. 基本的な文法 その7
package main
import "fmt"
type Hex int
func (h Hex) String() string {
return fmt.Sprintf("0x%x", int(h))
} ↑
func main() { 型(値)でキャスト
fmt.Println(Hex(100))
}
25. 基本的な文法 その7 fmtパッケージにて宣言
package main type interface Stringer {
import "fmt" String() string
type Hex int }
func (h Hex) String() string { 実装
return fmt.Sprintf("0x%x", int(h))
}
func main() {
fmt.Println(Hex(100))
}
↑ fmt.Stringerとして振る舞う
(ダックタイピング)
0x64と出力される
33. Concurrency is not Parallelism
● ConcurrencyとParallelismは違う by Rob Pike
○ Concurrency=並行?
○ Parallelism=並列?
■ たぶん
● Concurrency
○ 同時にいくつかの事を扱う事
● Parallelism
○ 同時にいくつかの計算を行なう事
34. Concurrency is... by Rob Pike
Rob Pike氏のプレゼンのまとめでは、
○ Concurrency is powerful.
○ Concurrency is not parallelism.
○ Concurrency enables parallelism.
○ Concurrency makes parallelism (and scaling
and everything else) easy.
とある。
40. これは大丈夫?
// これはダメ!! // 続き
package main for i := 1; i <= 10; i++ {
import "fmt" fmt.Println(n, "+", i)
import "time" n += 1
func main() { time.Sleep(500)
n := 1 }
go func() { }
for i := 2; i <= 5; i++ {
fmt.Println(n, "*", i)
n *= i
} だめ!!
}()
// 続く