Go语言 一些问题了解

一、读取文件数据,是阻塞还是非阻塞的?

        分两种情况:常规读取文件数据,和网络IO读取数据

1. 常规读取文件数据:

    io.Reader 和 bufio.Reader 是阻塞进行的。 

    bufio.Reader 提供缓冲的读取操作,意味着数据是被阻塞式地 一次一段地 读取进来,然后存储在缓冲区内。当你需要读取更多数据时,它会从文件或其他 IO 源继续填充缓冲区。

    如果想要异步读取文件,可以使用 goroutines 和 channels。

2. 网络IO读取数据:

(1) 结论:

    网络IO在用户层是阻塞进行的(io.Reader),而在底层是以非阻塞的IO多路复用方式(epoll)实现的。

    是Go Net 或者 netpoll 把底层系统操作封装起来了,最终的效果就是用户层阻塞,底层非阻塞

(2) 解释:

    每个Goroutine在需要等待网络事件时,都会使用netpoll来监听一个或多个文件描述符。

    netpoll会在内部以非阻塞的方式轮询注册文件描述符(FDs),一旦有I/O事件发生,它就会将对应的事件分发给相应的Goroutine来处理。    

     netpoll并不是一个单独的函数或者Goroutine,而是内嵌在Go的运行时中独立运行的,用来处理多个Goroutine注册的I/O事件。

     一个Goroutine可以同时监听多个网络连接的事件,用户程序不需要为每个连接单独创建一个Goroutine。

(3) 引申:

     因为Go 具备了在 用户层用 阻塞io 进行读写的逻辑,所以 Go 推崇使用阻塞式的方式来编写程序,当需要处理并发逻辑时,就通过goroutine和channel来实现。

二、GO使用组合而非继承,体现了哪些优势?

1. 代码更优雅:对象的层次结构能够保持简洁,易于理解对象是负责哪个单一任务。

2. 降低了耦合:继承表示的是类型扩展的逻辑;而组合表示的是对象之间的包含关系。组合模式需要承担的职责更低,比如省去了构造和析构的继承逻辑。

3. 使用更灵活:嵌入的对象,可以在运行的时候被改变,被替换成同类型对象。

三、传参、引用类型、赋值

    Go语言传参,不管是数值类型还是引用类型,都是 值传递

    传递 引用类型 的时候,传递的是指针。传递之后,会有新的指针变量,但是指向的数据是同一份数据, 修改数据的话会修改原值

    引用类型 赋值 的话是浅拷贝,数据修改逻辑同上。

四、怎么判断 Json中某一个key是否存在?

1. 定义map结构体 map[string]interface

2. 把字符串转化成 byte切片[]byte

3. 把byte切片转换成 map结构体

4. 对map的制定key进行取值,并对第二返回bool参数进行判断

func main() {
    str := `{"key":"value"}`    //随便写一个json 字符串数据

    var data map[string]interface{} //1. 定义map结构体
    slic := []byte(str)             //2. 把字符串转化成byte切片
    err := json.Unmarshal(slic, &data) //3. 把byte切片转换成 map结构体
    if err != nil {
        fmt.Println("Error parsing JSON string:", err)
    }
    if  val, ok := data["key"]; ok {    //4. 对map的制定key进行取值,并对第二返回bool参数进行判断
        fmt.Println(val)
    } else {
        fmt.Println("not exist")
    }
}

  

  • 6
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值