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

  

相关推荐

  1. Go语言 一些问题

    2024-06-06 15:08:25       9 阅读
  2. Go简单

    2024-06-06 15:08:25       32 阅读
  3. go 语言常见问题(2)

    2024-06-06 15:08:25       36 阅读
  4. go 语言常见问题(1)

    2024-06-06 15:08:25       36 阅读
  5. go 语言常见问题(3)

    2024-06-06 15:08:25       40 阅读
  6. go语言什么时候使用go mod的一些建议

    2024-06-06 15:08:25       21 阅读
  7. Go语言语法上的一些主要特点(1)

    2024-06-06 15:08:25       31 阅读
  8. Go 语言一些常用语法编写和优化指南

    2024-06-06 15:08:25       28 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-06-06 15:08:25       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-06 15:08:25       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-06 15:08:25       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-06 15:08:25       20 阅读

热门阅读

  1. BMC压力测试脚本

    2024-06-06 15:08:25       9 阅读
  2. 短剧出海的第一桶金

    2024-06-06 15:08:25       8 阅读
  3. Python怎么睡觉:深入探索Python中的暂停执行机制

    2024-06-06 15:08:25       8 阅读
  4. npm如何发布自己的插件包

    2024-06-06 15:08:25       8 阅读
  5. phpword使用TemplateProcessor对模板进行替换

    2024-06-06 15:08:25       10 阅读
  6. 自动化迁移和更新物体检测XML数据集

    2024-06-06 15:08:25       8 阅读
  7. 03-3.1.2 栈的顺序存储的实现

    2024-06-06 15:08:25       10 阅读
  8. AJAX

    AJAX

    2024-06-06 15:08:25      8 阅读
  9. leetcode刷题

    2024-06-06 15:08:25       8 阅读
  10. WebRTC 在 Android 端实现一对一通信

    2024-06-06 15:08:25       8 阅读
  11. Webrtc支持HEVC之Mediasoup SDP协商编码流程(三)

    2024-06-06 15:08:25       9 阅读
  12. Webrtc支持HEVC之编解码器创建(二)

    2024-06-06 15:08:25       8 阅读