// intの引数x, yを取ってintの結果を返す
funcadd(x int, y int) int {
return x + y
}
//複数の値を返すことができる → Cの参照渡しのようなことが不要
func swap(x, y string) (string, string) { //x,yが同じ型→省略可
return y, x
}
//関数をデータとして持つことができる
fn := function(a, b int) int {
return a * b
}
//クロージャも使える
func adder() func(int) int {
sum := 0
return func(x int) int {
sum += x
return sum
}
}
関数
13年9月17日火曜日
6.
//型は最後。x,y,zはint型
var x, y,z int
//初期化子(initializer)指定時は型指定不要
var c, python, java = true, 3, "no"
// 関数内では:=を使うことでvar指定が不要
c, python, java := true, 3, "no"
変数
13年9月17日火曜日
package main
import (
"fmt"
"math"
)
funcsqrt(x float64) string {
if x < 0 {
return sqrt(-x) + "i"
}
return fmt.Sprint(math.Sqrt(x))
}
func main() {
fmt.Println(sqrt(2), sqrt(-4))
}
if文
if a := 3; a < 5 { // if文内にif文スコープ内で有効な変数を宣言
}
fmt.Println(a) //スコープ外のためエラー
13年9月17日火曜日
12.
switch i {
case0: fmt.Println("Zero")
case 1: fmt.Println("One")
case 2: fmt.Println("Two")
case 3: fmt.Println("Three")
case i>3: fmt.Println("More") // 評価式も書ける
default: fmt.Println("Unknown")
}
switch文
13年9月17日火曜日
13.
package main
import "fmt"
typeVertex struct { //publicな型Vertex
X int //publicなフィールド変数X, Y
Y int
}
func main() {
v := Vertex{1, 2} //v.X = 1; v.Y = 2で初期化
v.X = 4 //フィールドへのアクセスは.を使う
fmt.Println(v.X)
}
struct
13年9月17日火曜日
14.
type Vertex struct{
X int
Y int
}
func main() {
p := Vertex{1, 2}
q := &p //pへのポインタを渡す
q.X = 1e9 //qはpへのポインタなので、p.Xが書き換わる
fmt.Println(p)
}
pointer
var (
p = Vertex{1, 2} // has type Vertex
q = &Vertex{1, 2} // has type *Vertex
r = Vertex{X: 1} // Y:0 is implicit
s = Vertex{} // X:0 and Y:0
)
var q *Vertex = new(Vertex) //ポインタ変数を作成
13年9月17日火曜日
15.
// sliceは、値の配列を参照
// 長さ(length )も含む
// 配列もあるがsliceで代替できるため割愛
func main() {
p := []int{2, 3, 5, 7, 11, 13} //intのslice
fmt.Println("p ==", p)
for i := 0; i < len(p); i++ {
fmt.Printf("p[%d] == %dn", i, p[i])
}
}
slice
13年9月17日火曜日
16.
slicing → p[0:3]など
容量指定
a:= make([]int, 5) //len(a) = 5, cap(a) = 5
a := make([]int, 0, 5) //len(a) = 0, cap(a) = 5
sliceの各要素の処理
for i, v := range p { //iはインデックス、vは値
}
不要な変数 → _ を使う
for _, v := range p {
}
append
b := append(a, 8) //aと同じ型で、要素に8を追加したslice
を返す
sliceに対する操作
13年9月17日火曜日
17.
// map はキーと値とを関連付ける
//mapの初期化にはmakeを使う
type Vertex struct {
Lat, Long float64
}
var m map[string]Vertex
func main() {
//キーがstring, 値がVertexのmapを作成
m = make(map[string]Vertex)
m["Bell Labs"] = Vertex{
40.68433, -74.39967,
}
fmt.Println(m["Bell Labs"])
}
map
13年9月17日火曜日
18.
m := make(map[string]int)
m["Answer"]= 42
fmt.Println("The value:", m["Answer"]) // 42が出力
m["Answer"] = 48
fmt.Println("The value:", m["Answer"]) // 48が出力
delete(m, "Answer")
fmt.Println("The value:", m["Answer"]) // 0(intの初期値)
v, ok := m["Answer"] //キーの有無チェックをok(bool)で判定
fmt.Println("The value:", v, "Present?", ok)
for k, v := range m { //キーと値のペアでループを回す
fmt.Println(“Key:”, k, “, Value:”, v)
}
mapに対する操作
13年9月17日火曜日
19.
type Vertex struct{
X, Y float64
}
// Vertex型のポインタ型にAbsメソッドを定義
func (v *Vertex) Abs() float64 {
//mathのインポートが必要
return math.Sqrt(v.X*v.X + v.Y*v.Y)
}
func main() {
v := &Vertex{3, 4}
fmt.Println(v.Abs()) //struct変数.メソッド名 でメソッド呼び出し
}
// 同一パッケージ上の型(基本型以外)にメソッドを定義できる
// ポインタ型にすることで、各メソッド呼び出し時の値コピーを防ぐ
// また、ポインタ型だとstructの値更新ができる
Methods
13年9月17日火曜日