当前位置: 首页 >  法制聚焦  >   >  正文

全球热头条丨[Golang]正确使用Context

  • 2023-03-15 07:10:47 来源:腾讯云

01 为什么要引入Context

context.Context是Go中定义的一个接口类型,从1.7版本中开始引入。其主要作用是在一次请求经过的所有协程或函数间传递取消信号及共享数据,以达到父协程对子协程的管理和控制的目的。

需要注意的是context.Context的作用范围是一次请求的生命周期,即随着请求的产生而产生,随着本次请求的结束而结束。如图所示:

02 什么是context.Context

在context包中,我们看到context.Context的定义实际上是一个接口类型,该接口定义了获取上下文的Deadline的函数,根据key获取value值的函数、还有获取done通道的函数。如下:


(相关资料图)

typeContextinterface{Deadline()(deadlinetime.Time,okbool)Done()<-chanstruct{}Err()error  Value(key interface{}) interface{}}

由定义的接口函数可知,对于传递取消信号的行为我们可以描述为:当协程运行时间达到Deadline时,就会调用取消函数,关闭done通道,往done通道中输入一个空结构体消息struct{}{},这时所有监听done通道的子协程都会收到该消息,便知道父协程已经关闭,需要自己也结束运行

下面是一个使用Context的简易示例,我们通过该示例来说明父子协程之间是如何传递取消信号的。

func main() {    ctx, cancel := context.WithTimeout(context.Background(), 5 * time.Second)    defer cancel()    go doSomethingCool(ctx)    select {    case <-ctx.Done():        fmt.Println("oh no, I"ve exceeded the deadline")    }}func doSomethingCool(ctx context.Context) {    for {    select {    case <-ctx.Done():      fmt.Println("timed out")      return    default:      fmt.Println("doing something cool")    }    time.Sleep(500 * time.Millisecond)    }}

由示例可知,main协程和doSomething函数之间的唯一关联就是ctx.Done()。当子协程从ctx.Done()通道中接收到输出时(因为超时自动取消或主动调用了cancel函数),即认为是父协程不再需要子协程返回的结果了,子协程就会直接返回,不再执行其他的逻辑。

03 Context的作用一:协程间传递信号

3.1 如何创建带可以传递信号的Context

在开头处我们得知Context本质是一个接口类型。接口类型是需要具体的结构体起来实现的。那我们需要自定义结构体类型来实现这些接口吗?答案是不需要。因为在context包中已经定义好了所需场景的结构体,这些结构体已经帮我们实现了Context接口的方法,在项目中就已经够用了。

在context包中定义有emptyCtx、cancelCtx、timerCtx、valueCtx

四种结构体。其中cancelCtx、timerCtx实现了给子协程传递取消信号。valueCtx结构体实现了父协程和子协程传递共享数据相关。本节我们重点来看跟传递信号相关的Context。

在上面示例中,我们通过context.WithTimeout函数创建了一个带定时取消功能的Context实例,该示例本质上是创建了一个timerCtx结构体的实例。在context包中还有WithCancel、WithDeadline函数也可以创建对应的结构体,其定义如下:

//创建带有取消功能的Contextfunc WithCancel(parent Context) (ctx Context, cancel CancelFunc) //创建带有定时自动取消功能的Contextfunc WithTimeout(parent Context, timeout time.Duration) (Context, CancelFunc)//创建带有定时自动取消功能的Contextfunc WithDeadline(parent Context, d time.Time) (Context, CancelFunc)

对应的函数创建的结构体及该实例所实现的功能的主要特点如下图所示:

在图中我们看到结构体依次是继承关系。因为在cancelCtx结构体内嵌套了Context(实际上是emptyCtx)、timerCtx结构体内嵌套了cancelCtx结构体,可以认为他们之间存在继承关系。

通过WithTimeout和WithDealine函数创建的Context实际上都是timerCtx结构体,唯一的区别就是WithDeadline函数的第二个参数指定的是最后的时间点,而WithTimeout函数的第二个参数是一段时间。但WithDealine在内部实现中本质上也是将时间点转换成距离当前的时间段。

3.2 为什么Done函数返回值是通道

在Context接口的定义中我们看到Done函数的定义,其返回值是一个输出通道:

Done() <-chan struct{}

在上面的示例中我们看到的子协程是通过监听Context的Done()函数返回的通道来判断父协程是否发送了取消信号的。当父协程调用取消函数时,该取消函数将该通道关闭。关闭通道相当于是一个广播信息,当监听该通道的接收者从通道到中接收完最后一个元素后,接收者都会解除阻塞,并从通道中接收到通道元素类型的零值。

既然父子协程是通过通道传到信号的。下面我们介绍父协程是如何将信号通过通道传递给子协程的。

3.3 父协程是如何取消子协程的

我们发现在Context接口中并没有定义Cancel方法。实际上通过WithCancel函数创建的一个具有可取消功能的Context实例来实现的:

// WithCancel returns a copy of parent whose Done channel is closed as soon as// parent.Done is closed or cancel is called.func WithCancel(parent Context) (ctx Context, cancel CancelFunc) {  if parent == nil {    panic("cannot create context from nil parent")  }  c := newCancelCtx(parent)  propagateCancel(parent, &c)  return &c, func() { c.cancel(true, Canceled) }}

WithCancel函数的返回值有两个,一个是ctx,一个是取消函数cancel。当父协程调用cancel函数时,就相当于触发了关闭的动作,在cancel的执行逻辑中会将ctx的done通道关闭,然后所有监听该通道的子协程就会收到一个struct{}类型的零值,子协程根据此便执行了返回操作。下面是cancel函数实现:

// cancel closes c.done, cancels each of c"s children, and, if// removeFromParent is true, removes c from its parent"s children.func (c *cancelCtx) cancel(removeFromParent bool, err error) {  //...  d, _ := c.done.Load().(chan struct{})//获取通道  if d == nil {    c.done.Store(closedchan)  } else {    close(d) //关闭通道done  }  //...}

由源码可知,cancelCtx的cancel函数执行时会关闭通道close(d)。

通过WithCancel函数构造的Context,需要开发者自己设定调用取消函数的条件。而在某些场景下需要设定超时时间,比如调用grpc服务时设置超时时间,那么实际上就是在构造Context的同时,启动一个定时任务,当达到设定的定时时间时,就自动调用cancel函数即可。这就是context包中提供的WithDeadline和WithTimeout函数来构造的上下文。如下是WithDeadline函数的关键实现部分:

func WithDeadline(parent Context, d time.Time) (Context, CancelFunc) {  //...  c := &timerCtx{    cancelCtx: newCancelCtx(parent),    deadline:  d,  }  propagateCancel(parent, c)  dur := time.Until(d)  //...  if c.err == nil {        //这里实现定时器,即dur时间后执行cancel函数    c.timer = time.AfterFunc(dur, func() {      c.cancel(true, DeadlineExceeded)    })  }  return c, func() { c.cancel(true, Canceled) }}

WithTimeout函数也是将相对时间timeout转换成绝对的时间点deadline之后,调用的WithDeadline函数。

3.4为什么要通过WithXXX函数构造一个树形结构

很多文章都说,通过WithXXX函数基于Context会衍生出一个Context树,树的每个节点都可以有任意多个子节点Context。如下图表示:

那为什么要构造一个树形结构呢?我们从处理一个请求时经过的多个协程来角度来理解会更容易一些。当一个请求到来时,该请求会经过很多个协程的处理,而这些协程之间的关系实际上就组成了一个树形结构。如下图:

Context的目的就是为了在关联的协程间传递信号和共享数据的,而每个协程又只能管理自己的子节点,而不能管理父节点。所以,在整个处理过程中,Context自然就衍生成了树形结构。

3.5为什么WithXXX函数返回的是一个新的Context对象

通过WithXXX的源码可以看到,每个衍生函数返回来的都是一个新的Context对象,并且都是基于parent Context的。以WithDeadline为例,就是返回的一个timerCtx新的结构体实例。这是因为,在Context的传递过程中,每个协程都能根据自己的需要来定制Context(例如,在上图中,main协程调用goroutine2时要求是600毫秒完成操作,但goroutine2调用goroutine2.1时,要求是500毫秒内完成操作),而这些修改又不能影响之前已经调用的函数,只能对向下传递。所以,通过一个新的Context值来进行传递。

04 Context的作用二:协程间共享数据

Context的另外一个功能就是在协程间共享数据。该功能是通过WithValue函数构造的Context来实现的。我们看下WithValue的实现:

func WithValue(parent Context, key, val interface{}) Context {  if parent == nil {    panic("cannot create context from nil parent")  }  if key == nil {    panic("nil key")  }  if !reflectlite.TypeOf(key).Comparable() {    panic("key is not comparable")  }  return &valueCtx{parent, key, val}}

实现代码很简短,我们看到最终返回的是一个valueCtx结构体实例。其中有两点:一是key的类型必须是可比较的。二是value是不能修改的,即具有不可变性。如果需要添加新的值,只能通过WithValue基于原有的Context再生成一个新的valueCtx来携带新的key-value。这也是Context的值在传递过程中是并发安全的原因。从另外一个角度来说,在获取一个key的值的时候,也是递归的一层一层的从下往上查找,如下:

func (c *valueCtx) Value(key interface{}) interface{} {  if c.key == key {    return c.val  }  return c.Context.Value(key)}

上面简单介绍了下在协程间调用的时候是如何通过Context共享数据的。

但这里讨论的重点是什么样的数据需要通过Context来共享,而不是通过传参的方式。总结下来有以下两点:

携带的数据作用域必须是在请求范围内有效的。即该数据随着请求的产生而产生,随着请求的结束而结束,不会永久的保存。携带的数据不建议是关键参数,关键参数应显式的通过参数来传递。例如像trace_id之类的,用于维护作用,就适合用在Context中传递。

4.1 什么是请求范围(request-scoped)内的数据

这个没有一个明显的划定标准。一般的请求范围的数据就是用来表示该请求的元数据。比如该请求是由谁发出(即user id),该请求是在哪儿发出的(即user ip,请求是从该用户的ip位置发出的)。

例如,如果一个日志对象logger是一个单例那么它也不是一个请求范围内的数据。但如果该logger包含了发送请求的来源信息,以及该请求是否启动了调试功能的开关信息,那么该logger也可以被认为是一个请求范围内的数据。

4.2 使用Context.Value的缺点

使用Context.Value会对降低函数的可读性和表达性。例如,下面是使用Context.Value来携带token验证角色的示例:

func IsAdminUser(ctx context.Context) bool {  x := token.GetToken(ctx)  userObject := auth.AuthenticateToken(x)  return userObject.IsAdmin() || userObject.IsRoot()}

当用户调用该函数的时候,仅仅知道该函数带有一个Context类型的参数。但如果要判断一个用户是否是Admin必须要两部分要说明:一个是验证过的token,一个是认证服务。

我们将该函数的Context移除,然后使用参数的方式来重构,如下:

func IsAdminUser(token string, authService AuthService) bool {  x := token.GetToken(ctx)  userObject := auth.AuthenticateToken(x)  return userObject.IsAdmin() || userObject.IsRoot()}

那么这个函数的可读性和表达性就比重构前提高了很多。调用者通过函数签名就很容易知道要判断一个用户是否是AdminUser,只需要传入token和认证的服务authService即可。

4.3 context.Value的使用场景

一般复杂的项目都会有中间件层以及大量的抽象层。如果将类似token或userid这样简单的参数以参数的方式从第一个函数层层传递,那对调用者来说将会是一种噩梦。如果将这样的元数据通过Context来携带进行传递,将会是比较好的方式。在实际项目中,最常用的就是在中间件中。我们以iris为web框架,来看下在中间件中的应用:

package mainimport (  "context"  "github.com/google/uuid"  "github.com/kataras/iris/v12")func main() {  app := iris.New()  app.Use(RequestIDMiddleware)  app.Get("/hello", mainHandler)  app.Listen("localhost:8080", iris.WithOptimizations)}func RequestIDMiddleware(c iris.Context) {  reqID := uuid.New()  ctx := context.WithValue(c.Request().Context(), "req_id", reqID)  req := c.Request().Clone(ctx)  c.ResetRequest(req)  c.Next()}func mainHandler(ctx iris.Context) {  req_id := ctx.Request().Context().Value("req_id")  ctx.Writef("Hello request id:%s", req_id)  return}

05 总结

context包是go语言中的一个重要的特性。要想正确的在项目中使用context,理解其背后的工作机制以及设计意图是非常重要的。context包定义了一个API,它提供对截止日期、取消信号和请求范围值的支持,这些值可以跨API以及在Goroutine之间传递。

标签:

最新推荐

全球热头条丨[Golang]正确使用Context

context Context是Go中定义的一个接口类型,从1 7版本中开始引入。其主要作用是在一次请求经过的所有...

当前速递!“百优食堂” 提升职工“舌尖上的幸福”

本报讯(记者陈毅)3月9日至10日,由省总工会、省市场监督管理局、省卫健委三家相关人员组成的考核组来...

蜀门逍遥剑侠_蜀门逍遥剑侠|焦点精选

1、什么偶遇任务啊是不是逍遥剑侠的,如果是那这是一个系列任务官网上有详细说明看了说明白了。2、,如...

股权诉讼拖累 云南旅游及法人再收消费限制令

继3月1日披露收到消费限制令,3月14日晚间,云南旅游(002059)披露又收到《限制消费令》,公司与法定代表...

北京:百名中小学生水立方里体验冰雪 当前快报

3月13日,纪念北京冬奥会、冬残奥会成功举办一周年活动暨“冰雪向未来”北京市中小学生冬奥场馆奥林匹克...

西方就北溪事件玩起甩锅游戏,共同为美国打掩护让乌成替罪羊_世界微动态

我们都知道,此前美国资深记者直接指控美国炸毁了北溪管道,并拿出了相关的证据,但是对于指控,美国所...

天天热点评!转基因水稻有哪些品种_转基因水稻

1、转基因水稻,是指通过转基因技术将不同品种水稻或近缘物种的抗虫基因、抗病基因等导入某种水稻基因组...

ETF突发 | 畜牧养殖ETF早盘集体逾2%

畜牧养殖概念股早盘大涨,温氏股份、牧原股份等大涨潮5%。受盘面影响,跟踪中证畜牧养殖指数的4只ETF集...

滚动:你“舌尖上的幸福”,我们来守护

原标题:你“舌尖上的幸福”,我们来守护盐城市亭湖区检察院检察官对薛某、李某生产、销售不符合安全标...

鲁冰花种子种植方法(鲁冰花种植方法)

1、种植方法:盆土:选择酸性的土壤和深一点的花盆;养护:粗放管理,及时将残花进而枯叶剪掉,注意遮阴...

世界简讯:直落三局横扫!樊振东带伤作战兵不血刃,轻松跻身男单16强

直落三局横扫!樊振东带伤作战兵不血刃,轻松跻身男单16强,对手,樊振东,大满贯,乒乓球比赛,世乒赛选拔赛...

cystaldiskinfo中文版_norton disk doctor中文版

今天小编肥嘟来为大家解答以上的问题。cystaldiskinfo中文版,nortondiskdoctor中文版相信很多小伙伴还...

紫藤花苞可以剪枝吗_紫藤花能不能剪枝_天天播资讯

解答:1、紫藤在春季可以修剪,修剪一般在它发芽前进行,所以植株上密集的芽要修剪。2、如果新枝长得比...

全球最资讯丨外媒:部分硅谷银行储户拟打折出售存款以筹集现金

中新网3月13日电据英国《金融时报》12日报道,目前硅谷银行的部分储户正在试图以较大的折扣出售存款以筹...

20万元以下也有插混硬派SUV可选?捷途旅行者插混车型谍照

[爱卡汽车国内新车原创]前不久,在捷途第二届“旅行+”大会上,捷途旅行者(图片)实车正式亮相。近日,捷...

每日热讯!七月再见八月你好发朋友圈句子_七月再见八月你好的句子

欢迎观看本篇文章,小勉来为大家解答以上问题。七月再见八月你好发朋友圈句子,七月再见八月你好的句子...

环球关注:知名对冲基金经理阿克曼预计周一将有更多银行发生挤兑

智通财经APP获悉,对冲基金PershingSquare创始人比尔·阿克曼(BillAckman)表示,预计周一上午将会有更多...

凯迪拉克xt5油耗实测(凯迪拉克xt5油耗)_最资讯

1、在整个汽车市场里,很多人都会说国产车和美系车的油耗高,称它们是油老虎,当然主要针对的是SUV车型...

每日焦点!为了方便自己任意行 “随手拍”:这样可不行!

网友反映1月18日早上8点,在十里堡路与朝阳北路交叉路口处,南向北方向,一车辆轧导流带,占用直行车道...

贾登贾米

1、这九把剑或长或短,  或粗或细,  有的只有巴掌大小,  有的却是长达两米,  有的只有半指粗...

热头条丨去哪儿网机票特价机票单程_去哪儿特价机票网

1、你可以去飞行者商旅网看看呀。2、或者航空公司自己的网站都可以。本文分享完毕,希望对大家有所帮助。

海南这些“绿色古董”,你猜它们几岁了?

海南这些“绿色古董”,你猜它们几岁了?

哲仁王后_世界快消息

1、哲仁王后(朝鲜语:철인왕후,1837年—1878年),女,姓金,生于朝鲜首都汉城(今韩国首尔),本贯安...

相亲对象是我的强硬问题学生漫画免费阅读|独家焦点

1、51 相亲对象问题学生百度云:链接:lyavv,pfhrv,phwsz,yrcax,bsecd,vxrwv,wnxh

通讯!杭州索菲亚大酒店_关于杭州索菲亚大酒店简述

1、杭州索菲亚大酒店位于杭州市上城区上仓桥路,地处美丽的西子湖畔东侧和繁华的城市中央,靠近西湖景区...

岩字组词和部首_岩字组词有哪些

1、摇滚词:2、岩石,地层,洞穴,熔岩,岩石,岩浆,核心,岩溶,岩石,岩石,岩壁,石板,岩石梦,岩...

中国邮政储蓄手机银行_手机怎么查银行卡余额-世界热议

打开软件商店,搜索,下载,安装中国银行。点击左上角登录。点击快速余额查询进入,输入银行卡号、取款...

全球快看:两会你我他丨将“输血”变“造血” 把健康送到雪域高原

除了推动优质医疗资源扩容下沉,我国目前也在推进区域均衡布局。建立国家区域医疗中心,就是一个重要举...

双生记-天天视讯

1、《双生记》是由瑟沙迪·萨哈万、凯瑟娅·英利主演的电视剧一部泰国电视剧。2、该剧于2010年10月12日...

规模经济名词解释试题_规模经济名词解释|今日聚焦

1、大规模生产导致的经济效益简称规模经济(Economiesofscale),是指在一定的产量范围内,随着产量的增加

如何将CAD文件转换为exb文件 全球今头条

1、让我来回答你吧!首先CAD格式是目前市场上最为主流的交换格式,尤其是在大公司里。2、Exb只是小众软...

三分钟发言稿大概多少字数_三分钟发言稿大概多少字 精彩看点

1、这个是要看你的语速的。2、我一分钟大概能说100个字。3、正常的考试听力大概一分钟90个字左右。4、国...

辽宁省大洼县发布大风黄色预警

辽宁省大洼县发布大风黄色预警

全国政协委员靳东:戏剧表演不是“简单的明星梦”-动态焦点

建议加强对非遗的宣传力度,如何提高老区果农的经济收入,建议大力宣传国家遗嘱库并将其利用好……这是...

全球快看:上个月初和月末都来月经_月初和月末都来月经正常吗

1、月经在月初和月末来,如果时差7天是正常的。2、正常月经周期为21-35天,平均28天。3、它的计算是从末...

忍者神龟名字对应人物_忍者神龟名字_世界实时

1、忍者神龟有四个名字。忍者神龟老师非常喜欢艺术,他们以四位著名艺术家的名字命名。2、彩色头双刀的...

当前播报:马斯克要在得州建乌托邦?被曝已购地数千英亩 还要给员工配廉租房

横跨多个领域的马斯克要进军房地产了?当地时间3月9日,据《华尔街日报》报道,根据地契等土地记录以及...

U20男足亚洲杯:中国队晋级八强_世界滚动

U20男足亚洲杯:中国队晋级八强3月9日,中国队球员木塔力甫·依明卡日(左)在比赛中庆祝对手打入乌龙球...

环球视点!平均相对原子质量怎么算_相对原子质量怎么算

1、相对原子量是指元素的平均原子质量与核素12c原子质量的1 12之比 国际上之所以要选用碳-12而不用碳-14是因

无锡新型冠状病毒肺炎疫情:3月10日无锡疫情最新消息今天数据统计情况通报 每日热点

无锡新型冠状病毒肺炎疫情:3月10日无锡疫情最新消息今天数据统计情况通报,截至3月10日04时30分无锡疫情...

晋城到太原高铁时刻表_太原到临汾高铁时刻表|环球关注

1、临汾->太原(2016年04月09号周六)共计27个车次D2002临汾西太原南07:3909:16

韩军:朝鲜向半岛西部海域发射一枚短程弹道导弹 全球热点评

韩军:朝鲜向半岛西部海域发射一枚短程弹道导弹

前沿热点:戒烟后的症状多长时间能消失_戒烟后的症状多久消失

1、症状因人而异。2、也和抽烟时间长短、每天抽烟两有关系,一般在2周会有明显变化,一周就会感觉精神好...

全球资讯:360勒索病毒解密_360勒索病毒

1、打开360界面,登陆右上角。2、左下角反勒索服务,点击进入,点击打开。本文到此结束,希望对大家有所...

南瓜灯怎么做手工_南瓜灯怎么做手工制作 环球快播

首先在南瓜上画出喜欢的图案,然后用刀从顶部切出一个小孔,用勺子挖空里面,再雕刻五官成镂空状态这样...

环球快消息!左慈耳鸣丸饭前还是饭后_左慈耳鸣丸

1、你好,造成耳鸣的原因很多:①主要是耳部的疾病,如外耳疾病:外耳道炎、耵聍栓塞、外耳异物等,中耳...

大侠立志传加点攻略,大侠立志传属性点怎么加? 世界报道

《大侠立志传》是一款开放世界武侠RPG游戏,玩家们将来到江湖中自由闯荡,游戏中开局角色属性加点非常关...

购销合同生效的条件是什么-全球快报

购销合同生效的条件如下:1、主体合格。当事人应具备订立合同的条件,即必要的民事权利能力、民事行为能...

「全球市场晚报」3月8日

据发稿前的非官方数据,3月8日A股收盘,沪指跌1 85点,跌幅0 06%,报3283 25点;深证成指跌10 29点,跌

传奇玉兔元素属性详解_1 85玉兔元素版本传奇-每日时讯

1、185玉兔元素版本的私服!搜罗近出补厥亡索漠风烟两见秋无数赤子号悲风忧国忠纯不谩狂传闻象郡隔南荒...

X 广告
X 广告

精彩放送

北京:社区搭建议事平台 百姓有地方“说事儿”

刘俊卿历史原型_刘俊卿_全球今亮点

天天看热讯:猪下水为什么比肉都贵_猪下水

外资公募产品“上新”提速 全球投资者缘何看好中国 天天时讯

热推荐:最新公示!六安又一批人获得购房补贴

易建联在哪个队

【环球播资讯】今日快讯:沪深两市今日成交额合计7185亿元,浪潮信息成交额居首

吴若甫

民进株洲市委会:将公益书法班打造成同心项目品牌-环球热消息

雷战

世界热资讯!版权方英文(英文版权声明)

【热闻】CBA综合:四川大胜宁波结束六连败 深圳力克北京豪取五连胜

俄罗斯有哪些著名男歌星

教育如何应对人口之变?委员建议探索教师编制动态调整机制 全球短讯

佛山四中

凯尔达焊机合格证_凯尔达焊机官网

环球观点:3月7日基金净值:融通内需驱动混合A最新净值2.414,跌1.23%

大华虎城|新消息

华大智造:DNBSEQT20×2将单个人全基因测序成本降低至100美元以内|世界关注

冷镀锌管

六问行业库存:哪些行业将迎来库存拐点

当前头条:我能成为你的家人吗22

世界视点!狗头鱼的养殖方法

上交所总经理蔡建春:利用大数据严打财务造假 推动央企估值合理回归 全球微头条

怎么将安卓手机桌面变成ios

1月汽车销量排行榜出炉,国产车旭日东升,日系车销量低迷

7换1!勇士报价恩比德,筹码诚意满满

三明虎头山-当前速讯

南非总统拉马福萨宣布新内阁成员名单

一个成年人每天掉多少根头发属于正常 全球短讯

央行降息是什么意思?降息时买什么东西会升值?

物业公司招聘启事范文(热门16篇)-全球快讯

怎样修改锁屏密码_怎样修改主页 全球即时看

市值过万亿,金牌员工每人发500万!昔日中国首富承诺

伊莱克斯冰箱怎么样 伊莱克斯冰箱到底好不好用

抚养费能强制执行吗?怎么支付抚养费?

街头篮球

武胜县大地油彩旅游节于3月11日启幕

一汽解放:目前已投放市场产品涵盖重、中、轻、微、客五大平台和纯电动、混合动力、燃料电池三条技术路线

股市开市闭市时间 世界看点

运机集团(001288):全资子公司变更经营范围并完成工商变更登记

招商银行有什么好的理财产品 这三种可以了解一下!

好听的圣诞歌曲英文歌_好听的圣诞歌曲

广州南沙区调整龙穴街道龙穴社区临时管控措施|世界新消息

塞班智能

河南蒸鸡做法_蒸鸡做法

迷彩usas12 全球最新

惊蛰之美,有声之雄浑亦有色之妖艳

囧妈哪里可以看可以投屏

学雷锋日 西湖区多地举行应急知识科普宣传活动

Copyright ©  2015-2023 非洲律师网版权所有  备案号:沪ICP备2022005074号-8   联系邮箱:58 55 97 3@qq.com