golang第三天

测试代码

  • hello.go
package main

import (
    "errors"
    "math"
    "fmt"
    "time"
    "io/ioutil"
)

/**
 * errors.New 可返回一个错误信息:
 */
func MySqrt(f float64) (float64, error) {
    if f < 0 {
        return 0, errors.New("f can not be negative number.")
    }
    return math.Sqrt(f), nil
}



type DivideError struct {
    dividee int
    divider int
}

/**
实现error接口中的Error()方法
 */
func (dError *DivideError) Error() string {
    return ""
}

/**
 * 检查错误,存在就抛出
 */
func checkError(e error) {
    if e != nil {
        panic(e)
    }
}


/**
 * 程序目标: 学习go的错误处理机制,goroutine(暂时理解为go的协程),channel(通信管道,双向), 文件的读写
 * make(chan type):声明type类型的管道
 * 管道会堵塞,直到有数据读取或写出
 */
func main() {

    /**
     * panic关键字抛出异常,类似java的throws
     */
    rs, err := MySqrt(2)
    if err != nil {
        panic(err)
    }
    fmt.Println(rs)


    /**
     * go关键字,启动go协程运行该片段代码
     */
    go printMsg("hello")
    printMsg("world")


    /**
     * 管道接收数据
     */
    nums := []int{1,10,-3,20,-5}
    intc := make(chan int)

    go sum(nums[:2], intc)
    go sum(nums[2:], intc)
    sum1, sum2 := <-intc, <-intc        //读取数据 <-chan
    fmt.Println(sum1+sum2)

    go setVal(200, intc)
    fmt.Println(<-intc)


    /**
     * 读取数据
     */
    data, err := ioutil.ReadFile("tmp/hello.iml")
    checkError(err)
    fmt.Println(string(data))


    /**
     *写入数据, 不存在文件,自动创建
     */
    msg := []byte("hello,world")
    err2 := ioutil.WriteFile("tmp/hello.txt", msg, 0777)
    checkError(err2)
}

/**
 * 写入数据到管道 chan <- value
 */
func setVal(val int, c chan int) {
    time.Sleep(time.Second*2)
    c<-100
}



func printMsg(msg string)  {
    for idx:=0; idx<1; idx++ {
        time.Sleep(20*time.Millisecond)
        fmt.Println(msg)
    }
}

/**
 * 总和写入到管道
 */
func sum(nums []int, intc chan int)  {
    sum := 0
    for _, num := range nums {
        sum += num
    }
    intc<-sum   //送数据到通道中
}

总结

  • 错误机制,协程,管道,文件IO

打卡时间: 1:11

你可能感兴趣的:(golang第三天)