golang x/net/context包笔记

golang x/net/context包笔记

基本是 https://blog.golang.org/context 的笔记,能翻墙的话,还是建议大家看看

简介

以前一直见到这个包,感觉很神秘,而context的意思让人觉得不知道它到底是干什么的。

context包主要用于request请求。request请求中,我们可能需要开启不同的routine来获取数据,比如从database获取数据。所以我们可能在一个request过来后,有好几个routine去处理它,然而这些routine可能需要共享request的一些信息,比如用户信息等,同时当request被取消或者超时的时候,所有从这个request创建的routine也应该被结束。

用法

一个context包含着超时时间,取消信号,还有被不同routine共享的数据,它的方法是线程安全的,可以被不同的routine调用。下面是一个简略版本的context。

type Context interface {
    // Done returns a channel that is closed when this Context is canceled
    // or times out.
    Done() <-chan struct{}

    // Err indicates why this context was canceled, after the Done channel
    // is closed.
    Err() error

    // Deadline returns the time when this Context will be canceled, if any.
    Deadline() (deadline time.Time, ok bool)

    // Value returns the value associated with key or nil if none.
    Value(key interface{}) interface{}
}

简单的介绍一下里面的method。

Done会返回一个channel,当该context被取消的时候,该channel会被关闭,同时对应的使用该context的routine也应该结束并返回。值得注意的是,该context有Done方法,而没有Cancel方法。这说明了使用context的routine无法取消某个操作,其实这也是符合常理的,因为这些routine是被某个父routine创建的,而理应只有父routine可以取消操作。在父routine中可以通过WithCancel方法获得一个cancel方法,从而获得cancel的权利。

context的方法是线程安全的,这也就代表了在父routine中创建的context,可以传递给任意数量的routine并让他们同时访问。

Deadline会返回一个超时时间,routine获得了超时时间后,可以对某些io操作设定超时时间。

Value可以让routine共享一些数据,当然获得数据是线程安全的,使用这些数据的时候要注意同步,比如返回了一个map,而map的读写要加锁。

context的创建

context的创建是从父context继承而来的,也就是必须从某个context上创建新的context,他们是父子关系,形成了一个树结构。当某个context被取消后,那么所有继承于它的context也会被取消。

所有的context的父对象,也叫根对象,是一个空的context,它不能被取消,它没有值,从不会被取消,也没有超时时间,它常常作为处理request的顶层context存在,然后通过WithCancel、WithTimeout函数来创建子对象来获得cancel、timeout的能力。

当顶层的request请求函数结束后,我们就可以cancel掉某个context,从而通知别的routine结束。

WithValue方法可以把键值对加入context中,让不同的routine获取。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
golang的net/http是一个非常强大的,用于创建和管理HTTP和HTTPS服务器。它提供了一组用于处理HTTP请求的函数和工具,使得构建一个完整的Web应用变得非常简单和高效。 使用net/http,我们可以很容易地创建一个HTTP服务器。只需使用http中提供的函数,传递一个处理函数作为参数,然后调用`http.ListenAndServe()`函数即可启动服务器。服务器会监听指定的端口,并在接收到请求时调用处理函数来处理请求。 除了创建服务器外,net/http还提供了各种工具和功能来处理HTTP请求和响应。例如,我们可以通过http提供的函数发送HTTP请求并接收响应,还可以设置请求的一些属性,如请求方法、请求头、请求体等。同时,我们也可以使用http提供的各种工具函数来解析和处理HTTP请求和响应的数据,如解析URL、解析请求体、处理cookie等。 net/http还提供了处理HTTP路由的功能,通过创建自定义的`http.Handler`来处理特定的URL或URL模式。我们可以根据请求路径的不同,将不同的处理逻辑分配给不同的处理器,从而实现功能强大且灵活的路由。 此外,net/http还具备一些安全性方面的功能,如支持HTTPS、HTTP身份验证等。我们可以通过提供证书、私钥等信息来实现HTTPS服务器,并利用http中提供的各种函数和方法来进行身份验证和权限控制。 总而言之,golang的net/http是一个功能强大、易用且高效的HTTP服务器程序开发工具。它提供了各种功能和工具,使得构建和管理HTTP和HTTPS服务器变得非常简单和灵活。无论是构建Web应用还是实现HTTP客户端,使用net/http都可以让我们事半功倍。 希望以上的回答能对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值