测试代码
- 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
有疑问加站长微信联系(非本文作者)