select操作



1.Go语言中打印结构体推荐使用“%+v”,而不是“%v”。看一下二者区别:
	v := info{"Nan", 33}
    fmt.Printf("%v\n", v) // {Nan 33}
    fmt.Printf("%+v\n", v) // {name:Nan id:33}
    //

2.select对管道的操作:
https://www.jianshu.com/p/2a1146dc42c3


func test(){
	var data = make(chan int, 10)
	for  i :=0; i<10; i++{
		//fmt.Println(1)
		select {
		case x:= <-data:
			//fmt.Println(x)
			fmt.Println("send data:", x)
			//list2 = append(list2, x)
		case data <- getData(i):
			fmt.Println("get data,", i)
			//list2 = append(list2, i)
		}
	}
	fmt.Println(data)
	fmt.Println(list2)
}

func getData(i int)(ss int){
	//fmt.Println("get...", i)
	return i
}
select 基本用法
1、如果多个通道都阻塞了,会等待知道其中一个通道可以处理。
2、如果多个通道都可以处理,随机选取一个处理。
3、如果没有通道操作可以操作并且写了default语句,会执行:default(永远是可以运行的)
4、如果防止select堵塞,可以写default来确保发送不被堵塞,没有case的select就会一直堵塞。
5、当select做选择case和default操作时,case的优先级大于default。
6、select语句实现了一种监听模式,通常在无限循环中使用,通过在某种情况下,通过break退出循环。
7、从case中取数据时,case data <- getData(i):会执行getData,且会往管道data中存入数据.

package main

import "fmt"

var ch1 chan int
var ch2 chan int
var chs = []chan int{ch1, ch2}
//var chs = []*chan int{&ch1, &ch2}
var numbers = []int{1, 2, 3, 4, 5}

func main () {
	ch1 = make(chan int, 2)
	ch2 = make(chan int, 1)
	ch1 <- 1
	fmt.Println(len(ch1))
	select {
	case getChan(0) <- getNumber(2):

		fmt.Println("1th case is selected.")
	case getChan(1) <- getNumber(3):

		fmt.Println("2th case is selected.")
	default:

		fmt.Println("default!.")
	}
	fmt.Printf("len chan2:%d\n", len(ch2))
	fmt.Println(len(ch1))
	for _, v:= range chs{
		fmt.Println(len(v))
	}
}

func getNumber(i int) int {
	fmt.Printf("numbers[%d]\n", i)

	return numbers[i]
}
func getChan(i int) chan int {
	fmt.Printf("chs[%d]\n", i)
	chs[i] = make(chan int, 3)  // 不用make初始化的时候channel无法接受数据,会阻塞

	return chs[i]
}


posted @ 2019-10-21 13:45  nanaindi  阅读(152)  评论(0)    收藏  举报