💡
Go基本構文の備忘録
概要
普段はPythonを使ってAPI開発等を行っています。
プライベートでGoを触ってみているのですが、「mapってどうやって書くんだっけ?」みたいなことが多発したので、備忘録としてざっくりまとめます。
(解説は行っておりません)
変数
var i int
var c, python, java bool
var (
ToBe bool = false
MaxInt uint64 = 1<<64 - 1
z complex128 = cmplx.Sqrt(-5 + 12i)
)
var c, python, java = true, false, "no!"
k := 3
定数
const Pi = 3.14
配列
var a [2]string
a[0] = "Hello"
a[1] = "World"
primes := [6]int{2, 3, 5, 7, 11, 13}
スライス
var s []int
make([]int, 5) // len(a)=5
make([]int, 0, 5) // len(b)=0, cap(b)=5
[]int{2, 3, 5, 7, 11, 13}
board := [][]string{
[]string{"_", "_", "_"},
[]string{"_", "_", "_"},
[]string{"_", "_", "_"},
}
board[0][0] = "X"
s := []int{2, 3, 5, 7, 11, 13}
s = s[1:4]
fmt.Println(s) // [3 5 7]
s = s[:2]
fmt.Println(s) // [3 5]
s = s[1:]
fmt.Println(s) // [5]
s = append(s, 2, 3, 4)
マップ
var m map[string]int
make(map[string]int)
var m = map[string]int{
"Bell Labs": 40,
"Google": 37,
}
m["Answer"] = 42
delete(m, "Answer")
v, ok := m["Answer"]
構造体
new(struct{})
type Vertex struct {
X int
Y int
}
v := Vertex{1, 2}
v.X = 4
fmt.Println(v.X) // 4
v1 = Vertex{1, 2} // {1 2}
v2 = Vertex{X: 1} // {1 0}
v3 = Vertex{} // {0 0}
p = &Vertex{1, 2} // &{1 2}
ポインタ
var p *int
new(int)
i := 42
p = &i
fmt.Println(*p) // 42
*p = 21
fmt.Println(i) // 21
関数
func add(x int, y int) int {
return x + y
}
func add(x, y int) int {
return x + y
}
func swap(x, y string) (string, string) {
return y, x
}
func split(sum int) (x, y int) {
x = sum * 4 / 9
y = sum - x
return
}
hypot := func(x, y float64) float64 {
return math.Sqrt(x*x + y*y)
}
メソッド
type Vertex struct {
X, Y float64
}
func (v *Vertex) Scale(f float64) {
v.X = v.X * f
v.Y = v.Y * f
}
func main() {
v := Vertex{3, 4}
v.Scale(10)
インタフェース
type I interface {
M()
}
type T struct {
S string
}
func (t *T) M() {
fmt.Println(t.S)
}
type F float64
func (f F) M() {
fmt.Println(f)
}
func describe(i I) {
fmt.Printf("(%v, %T)\n", i, i)
}
var i I
i = &T{"Hello"}
describe(i)
i.M()
i = F(math.Pi)
describe(i)
i.M()
ゴルーチン
go say("world")
ch := make(chan int)
ch := make(chan int, 2)
ch <- v
v := <-ch
close(c)
v, ok := <-ch
select {
case <-tick:
fmt.Println("tick.")
case <-boom:
fmt.Println("BOOM!")
return
default:
fmt.Println(" .")
time.Sleep(50 * time.Millisecond)
}
var mu sync.Mutex
mu.Lock()
defer c.mu.Unlock()
const++
func done(wd *sync.WaitGroup) {
wg.Done()
}
var wg sync.WaitGroup
wg.Add(3)
go done(&wg)
go done(&wg)
go done(&wg)
wg.Wait()
ループ
for i := 0; i < 10; i++ {
sum += i
}
sum := 1
for sum < 1000 {
sum += sum
}
for {
}
for i, v := range pow {
fmt.Printf("2**%d = %d\n", i, v)
}
条件分岐
if x < 0 {
return sqrt(-x) + "i"
}
if v := math.Pow(x, n); v < lim {
return v
}
switch os := runtime.GOOS; os {
case "darwin":
fmt.Println("OS X.")
case "linux":
fmt.Println("Linux.")
default:
fmt.Printf("%s.\n", os)
}
switch {
case t.Hour() < 12:
fmt.Println("Good morning!")
case t.Hour() < 17:
fmt.Println("Good afternoon.")
default:
fmt.Println("Good evening.")
}
Discussion