package main

//package是必须写的, package内大写字母开头的函数是直接可以被外部引用的
//
import (
    "fmt"  //格式化库
    "time" //时间库
)

var c chan string
var ci chan string
var t int64

func main() {

    //array, slice
    a1 := []int{1, 2, 3, 4, 5, 6} //    c语言: int[] a1 = {1,2,3,4,5};
    fmt.Println(a1)               //[1 2 3 4 5 6]

    a2 := make([]int, len(a1)) //make是动态分配
    fmt.Println(a2)            //[0 0 0 0 0 0]

    //var a3 [len(a1)]int //array 方式声明不能使用表达式 len(a1)
    const size = 5
    var a3 [size]int //只能为常量
    fmt.Println(a3)  //[0 0 0 0 0]

    a4 := a1[2:4]   //从序号2到4的值创建
    fmt.Println(a4) //[3 4 5]

    a5 := a4[:4]    //后四个
    fmt.Println(a5) //[3 4 5 6]

    a1[4] = 100
    fmt.Println(a5) //[3 4 100 6] a2-a5依然指向a1, 所以,这里a5[4]为100

    //类似C 语言的指针,可以使用new 分配空间并赋值, 或者指向另外一个同类型的值
    i := 9
    var p *int   //声明
    p = new(int) //分配
    *p = 11
    fmt.Println(*p)

    fmt.Println(p)
    p = &i //指向i
    fmt.Println(*p)
    *p = 10
    fmt.Println(*p)

    //map
    monthdays := map[string]int{
        "Jan": 31, "Feb": 28, "Mar": 31,
        "Apr": 30, "May": 31, "Jun": 30,
        "Jul": 31, "Aug": 31, "Sep": 30,
        "Oct": 31, "Nov": 30, "Dec": 31,
    }
    monthdays["Feb"] = 29
    for k, v := range monthdays {
        fmt.Println(k, v)
    }

    var p2 *[]int = new([]int)
    *p2 = make([]int, 3)

    //自定义类型
    h := Hero("seven", 100)
    fmt.Println(h.name)
    fmt.Println(*h)

    //函数数组
    var xs = map[int]func() int{
        1: func() int { return 10 },
        2: func() int { return 20 },
        3: func() int { return 30 },
    }

    var arr [10]int
    arr[1] = 22

    for k, v := range xs {
        fmt.Println(k)
        fmt.Println(v())
    }

    //异步
    t = time.Now().UnixNano()
    fmt.Println(t)
    c = make(chan string)
    ci = make(chan string)
    var sql_result string
    var read_file_result string
    go ready_read_file("read file", 5)
    go ready_sql("sql", 2)
    fmt.Println("I'm waiting, but not too long")

    read_file_result = <-ci
    sql_result = <-c

    fmt.Println("sql_result:" + sql_result)
    fmt.Println("read_file_result:" + read_file_result)

    t = time.Now().UnixNano()
    fmt.Println(t)
}

type hero struct {
    name string
    hp   int
}

func Hero(name string, hp int) *hero {
    h := new(hero)
    if name != "" && hp > 0 {
        *h = hero{name, hp}
        return h
    }
    return h
}

func ready_sql(w string, sec int) string {
    time.Sleep(time.Duration(sec) * time.Second)
    t = time.Now().UnixNano()
    fmt.Println(t)
    fmt.Println(w, "{SQL}}!")
    c <- w
    return w
}
func ready_read_file(w string, sec int) string {
    time.Sleep(time.Duration(sec) * time.Second)
    t = time.Now().UnixNano()
    fmt.Println(t)
    fmt.Println(w, "{FILE}}!")
    ci <- w
    return w
}

 

posted on 2013-09-11 14:26  时光の沙  阅读(147)  评论(0)    收藏  举报