chan // 可以向此通道中读写数据

<-chan // 只能从此通道中读取数据

chan<- // 只能向此通道中写入数据

package main

import "fmt"

func main() {
	rwCh := rw()
	//从读写通道中读取数据 可以读取
	fmt.Println(<-rwCh)
	//向读写通道中写入数据 可以写入
	rwCh <- "像读写通道写入数据2"
	//从读写通道中读取数据 可以读取
	fmt.Println(<-rwCh)

	rCh := r()
	//从只读通道中读取数据 可以正常读取
	fmt.Println(<-rCh)
	//向只读通道写入数据  编译器报错
	rCh <- "向只读通道写入数据2"

	wCh := w()

	//向只写通道写入数据  可以写入
	wCh <- "向只写通道写入数据1"

	//从只写通道中读取数据 编译器报错
	fmt.Println(<-wCh)
}

func rw() chan string {
	c := make(chan string)
	go func() {
		c <- "向读写通道写入数据1"
	}()
	return c
}
func r() <-chan string {
	c := make(chan string)
	go func() {
		c <- "向只读通道写入数据1"
	}()
	return c
}
func w() chan<- string {
	c := make(chan string)
	go func() {
		for {
			select {
			case d := <-c:
				fmt.Println(d)
			}
		}
	}()
	return c
}



使用 ApplyMethodSeq方法 mock 方法时 outputs的个数必须大于或者等于后面调用的次数 否则会报 `double seq is less than call seq`的错误


https://github.com/agiledragon/gomonkey

omitempty的作用是当字段为零值时 则不进行后续判断,当字段不为零值时 进行后续判断

如果字段是指针类型 则认为 nil为零值  如果字段不是指针类型 则认为 0 空字符串 空数据 等为零值

type User struct {
	Sex int `binding:"omitempty,oneof=1 2"`
}

此时 Sex 传0时可以通过检测 

type User struct {
	Sex *int `binding:"omitempty,oneof=1 2"`
}

此时 Sex 传0时不能通过检测 不传Sex字段 或者Sex字段传NULL时可以通过检测

go-playground/validator