Golang第六章:协程、管道、反射、网络编程

goroutine调度模型

 

管道

 

管道基本使用

package main

import (
    "fmt"
)

func main() {

    var intChan chan int
    intChan = make(chan int, 3)

    intChan <- 10
    num := 211
    intChan <- num

    fmt.Printf("channel len = %v cat=%v \n", len(intChan), cap(intChan)) // 2, 3

    num3 := <-intChan
    num4 := <-intChan

    fmt.Println("num3 = ", num3, "num4 = ", num4) // 此时intChan
}

 

管道使用注意事项

 

 管道的遍历和关闭

 

反射

package main

import (
    "fmt"
    "reflect"
)

//定义了一个Monster结构体
type Monster struct {
    Name    string `json:"name"`
    Age        int `json:"monster_age"`
    Score    float32
    Sex        string     
}

//方法,显示s的值
func (s Monster) Print() {
    fmt.Println("---start----")
    fmt.Println(s)
    fmt.Println("---end----")
}

//方法, 返回两个数的和
func (s Monster) GetSum(n1, n2 int) int {
    return n1 + n2
}

func (s Monster) Set(name string, age int, score float32, sex string) {
    s.Name = name
    s.Age = age
    s.Score = score
    s.Sex = sex
}

func TestStruct(a interface{}) {
    typ := reflect.TypeOf(a)
    val := reflect.ValueOf(a)
    kd := val.kind()

    if kd != reflect.Struct {
        fmt.Println("expect struct")
        return
    }

    //获取到该结构体有几个字段
    num := val.NumField()
    fmt.Println("struct has %d fields\n", num)
    for i := 0; i < num; i++ {
        fmt.Printf("Field %d: 值为%v\n", i, val.Field(i))
        tagVal := typ.Field(i).Tag.Get("json")
        //如果该字段于tag标签就显示,否则就不显示
        if tagVal != "" {
            fmt.Printf("Field %d: tag为=%v\n", i, tagVal)
        }
    }

    //获取到该结构体有多少方法
    numOfMethod := val.NumMethod()
    fmt.Printf("struct has %d methods\n", numOfMethod)

    //获取到第二个方法,按照函数名的排序(ASCII码)
    val.Method(1).Call(nil)

    //调用结构体的第一个方法Method(0)
    var params []reflect.Value
    params = append(params, reflect.ValueOf(10))
    params = append(params, reflect.ValueOf(40))
    res := val.Method(0).Call(params)
    fmt.Println("res=", res[0].Int())

}

func main() {
    var a Monster = Monster{
        Name: "黄鼠狼",
        Age: 400,
        Score: 30.8,
    }

    TestStruct(a)
}

 

网络编程

端口分类

端口注意事项

 

posted @ 2023-01-18 11:05  天叔  阅读(41)  评论(0编辑  收藏  举报