Golang Basic - select and channel usage

来源:互联网 发布:图片分析软件 编辑:程序博客网 时间:2024/06/08 16:18

今天学习了一下Golang 的 tag,select 和 channel ,记录在此!

1.tag 的作用

package mainimport ("encoding/json""fmt""reflect")type Accout struct {UserId   int    `json:"user_id" bson:"user_id"`UserName string `json:"user_name" bson:"user_name"`Password string `json:"pass_word" bson:"pass_word"`}func main() {account := &Accout{UserId: 1, UserName: "justin", Password: "12345"}accountJson, _ := json.Marshal(account)fmt.Println(string(accountJson))t := reflect.TypeOf(account)for i := 0; i < 3; i++ {field := t.Elem().Field(i)fmt.Println(field.Tag.Get("json"))fmt.Println(field.Tag.Get("bson"))}}
输出:

{"user_id":1,"user_name":"justin","pass_word":"12345"}user_iduser_iduser_nameuser_namepass_wordpass_word
2.select 和 channel

package mainimport ("fmt""strconv""time")func test1() {ch1 := make(chan int, 1)ch2 := make(chan int, 1)ch1 <- 1ch2 <- 1select {case <-ch1:fmt.Println("ch1 pop one element")case <-ch2:fmt.Println("ch2 pop one element")}}func test2() {timeout := make(chan bool, 1)ch := make(chan int, 1)ch <- 1go func() {time.Sleep(3000)timeout <- true}()select {case <-ch:fmt.Println("got value")case <-timeout:fmt.Println("timeout")}}func test3() {taskChan := make(chan string, 3)doneChan := make(chan bool, 1)for i := 0; i < 3; i++ {taskChan <- strconv.Itoa(i)fmt.Println("send: ", i)}go func() {for i := 0; i < 3; i++ {task := <-taskChanfmt.Println("received: ", task)}doneChan <- true}()<-doneChan}func main() {test2()}
这里的go function是在新的线程里面执行,而返回的结果可以到主线程中。



0 0
原创粉丝点击