距离golang 1.23发布还有两个月不到,按照惯例很快要进入1.23的功能冻结期了。在冻结期间不会再添加新功能,已经添加的功能不出大的意外一般也不会被移除。这正好可以让我们提前尝鲜这些即将到来的新特性。 今天要说的就是1.23中对 //go:linkname 指令的变更。这个新特性可以说和我的一次失误息息相关。 重要的事情得先写在前面: //go:linkname 指令官方并不推荐使用,且不保证任何向前或者向后兼容性,因此明智的做法是尽量别用 牢记这一点之后,我们可以接着往下看了。至于为啥和“我”也就是本文的作者有关,我们先看完新版本带来的新变化再说。 linkname指令是做什么的 简单的说,linkname指令用于向编译器和链接器传递信息。具体的含义根据用法可以分为三类。 第一类叫做“pull”,意思是拉取,使用方式如下: import _ "unsafe" // 必须有这行才能用linkname import _ "fmt" // 被拉取的包需要显式导入(除了runtime包) //go:linkname my_func fmt.Println func my_func(...any) (n int, err error) 这种用法的指令格式是 //go:linkname 。 这个指令的作用就是告诉编译器和连接器, my_func 的函数体直接使用 fmt.Println 的, my_func 类似 fmt.Println 的别名,和它共享同一份代码,就像把指令第二个参数指定的函数和变量拉取下来给第一个参数使用一样。 正因如此,指令下方给出的声明必须和被拉取的函数/变量完全一致,否则很容易因为类型不匹配导致panic(是的没错,除非拉取的对象不存在,否则都不会出现编译错误)。 这个指令最恐怖的地方在于它能无视函数或者变量是否是export的,包私有的东西也能被拉取出来使用。因为这一点这种用法在早期的社区中很常见,比如很多人喜欢这么干: //go:linkname myRand runtime.fastrand ,因为runtime提供了一个性能还不错的随机数实现,但没有公开出来,所以有人会用linkname指令把它导出为己所用,当然随着1.21的发布这种用法不再有任何意义了,请永远都不要去模仿。 第二种用法叫做“push”,即推送。形式上是下面这样: import _ "unsafe" // 必须有这行才能用linkname //go:linkname main.fastHandle func fastHandle(input io.Writer) error { ... } // package main func fastHandle(input io.Writer) error // 后面main包中可以直接使用fastHandle // 这种情况下需要在main包下创建一个空的asm文件(通常以.s作为扩展名),以告诉编译器fastHandle的定义在别处 在这种用法中,我们只需要把函数/变量名当作第一个参数传给指令,注意需要给出想用这个函数/变量的包的名字,这里是main。同时在指令下方的函数/变量必须有完整的定义。 这种用法是告诉编译器和链接器这个函数/变量的名字就是 xxx.yyy ,如果遇到这个函数就使用linkname指定的函数/变量的代码,这个模式下甚至能在本包定义别的包里的函数。 当然这种用法的语义作用更明显,它意味着这个函数会在任何地方被使用,修改它需要小心,因为改变了函数的行为可能会让其他调用它的代码出bug;修改了函数的签名则很可能导致运行时panic;删除了这个函数则会导致代码无法编译。 最后一类叫做“handshake”,即握手。他是把第一类和第二类方法结合使用: package mypkg import _ "unsafe" // 必须有这行才能用linkname //go:linkname fastHandle func fastHandle(input io.Writer) error { ... } package main import _ "unsafe" // 必须有这行才能用linkname //go:linkname fastHandle mypkg.fastHandle func fastHandle(input io.Writer) error “pull”的一方没什么区别,但“push”的一方不用再写包名,同时用来告诉编译器函数定义在别的地方的空的asm文件也不需要了。这种就像通讯协议中的“握手”,一方告诉编译器这边允许某个函数/变量被linkname操作,另一边则明确像编译器要求它要使用某个包的某个函数/变量。 通常“pull”和“push”应该成对出现,也就是你只应该使用“handshake”模式。 然而不幸的是,当前(1.22)的go语言支持“pull-only”的用法,即可以随便拉取任何包里的任何函数/变量,但不需要被拉取的对象使用“push”标记自己。而被linkname拉取的一方是完全无感知的。 这就导致了非常大的隐患。 linkname带来的隐患 最大的隐患在于这个指令可以在不通知被拉取的packages的情况下随意使用包中私有的函数/变量。 举个例子: // pkg/mymath/mymath.go package mymath func uintPow(n uint) uint { return n*n } // main.go package main import ( "fmt" _ "linkname/pkg/mymath" _ "unsafe" ) //go:linkname pow linkname/pkg/mymath.uintPow func pow(n uint) uint func main() { fmt.Println(pow(6)) // 36 } 正常来说, uintPow 是不可能被外部使用的,然而通过linkname指令我们直接无视了接口的公开和私有,有什么就能用什么了。 这当然是非常危险的,比如我们把 uintPow 的参数类型改成string: package mymath func uintPow(n string) string { return n + n } 这时候编译还是能正常编译,但运行的时候就会出现各种bug,在我的机器上表现是卡死和段错误。为什么呢?因为我们把uint强行传递了过去,但参数需要是string,类型对不上,自然会出现稀奇古怪的bug。这种在别的语言里是严重的类型相关的内存错误。 另外如果我们直接删了 uintPow 或者给他改个名,链接器会在编译期间报错: $ go build # linkname main.main: relocation target linkname/pkg/mymath.uintPow not defined 而且我们导出的是私有函数,通常没人会认为自己写的私有级别的帮助函数会被导出到包外并被使用,因此在开发时大家都是保证公开接口的稳定性,私有的函数/变量是随时可以被大规模修改甚至删除的。 而linkname将这种在别的语言里最基本的规矩给粉碎了。 而且事实上也是如此,从1.18开始几乎每个版本都有因为编译器或者标准库内部的私有函数被修改/删除从而导致某些第三方库在新版本无法使用的问题,因为这些库在内部悄悄用 //go:linkname 用了一些未公开的功能。最近一次发生在广泛使用的知名json库上类似的问题可以在 这里 看到。 linkname的正面作用 既然这个指令如此危险,为什么还一直存在呢?答案是有不得不用的理由,其中一个就在启动go程序的时候。 我们来看下go的runtime里是怎么用linkname的: // runtime/proc.go //go:linkname main_main main.main func main_main() // runtime.main // 所有go程序的入口 func main() { // 初始化runtime // 调用main.main fn := main_main // make an indirect call, as the linker doesn't know the address of the main package when laying down the runtime fn() // main退出后做清理工作 } 因为程序的入口在runtime里(要初始化runtime,比如gc等),所以入口函数必须在runtime包里。而我们又需要调用用户定义在main包里的main函数,但main包不能被import,因此只能靠linkname指令让链接器绕过所有编译器附加的限制来调用main函数。 这是目前在go自身的源代码里看到的唯一一处不得不使用“pull-only”模式的地方。 另外“handshake”模式也有存在的必要性,因为像runtime和reflect需要共享很多实现上的细节,因此reflect作为pull的一方,runtime作为push的一方,可以极大减少代码维护的复杂度。 除了上述这些情况,绝大数linkname的使用都可以算作 abuse 。 golang1.23对linkname指令的改动 鉴于上述情况,golang核心团队决定限制linkname的使用。 第一个改动是标准库里新添加的包全部禁止使用linkname导出其中的内容,目前是通过黑名单实现的,1.23中新添加的几个包以及它们的internal依赖都在名单上,这样可以防止已有的linkname问题继续扩大。这对已有的代码也是完全无害的。 第二个变更时添加了新的ldflags: -checklinkname=1 。1代表开启对linkname的限制,0代表维持1.22的行为不变。目前默认是0,但官方决定在1.23发布时默认值为1开启限制。个人建议尽量不要关闭这个限制。这个限制眼下只针对标准库,但按官方的说法效果好的话以后所有的代码不管标准库还是第三方都会启用限制。 最后也是最大的变动,禁止对标准库的 “pull-only” linkname指令,但允许“handshake”模式。 虽然go从来不保证linkname的向后兼容性,但这样还是会大量较大的破坏,因此官方已经对常见的go第三方库做了扫描,会把一些经常被人用linkname拉取的接口改成符合“handshake”模式的形式,这种改动只用加一行指令即可。而且该限制目前只针对标准库,其他第三方库暂时不受影响。 因为这个变更,下面的代码在1.23是无法编译通过的: package main import _ "unsafe" //go:linkname corostart runtime.corostart func corostart() func main() { corostart() } 因为 runtime.corostart 并不符合handshake模式,所以对它的linkname被禁止了: $ go version go version devel go1.23-13d36a9b46 Wed May 15 21:51:49 2024 +0000 windows/amd64 $ go build -ldflags=-checklinkname=1 # linkname link: main: invalid reference to runtime.corostart linkname指令今后的发展 大趋势肯定是以后只允许handshake模式。不过作为过渡目前还是允许push模式的,并且官方应该会在进入功能冻结后把之前说的扫描到的常用的内部函数添加上linkname指令。 这里比较重要的是作为开发者的我们应该怎么办: 1.23发布之后或者现在就开始利用 -checklinkname=1 排查代码,及时清除不必要的linkname指令。 如果linkname指令非用不可,建议马上提issue或者熟悉go开发流程的立刻提pr补上handshake模式需要的指令,不过我不怎么推荐这种做法,因为内部api尤其是runtime以外的库的本来就不该随便被导出使用,没有一个强力的能说服所有人的理由,这些issue和pr多半不会被接受。 向官方提案,尝试把你要用的私有api变成公开接口,这一步难度也很高,私有api之所以当初不公开一定是有原因的,现在再想公开可能性也不高。 你的追求比较低,只要代码能跑就行,那可以在构建脚本里加上 -ldflags=-checklinkname=0 关闭限制,这样也许能岁月静好几个版本,直到某一天程序突然没法编译或者运行了一半被莫名其妙的panic打断。 4是万不得已时的保底方案,按优先度我推荐1 > 3 > 2的顺序去适配go1.23。2和3不仅仅适用于go标准库,常用的第三方库也可以。通过这些适配工作说不定也有机会让你成为go或者知名第三方库的贡献者。 从现在开始完全是来得及的,毕竟离1.23的第一个测试版发布还有一个月左右,离正式版发布还有两个月。而且方案2的修改并不算作新功能,不受功能冻结的影响。 当然,大部分开发者应该不用担心,比较linkname的使用是少数,一些主动使用linkname的库比如quic-go也知道兼容性问题,很小心地做了不同版本的适配,加上官方承诺的兜底这一对linkname指令的改动的影响应该比想象中小,但是是提高代码安全性的一大步。 说了这么多,和本文的作者有啥关系呢 那肯定有关系,老丢人了。 其实之所以会在开发窗口的中后期有这样大的变动,多半是因为我捅的篓子:前面也说过以前也有不少linkname引用的私有api变化导致的兼容问题,但要么影响范围很小要么作者及时适配使得这些问题没引起太大的波澜;但这次我的改动影响到了某个广泛应用的基础库,这个库用linkname指令引用了大量的内部api,更恐怖的是k8s也在用它,有人用master分支的go编译了一下k8s问题才被发现,要是没能及时发现的话会有一大堆软件在1.23测试版发布的时候出现兼容问题。其实在我的提交之前这些内部api已经变得面目全非了,但因为函数名字和字段类型没怎么变所以库的代码还能接着跑,直到我的提交打破了这一切。 当然问题要说大其实也不大,像那样大量使用linkname且没怎么适配版本的第三方库本身就不多,其次把变更的内部函数的签名还原之后问题很快就解决了,因此除了核心开发者和谷歌内部之外应该没多少人发觉这个问题。这也充分体现了linkname的危险性:在不算缺乏经验的我以及至少三位经验丰富的审核者的review下也没预料到这样功能简单且使用面极窄的内部私有函数会被linkname指令拉取出来使用。 后续库作者也说这些linkname引用的内部api其实很早之前就已经没啥用处了,他会尽快删除;实际上我跟踪了一下库代码发现这些被linkname导出的内部api除了设置了一些简单的flag值之外也确实没啥用处,flag值有些也没用上。 认识到这样的危险性后go官方自然不会坐视不管,官方以前应该也有类似想做限制的想法,这次也算是找到了合情合理的理由了,所以这回行动也意外的快,不到一星期从黑名单禁止导出新的库到linkname指令的检查都实现了。不出意外的话我们应该能在1.23看到一个更健壮的go以及它的标准库。 这样的问题怎么避免?答案是不可能,因为linkname能无视几乎一切限制私有函数/变量的办法,而且你也很难知道有哪些代码通过linkname访问了你写的函数/变量,因此只要一天不做限制类似这次问题的事故就会越来越多,总不可能让开发者每次改完代码都扫描一遍go语言编写的常见的项目吧。而且go的兼容性保证的是公开的接口和语法,内部实现的细节从来都不是也不应该是保证的对象。 我捅的这个篓子现在作为example被放在新提案里呢,虽说本质上用日本话讲叫“お互い様”(大家都有不对的地方),但作为广泛应用的编程语言也确实有需求和义务要兼容那些作为生态基石的应用广泛的第三方库,作为go的贡献者之一却忽视了这一点被结结实实地被上了一课也是应该的,算是经验教训了。。。 总结 最后总结就一句话:没事别用 //go:linkname 。。。。。。 想跟进这一变更的进展的话,可以看这个issue: https://github.com/golang/go/issues/67401
我喜欢纸牌游戏。在TheGamer上,通常指的是 Pokemon 、 Magic 或 Lorcana 。但我真正喜欢的是你常规的纸牌游戏 - 四种花色、从A到K,52张牌。你的Newmarket,你的方块7,你的高尔夫,你的Shed(这是干净版本)。用一副标准的普通扑克牌玩的真正的纸牌游戏。但是 Balatoro 是第一个能够在纸牌游戏和虚拟纸牌游戏之间架起桥梁的游戏,并且这是因为它几乎根本不是一款纸牌游戏。
我们都对Helldivers 2感兴趣,对吧?我不需要再解释它是关于什么了吧?太好了,因为我几乎没有任何欲望这么做。如果这是你第一次阅读关于Helldivers 2的文章,那么很高兴你在从二十年的昏迷中醒来后第一时间打开了这个网页。你的家人一定很高兴见到你。他们有很多事情要更新你。 创建一个账户以继续阅读 更轻松的广告体验 免费无限访问 管理新闻通讯偏好 获取新功能
我国哪所百年高校的樱花景点最为著名?武汉大学武汉大学的樱花已经有着很长的历史,更有着复杂的历史背景,关于武大樱花多数人并不很清楚,只是停留在日本军人栽种的那种认识状态上因此美丽的樱花虽然渲染春色,给了人们美的享受,但也带了一些“烦恼”有人认为樱花是国耻的象征,有人说不要把樱花复杂化;有人说武大因樱花而美丽;也有人说樱花因武大才迷人2015年,著名书法家吴舍燃组织100名书法家来武大赏樱,今天小编就来说说关于我国哪所百年高校的樱花景点最为著名?下面更多详细答案一起来看看吧! 我国哪所百年高校的樱花景点最为著名 武汉大学。 武汉大学的樱花已经有着很长的历史,更有着复杂的历史背景,关于武大樱花多数人并不很清楚,只是停留在日本军人栽种的那种认识状态上。因此美丽的樱花虽然渲染春色,给了人们美的享受,但也带了一些“烦恼”。有人认为樱花是国耻的象征,有人说不要把樱花复杂化;有人说武大因樱花而美丽;也有人说樱花因武大才迷人。2015年,著名书法家吴舍燃组织100名书法家来武大赏樱
喝酒就脸红的是因为肝脏不好吗在日常生活中喝酒的期间会发现有的人喝完酒之后脸红,这到底说明什么问题呢?是不是肝脏不好呢?其实喝酒脸红表示酒精代谢比较异常,很有可能会导致急性肝损伤或者是慢性肝损伤的问题,但并不一定肝脏就已经出现了问题。但长时间大量喝酒会出现乙醇代谢障碍,导致肝脏损伤,在喝酒的时候喝的酒精就是乙醇代谢之后就形成了一圈,往往在代谢最后的结果就是水和二氧化碳如果在体内堆积了一圈,那么就会导致脸红这种问题。出现肝脏损伤之后也会影响到其他的药物代谢障碍,所以如果此时服用药物也会加重肝脏损伤的现象,在喝酒之后出现脸红比较厉害,还是不建议长时间大量喝酒。喝酒之后也可以适当的喝一些蜂蜜柚子水,白萝卜或者是胡萝卜,能够促进酒精的排泄。
最近,华纳探索频道全球流媒体和游戏部门CEO JB Perrette在接受采访时,提到了工作室和游戏之间的关系。他表示并不打算根据角色的人气来强行改编游戏。也就是说,有新的电影不代表会有游戏改编。 Perrette补充说:“在制作电影的过程中,我们不会仅因感到义务而推出超人游戏。”他解释道,团队期望打造一款能让粉丝满意、具有意义的游戏,因此目前并无推出超人游戏的计划。 需要注意的是,超人是漫画界最具辨识度的英雄之一,其传奇故事和改编作品不仅存在漫画之中,更延伸至电影、游戏等多种娱乐形式。
很多孕妇将普通人的便秘和孕妇便秘混为一谈,认为可以使用同样的方法治疗,还有一些孕妇认为孕期便秘的原因是因为吃的太多了。但事实真的是这样吗?孕妇便秘究竟是什么原因导致的?本期就和乖乖网一起来探秘孕期便秘的真相吧! 话题PK 正方:准妈妈便秘是因为吃太多。由于准妈妈要承担两个人的饮食,准妈妈会吃得更多,营养过剩,从而导致便秘。 反方:准妈妈便秘不是因为吃太多。准妈妈便秘的原因有很多,比如孕激素的改变和孕期活动量减少等等,都会导致便秘。揭开孕期便秘的神秘面纱 便秘是孕期最常见的烦恼之一,也是孕期经常疏忽之处。然而,千万别小看这些习以为常的小毛病,一不留神它就会让你悔恨终身。妊娠晚期,便秘会愈来愈严重,常常几天没有大便,甚至1-2周都未能排便,从而导致孕妇腹痛、腹胀。严重者可导致肠梗阻,并发早产,危及母婴安危。曾有患者在妊娠38周时因便秘、肠梗阻导致小肠坏死而切除大部分小肠。有的便秘孕妇分娩时,堆积在肠管中的粪便妨碍胎儿下降,引起产程延长甚至难产。孕期便秘的危害 便秘会增加准妈妈体内毒素,导致机体新陈代谢紊乱、内分泌失调及微量元素不均衡,从而出现皮肤色素沉着、瘙痒、面色无华、毛发枯干,并产生斑点等。还会引起轻度毒血症症状,如食欲减退、精神萎靡、头晕乏力,久之又会导致贫血和营养不良。对宝宝的发育很不利。经常排便用力,还会促使痔疮的形成。并且会使乳房组织细胞发育异常。 便秘是孕期最常见的烦恼之一,也是孕期经常疏忽之处。然而,千万别小看这些习以为常的小毛病,一不留神它就会让你悔恨终身。妊娠晚期,便秘会愈来愈严重,常常几天没有大便,甚至1~2周都未能排便,从而导致准妈妈腹痛、腹胀。严重者可导致肠梗阻,并发早产,危及母婴安危。曾有患者在妊娠38周时因便秘、肠梗阻导致小肠坏死而切除大部分小肠。有的便秘准妈妈分娩时,堆积在肠管中的粪便妨碍宝宝下降,引起产程延长甚至难产。 治疗孕期便秘也要小心,不恰当的治疗也会对宝宝造成伤害。准妈妈们属于特殊的群体,在治疗便秘时,不要口服润滑性的泻药,如蓖麻油、液体石蜡等,这样影响肠道对营养成分的吸收,宝宝的营养得不到很好的保障。而服用导泻剂或者强刺激作用的润肠剂,会使胃肠蠕动增强引起子宫收缩,导致流产或早产。润滑性泻剂(液体石蜡),减少准妈妈对脂溶性维生素(A、D、E、K)的吸收,使新生宝宝易发生低凝血酶无血症(因缺乏维生素K)而致出血。准妈妈便秘是不是因为吃得太多? 有不少准妈妈将普通人和孕妇便秘混为一谈,还有一些准妈妈认为便秘的原因就是吃得太多,由于孕期准妈妈要承担两个人的饮食,为了保证胎儿营养,准妈妈会吃掉两人份的食物,但是由于自己控制不好食量,导致了营养过剩,就出现了便秘的症状。但事实真是如此吗?孕期便秘的秘密,可并不只是在于食量的大小,更重要的则在于膳食结构,如果调整不好膳食结构,即便减少食量,也还是会出现便秘哦!除此之外,还有一些其他的原因也同样会导致孕期便秘!下面我们一起来看看孕妇便秘都有哪些原因: 1.孕妇在怀孕后体内会分泌大量的孕激素,这会减弱胃肠道张力以及减慢胃蠕动功能,从而延长粪便形成时间,造成排便困难。此外,日益渐大的子宫也会压迫肠胃道,减弱排便功能。 2.习惯性便秘。一般是指孕妇孕前就有便秘的状况,怀孕后由于孕激素过量分泌,从而减弱了胃肠功能,同时孕妇又因为“怕麻烦”而减少去厕所的次数,这就造成了便秘的延续发生。 3.运动量减少。多数孕妇担心运动伤“胎气”,从而减少活动量,整天不是坐着就是躺着,使得肠胃消化食物的能力减弱,进而诱发便秘。 4.营养补充不当。多数孕妇都离不开一个“补”字,往往刚刚怀孕就大鱼大肉吃起来,但富含高蛋白、高脂肪的食物一般不利于大便的下滑,再加上孕激素导致营养消化不顺畅,蛋白过剩,引起便秘。 准妈妈如何击退孕期便秘? 我们知道了孕期便秘的几个原因后,就需要“对症下药”,找到适合自己的治疗方法。至于孕期便秘的危害,在怀孕期间,准妈妈如果出现便秘,还可引起肛裂、痔疮,会给准妈妈带来巨大痛苦。下面我们就来看看怀孕便秘该怎么办呢? 孕产妇便秘的治疗: ①养成定时排便的习惯,最好早餐过后排便,不要排便时阅读书报,应养成专心排便的好习惯。 ②适宜运动锻炼,多活动可增强胃肠蠕动,有利于消化、排便。孕妇一定要有适度适量的运动锻炼,这可以加强腹肌收缩力,促进肠胃蠕动和增加排便动力。但要注意的是,采用揉腹按摩促进排便的方法是不可取的,它不能取代运动锻炼。 ③保持身心愉快,心情愉快、精神压力得到缓解等都是减轻便秘的好方法。 ④合理使用缓泻剂,要在专业医生的指导下进行服用。 ⑤还有一个防治方法,就是多吃富含纤维素的蔬果杂粮,比如芹菜、萝卜、苹果、香蕉、梨、燕麦、杂豆、糙米等,也可以自制果汁,以便补充有益的消化酶。但要记住,定时进食,切勿暴饮暴食。当然,还可以选择一些易吸收、帮助肠道运转的的孕妇奶粉。准妈妈该如何提前预防孕期便秘? 其实,并不是所有准妈妈一怀孕就会遇上便秘的问题,但是这是无可避免的,为了胎儿的健康发育成长,准妈妈应该提早做好预防便秘的工作,最为合理的方式就是“内调外养”。 “内调:即通过膳食结构的调整来预防孕期便秘。食物是准妈妈最直接的为宝宝获取营养的途径,至于选择什么样的食物及烹调方法,也就很大程度上决定准妈妈和胎儿的健康与否。作为准妈妈,首先要从三餐的营养上做出调整: 每餐要规律,并且要添加更多水果和蔬菜,烹调方法最好以蒸煮为主;要多喝水,比平时的饮水量增加一些,可每天早晨另加一杯蜂蜜水;多吃一些纤维类的食物,调料要以“淡”为主;切记不可以吃辛辣、燥热类的食物,此外,建议准妈妈在孕期可以每天喝一杯孕妇奶粉,对于准妈妈来说,吃得多并不代表着胎儿就能汲取到足够的营养,孕妇奶粉可以给到准妈妈和宝宝全面营养支持,而含有SoftTummy蛋白优化配方的孕妇奶粉,营养更适合准妈妈肠道吸收,因为其保留了更多天然小分子蛋白,让营养吸收更加充分,只要妈妈们保证了营养,就能够满足胎儿发育的需求;其次,孕妇奶粉中还特别添加了益生元和益生菌,有助孕期肠道健康和营养吸收,不上火,不便秘,是准妈妈的贴心小帮手。 除此之外,还要每天坚持一定量的运动,这就是我们所说的“外调”,传统上来说,怀了孕的准妈妈应该尽可能减少运动,但随着时间的推移,人们的这种观念逐渐被新的科学理论所取代,孕期准妈妈选择得当的运动,不仅可以促进胎儿发育,还可以缓解孕期便秘,并有助产的功效哦! 专家观点:如何缓解孕妇便秘? 孕期发生便秘是件让准妈妈们非常苦恼的一件事。很多准妈妈会问,我也在吃粗纤维丰富的粗粮、新鲜蔬菜水果,多喝水,为什么还便秘呢?其实,便秘的原因有很多,要针对不同情况使用不同的方法来解决。常见便秘原因有:孕期胃肠蠕动缓慢,同时加上胎儿的压迫,造成了动力不足型的便秘;或主食量摄入过少,没有足够的食物残渣形成大便,也造成便秘;再有就是脂肪和水摄入不够,造成大便干燥,很难排出,也导致了便秘。 所以,针对不同的情况我们要使用不同的对策:首先,要选择容易消化的食物,因孕期胃酸分泌量会有所减少,胃肠动力不足,所以易消化的食物会减轻胃肠道的负担,适当的增加富含粗纤维的食物,如粗粮、新鲜蔬果,能够有效地帮助促进胃肠蠕动,减少便秘的发生。其次,适当的益生原和益生菌也是孕期调整胃肠道预防便秘的好帮手。益生原作为益生菌的养料的同时,会产生脂肪酸,能够帮助润滑,同时益生菌能够有效的调理胃肠道的正常菌群,帮助消化,减少便秘。除此之外,适当的脂肪和水的摄入,也是防止大便干燥缓解便秘的好方法。此外,适量的轻度运动也是必不可少的。 准妈妈孕期便秘并不是因为吃得太多。合理改善孕妇的膳食结构,每天喝一杯孕妇奶粉来补充全面营养,保持一定量的运动,就可以有效预防或减缓孕期便秘的症状哦!希望每位准妈妈都能过度过一个安心、舒适的孕期,生出健康的宝宝!孕期便秘日常饮食禁忌 1.忌吃辛辣刺激食物如辣椒、川椒、芥末、咖喱、大葱、洋葱、韭菜、肉桂、菌香、生姜等调味品做的饭菜,用量少许即可,或尽量不用等,少喝碳酸饮料如可乐等。 2.忌吃难以消化的食物莲藕、蚕豆、荷包蛋、糯米粽子、糯米汤圆。 3.不宜进食以下水果菠萝、柿子、桂圆、橘子等。孕期便秘谨慎药物治疗 对于经过调理没有康复迹象的孕妇来说,可以使用一些渗透性的泻药,如乙二醇4000、乳果糖等,以便增加肠道的水分,利于粪便排出。也可以服用益气润肠的药物,如麻仁润肠丸等。孕妇出现大便干硬、排便困难时,则可以用生理盐水即开塞露灌肠,但不宜长期使用。对于器质性病变引起的便秘,应该积极治疗原发疾病,还可用毒性较小的外用药治疗肛周疾病,以利于缓解便秘的症状。 ,
在中国的历史长河中,许多英雄人物的生平事迹都充满了传奇色彩。其中,明朝开国功臣徐达的死因一直被广大历史爱好者津津乐道。有一种说法是,徐达是因为吃了一只烧鹅而死的。然而,这个看似荒谬的说法是否真的揭示了历史的真相呢?让我们一起来揭开这个谜团。 首先,我们需要了解徐达的生平。徐达,字文远,号东篱,明朝开国功臣,曾任左丞相,是朱元璋的重要助手。他在明朝建立过程中立下了赫赫战功,被誉为“开国元勋”。然而,他的死因却一直是个谜。据《明史》记载,徐达在洪武十八年(1385年)病逝,享年四十五岁。 那么,关于徐达因为吃烧鹅而死的说法又是如何产生的呢?这主要源于一些野史和民间传说。据说,徐达在一次宴会上,吃了一只烧鹅后突然病倒,最终不治身亡。然而,这种说法并未得到官方史书的证实,因此不能作为历史事实来看待。 实际上,根据现有的历史资料,徐达的死因更可能是由于疾病或者过度劳累。《明史》记载,徐达在生前身体状况就不佳,经常生病。而且,他在明朝建立过程中,常年征战在外,身体极度疲劳。这些都可能是导致他死亡的原因。 总的来说,徐达因为吃烧鹅而死的说法更像是一种民间传说,缺乏历史依据。而根据现有的历史资料,他的死因更可能是由于疾病或者过度劳累。这也提醒我们,在面对历史时,我们应该以更加理性和科学的态度去探索和理解,而不是轻易相信一些没有根据的传说和谣言。 免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。
一、引言 在中国的历史长河中,赵匡胤的篡位事件无疑是一次重大的政治变革。然而,令人感到惊讶的是,他在篡位后并没有选择杀掉前朝皇帝柴荣的后代。这一行为在当时的历史背景下显得尤为突出,引发了众多历史学家和研究者的探讨。那么,赵匡胤为何在篡位后没有选择杀掉柴荣的后代呢? 二、赵匡胤的人格魅力 首先,赵匡胤的人格魅力是他不杀柴荣后代的重要原因。赵匡胤是一位有着高尚品质和人格魅力的人,他深知杀戮无辜并不能稳固自己的地位,反而会引发更大的反抗。因此,他选择了宽恕和包容,这也是他能够成功篡位并稳定政权的重要原因之一。 三、政治考虑 其次,从政治角度来看,赵匡胤不杀柴荣后代也是明智的选择。杀掉柴荣的后代,虽然可以一时泄愤,但却无法消除前朝的影响,反而可能引发新的反抗。而留下柴荣的后代,既可以显示自己的宽大为怀,又可以利用他们来稳定人心,为自己的统治打下坚实的基础。 四、历史传统 最后,从历史传统来看,赵匡胤不杀柴荣后代也是符合中国传统的一种做法。在中国历史上,新朝往往都会保留前朝皇室的血脉,以此来证明自己的合法性。这种做法不仅可以稳定人心,也有利于新朝的统治。 五、结论 总的来说,赵匡胤篡权夺位之后,没有选择杀掉柴荣的后代,这是他的人格魅力、政治智慧和对历史传统的尊重的综合体现。这一行为不仅显示了他的宽大为怀,也为他的新朝统治打下了坚实的基础。 免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。
自古以来,战争是人类社会发展的重要推动力。在战争中,季节选择往往对战争的胜负产生重要影响。那么,古代打仗为什么多选择秋天呢?而“打秋风”这个词汇又有何深意呢?本文将带您了解这一历史现象背后的真实原因。 一、古代打仗为何多选择秋天 1.秋收时节,粮草充足 秋天是收获的季节,农民们在这个时候收割庄稼,储存粮食。战争需要大量的粮草供应,选择秋天开战,可以充分利用丰收的粮食,为军队提供充足的补给。同时,秋季气候适宜,有利于粮草的储存和运输。 2.秋高气爽,战斗力强 秋天的气候适中,既没有夏天的酷热,也没有冬天的严寒。士兵们在这样的气候条件下训练和战斗,身体条件和精神状态都处于最佳状态。此外,秋天的空气湿度适中,有利于火药武器的使用,提高战斗力。 3.秋季敌军疲惫,容易取胜 经过一个夏季的战斗和行军,敌军在秋天往往会疲惫不堪。此时发起进攻,敌军疲惫且粮草不足,容易取得战斗的胜利。同时,秋季也是敌军换防的时候,新的防线尚未建立,有利于我军的进攻。 二、“打秋风”的深意 “打秋风”这个词汇源于古代战争。在古代战争中,秋季是作战的高峰期,因此“打秋风”意味着发动战争。这个词汇反映了古代人们对战争时机的选择和对战局的判断。 总结:古代打仗多选择秋天,主要是因为秋季粮草充足、气候适宜、敌军疲惫等原因。而“打秋风”这个词汇则反映了古代人们对战争时机的选择和对战局的判断。在现代社会,我们应该珍惜和平,努力发展经济,提高国家综合实力,以维护国家的繁荣和人民的幸福。 免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。
东汉时期,云台二十八将被誉为开国功臣,他们在光武中兴的过程中立下了赫赫战功。然而,在这些英勇的将领中,有一位东汉开国功臣却并未被列入其中,他就是马援。那么,马援为何没有成为云台二十八将之一呢?本文将从历史背景、个人原因和后世评价三个方面进行分析。 一、历史背景 云台二十八将是指在东汉光武帝刘秀建立政权过程中,立下赫赫战功的二十八位将领。他们分别在平定王莽新朝、消灭更始政权、击败赤眉军等重大战役中立下汗马功劳。然而,在这些人中,马援并未被列入其中。 二、个人原因 1. 马援的战功与云台二十八将相比略显不足 虽然马援在东汉建立过程中立下了赫赫战功,但他的战功与云台二十八将相比,还是略显不足。马援主要参与了平定王莽新朝的战斗,而在消灭更始政权、击败赤眉军等重大战役中,他的贡献并不明显。因此,在评定云台二十八将时,马援的战功并未被充分认可。 2. 马援的政治地位相对较低 马援在东汉建立过程中,虽然立下了赫赫战功,但他的政治地位相对较低。他曾任左冯翊、右扶风等职,但并未进入朝廷的核心权力圈。而云台二十八将中的其他将领,如邓禹、耿弇等人,都曾担任过丞相、大将军等重要职务,政治地位较高。这也是马援未能成为云台二十八将的原因之一。 三、后世评价 尽管马援未能成为云台二十八将之一,但他在东汉建立过程中的贡献仍然得到了后世的肯定。他在平定王莽新朝的战斗中立下的赫赫战功,使他成为了东汉开国功臣之一。同时,他的忠诚、勇敢、智慧等品质也受到了后世的赞誉。 总结:马援作为东汉开国功臣,虽然未能成为云台二十八将之一,但他的贡献和品质仍然得到了后世的认可。他的战功和政治地位相对较低,是导致他未能成为云台二十八将的主要原因。然而,这并不影响我们对马援这位英勇将领的敬仰和赞誉。 免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。
魏国作为战国时期的强国,为何最终走向衰落?有人认为是因为孙膑的离开,那么真相究竟如何呢?本文将从多个角度分析魏国衰落的原因,以揭示真相。 一、魏国衰落的内在原因 1.政治斗争激烈:魏国在战国时期,政治斗争十分激烈。魏文侯、魏武侯、魏惠王等君主在位期间,都曾发生过宫廷政变。这种内部斗争严重削弱了魏国的国力,导致国家逐渐走向衰落。 2.人才流失:魏国虽然拥有孙膑这样的杰出军事家,但在其衰落过程中,许多有才能的人才纷纷离去。如商鞅离开魏国后,投奔秦国,为秦国的强大做出了巨大贡献。这些人才的流失,使得魏国失去了发展的活力。 3.经济基础薄弱:魏国的经济基础相对薄弱,农业发展滞后,商业也不够发达。这使得魏国在战争中缺乏足够的物资支持,难以支撑长期的战争消耗。 二、魏国衰落的外部原因 1.战争频繁:战国时期,各国之间战争不断。魏国作为强国之一,与其他国家的争斗也十分激烈。长期的战乱使得魏国的国力逐渐消耗殆尽。 2.秦国崛起:秦国在战国后期逐渐崛起,成为了魏国的最大威胁。秦国实行严格的法制和奖励军功的政策,使得国家实力迅速壮大。而魏国在与秦国的战争中屡战屡败,最终导致了国家的衰落。 三、孙膑离开并非魏国衰落的唯一原因 虽然孙膑是魏国的一位杰出军事家,但他的离开并非魏国衰落的唯一原因。从上述分析可以看出,魏国衰落的原因是多方面的,包括政治斗争、人才流失、经济基础薄弱、战争频繁以及秦国的崛起等。孙膑的离开只是其中的一个因素,不能将魏国衰落的全部责任归咎于他。 总结:魏国衰落的原因是多方面的,既有内在的政治斗争、人才流失等问题,也有外部的战争频繁、秦国崛起等因素。孙膑的离开虽然对魏国有一定影响,但并非魏国衰落的唯一原因。要深入了解魏国衰落的真相,还需从更多角度进行分析。 免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。
能让人爆笑的表情肯定不能错过的啦,超多开心跟快乐的搞怪版的表情总是会收获到很多开心的哦。
程颐,字伊川,北宋著名儒家学者,与弟弟程颢并称为“二程”。他的学说在儒家学派中具有重要地位,然而,关于他的哲学观念究竟是唯物还是唯心的争议一直存在。本文将从历史资料出发,探讨程颐的哲学观念。 一、程颐的哲学观念概述 程颐的哲学观念主要体现在他的《易传》一书中。他认为,宇宙万物都是由阴阳两种对立统一的力量构成的,这种力量是永恒不变的。他还提出了“理”的概念,认为理是宇宙万物运行的规律,是自然界和社会的根本原则。程颐的哲学观念在当时产生了很大影响,对后世的儒家学者产生了深远的影响。 二、程颐唯物的哲学观念 有观点认为,程颐的哲学观念是唯物的。这一观点主要依据以下几点: 1.程颐认为,阴阳五行学说是解释自然现象的最基本理论。阴阳五行学说认为,万物都是由金、木、水、火、土五种元素相互作用而生成的。这一观点强调了物质世界的存在,符合唯物主义的基本特征。 2.程颐的哲学观念强调了人类社会的发展规律。他认为,人类社会的发展是由人的欲望和道德观念共同决定的。这一观点认为,人类社会的发展是由物质条件决定的,符合唯物主义的基本观点。 三、程颐唯心主义的哲学观念 然而,也有观点认为,程颐的哲学观念是唯心的。这一观点主要依据以下几点: 1.程颐认为,理是宇宙万物运行的规律,是自然界和社会的根本原则。这一观点强调了精神世界的存在,符合唯心主义的基本特征。 2.程颐的哲学观念强调了道德教化的作用。他认为,通过道德教化可以使人们遵循理的原则,实现社会的和谐。这一观点认为,人类社会的发展是由道德观念决定的,符合唯心主义的基本观点。 四、结论 综合以上分析,我们可以看出,程颐的哲学观念既有唯物的一面,也有唯心的一面。这种看似矛盾的观点实际上是儒家哲学的一种辩证表现。儒家哲学强调阴阳五行学说和道德教化的作用,既关注物质世界的存在,也关注精神世界的存在。这种辩证的观念为我们认识世界、处理问题提供了有益的启示。 免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。
梁师成,字子美,是中国古代著名的文学家、书法家。他与苏轼、黄庭坚、米芾并称为“苏门四学士”。然而,关于梁师成为什么自称苏轼之子的问题,历史上一直存在争议。那么,梁师成为什么自称苏轼之子呢?让我们一起揭开这段历史的疑云。 一、梁师成的身世之谜 梁师成,字子美,生于北宋时期,他的一生充满了传奇色彩。据《宋史》记载,梁师成的父亲名叫梁颢,是一位文学家。然而,关于梁师成的生父究竟是谁,历史上并没有明确的记载。这使得梁师成的身世成为了一个谜团。 二、苏轼与梁师成的关系 梁师成与苏轼的关系非常密切。据《东坡志林》记载,梁师成曾随苏轼学习书法和诗词。苏轼对梁师成的评价非常高,认为他是一个才子佳人。然而,这并不能完全证明梁师成是苏轼之子。 三、学者们的质疑 关于梁师成是否是苏轼之子的问题,历史上的学者们提出了不同的观点。一些学者认为,梁师成的父亲应该是苏轼的弟弟苏辙。因为苏辙的儿子名叫苏迈,而梁师成的名字中有“子”字,这与苏迈的名字相似。另一些学者则认为,梁师成的父亲应该是苏轼的朋友黄庭坚。因为黄庭坚的儿子名叫黄大临,而梁师成的名字中有“子”字,这与黄大临的名字相似。 四、梁师成的自我认同 尽管关于梁师成是否是苏轼之子的问题存在争议,但我们不能否认的是,梁师成对自己的身份有着清晰的认识。他曾在《东坡志林》一书中自称:“余子美者,轼之犹子也。”这表明梁师成认为自己是苏轼的侄子,而非儿子。这种自我认同体现了他对苏轼的敬仰之情。 五、结论 关于梁师成为什么自称苏轼之子的问题,历史上一直存在争议。虽然我们无法确定他的生父究竟是谁,但我们应该关注梁师成的才华和成就。梁师成的故事告诉我们,一个人的出身并不决定他的人生价值,关键在于他如何发挥自己的才能,为国家和民族做出贡献。让我们继续传颂这段历史的疑云,传承中华民族的优秀文化传统。 免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。
在历史的长河中,英雄豪杰往往被赞美为强者,但有时候,失败的英雄却成为了弱者的代名词。窦建德,这位曾经的农民起义领袖,他的失败是否意味着他的软弱?本文将从历史背景、战争过程和失败原因三个方面,探讨窦建德的失败是否代表他的软弱。 一、历史背景:窦建德的时代 窦建德生活在唐朝末年,这是一个政治腐败、民不聊生的年代。在这样的背景下,窦建德发动了农民起义,试图推翻腐朽的唐朝政权,建立一个新的政权。然而,历史的车轮滚滚向前,唐朝最终还是灭亡了,而窦建德的农民起义也最终失败。 二、战争过程:窦建德的失败 窦建德的农民起义军在战争中曾取得过辉煌的战绩,但在与唐朝军队的较量中,却屡屡受挫。最终,在与唐朝名将李建成的战斗中,窦建德败下阵来,被迫投降。那么,窦建德的失败是否意味着他的软弱呢? 三、失败原因:窦建德的弱点 1. 内部矛盾:窦建德的农民起义军内部存在着严重的矛盾。在战争中,这些矛盾逐渐暴露出来,导致起义军士气低落,战斗力下降。 2. 战略失误:窦建德在战争中犯了一些战略上的错误。例如,在与李建成的战斗中,他没有充分利用自己的优势,而是选择了与敌人硬碰硬,最终导致战败。 3. 政治智慧不足:窦建德在政治斗争中表现出的政治智慧不足,也是导致他失败的一个重要原因。他无法有效地团结各方力量,最终导致起义军内部分裂,无法抵挡唐朝军队的进攻。 四、结论:窦建德的失败并非软弱的表现 从上述分析可以看出,窦建德的失败并非代表他的软弱。相反,他的失败是由于种种原因导致的,这些原因包括内部矛盾、战略失误和政治智慧不足等。因此,将窦建德的失败简单地归结为他的软弱是片面的。在历史的长河中,窦建德虽然失败了,但他的勇气和决心仍然值得我们敬佩。 免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。