首页 > 编程语言 >Golang第六章:协程、管道、反射、网络编程

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

时间:2023-01-18 11:13:35浏览次数:40  
标签:reflect 协程 Monster val fmt 编程 Golang params func

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)
}

 

网络编程

端口分类

端口注意事项

 

标签:reflect,协程,Monster,val,fmt,编程,Golang,params,func
From: https://www.cnblogs.com/tianshu/p/16339408.html

相关文章

  • Python爬虫-第四章-2-协程与异步
    协程:    单线程执行多任务执行时,当执行中程序处于I/O期间,异步可以让CPU选择性的切换到其他任务上#DemoDescribe:协程importasyncioimporttime'''协程所针对的......
  • golang实现set
    golang没有原生的set要实现set可以使用map来简易实现定义一个Set可以这么定义typeSet[Tcomparable]struct{setmap[T]struct{}}为什么map的值类型用struct{......
  • SQLServer 编程总结
    case的用途 case语句有四个关键字,缺一不可,分别是:casewhenthenend,另外还有一个else。case后面跟字段名(当在when后面出现字段名时,case里不能写出来),when后面跟判断语......
  • 十年学会编程
    著者:PeterNorvig翻译:DaiYuwen为何人人都这么着急?信步走进任何一家书店,你会看到名为《如何在7天内学会Java》的书,还有各种各样类似的书:在几天内或几小时内学会Vis......
  • golang无缓冲channel避坑点
    输出结果顺序:默认情况下,channel接收和发送数据都是阻塞的,除非另一端已经准备好。......
  • Java并发编程
    1.并发与并行?并行(parallel):指在同一时刻,有多条指令在多个处理器上同时执行。所以无论从微观还是从宏观来看,二者都是一起执行的。并发(concurrency):指在同一时刻只能有......
  • golang: os.Write函数
    函数解析os.Write函数func(f*File)Write(b[]byte)(nint,errerror){//判断是否f为nil iferr:=f.checkValid("write");err!=nil{ return0,e......
  • 小满Vue3第三十八章(函数式编程,h函数)
    之前跟大家介绍了两种vue编写风格分别是template模板方式,和JSX方式感觉JSX被大家吐槽的很厉害,其实用习惯还挺好用的今天介绍第三种函数式编程主要会用到h函数​​h​​ 接......
  • socket编程相似对象、函数、概念的区别于联系
    socketaddr、sockaddr_in与addr_insocketaddr与socketaddr_in的关系类似于基类和派生类的关系。addr_in是socketaddr_in中一个成员变量。structso......
  • 面向过程编程和面向对象编程的区别
    面向过程编程和面向对象编程的区别此篇文章来自一个初学Java不久的学生,内容的用词、深度、广度甚至部分理解不够到位,再加上Markdown语法的不熟练,所以排版不够美观。但还......