go基础知识

一些基本的 golang 特性

package main

import (
    "fmt"
    "math"
)

/*
    结构体
*/
type person struct {
    name string
    age  int
}

/*
    方法
*/
type rect struct {
    width, height int
}

func (r *rect) area() int {
    return r.width * r.height
}

func (r rect) perim() int {
    return 2*r.width + 2*r.height
}

/*
    Interface
*/
type geometry interface {
    area() float64
    perim() float64
}

type square struct {
    sideLen float64
}

type circle struct {
    radius float64
}

func (s square) area() float64 {
    return s.sideLen*s.sideLen
}

func (s square) perim() float64 {
    return 4*s.sideLen
}

func (c circle) area() float64 {
    return math.Pi * c.radius * c.radius
}

func (c circle) perim() float64 {
    return 2 * math.Pi * c.radius
}

func measure(g geometry)  {
    fmt.Println(g)
    fmt.Println(g.area())
    fmt.Println(g.perim())
}

func main()  {
    /*
        类型判断
    */
    whatAmI := func(i interface{}) {
        switch t := i.(type) {
        case bool:
            fmt.Println("I'm a bool")
        case int:
            fmt.Println("I'm an int")
        default:
            fmt.Printf("Don't know type %Tn", t)
        }
    }
    whatAmI(true)
    whatAmI(1)
    whatAmI("hey")

    /*
        函数变长参数
    */
    sum(1, 2)
    sum(1, 2, 3)

    nums := []int{1, 2, 3, 4}
    sum(nums...)


    /*
        闭包
    */
    nextInt := intSeq()
    fmt.Println(nextInt())
    fmt.Println(nextInt())
    fmt.Println(nextInt())

    newInts := intSeq()
    fmt.Println(newInts())

    /*
        指针
    */
    i := 1
    fmt.Println("initial:", i)


    zeroval(i)
    fmt.Println("zeroval:", i)

    zeroptr(&i)
    fmt.Println("zeroptr:", i)

    fmt.Println("pointer:", &i)

    /*
        结构体
    */
    s := person{name: "Sean", age: 50}
    fmt.Println(s.name)

    sp := &s
    fmt.Println(sp.age)

    /*
        方法
    */
    r := rect{width: 10, height: 5}
    fmt.Println("area: ", r.area())
    fmt.Println("perim:", r.perim())

    rp := &r
    fmt.Println("area: ", rp.area())
    fmt.Println("perim:", rp.perim())

    /*
        Interface
    */
    sq := square{sideLen:3}
    c := circle{radius:5}

    measure(sq)
    measure(c)

}

/*
    函数变长参数
*/
func sum(nums ...int) {
    fmt.Print(nums, " ")
    total := 0
    for _, num := range nums {
        total += num
    }
    fmt.Println(total)
}

/*
    闭包
*/
func intSeq() func() int {
    i := 0
    return func() int {
        i++
        return i
    }
}

/*
    指针
*/
func zeroval(ival int) {
    ival = 0
}

func zeroptr(iptr *int) {
    *iptr = 0
}

// https://blog.golang.org/go-slices-usage-and-internals
// http://jordanorelli.tumblr.com/post/32665860244/how-to-use-interfaces-in-go

参考资料: https://gobyexample.com/