Go 1.23引入的新Bug?其实只是文档没看仔细

上个月中旬,Go 1.23版本正式发布!这也是Russ Cox作为Go tech leader的最后一个发布版本,他本人在该版本中做出重要贡献,那就是解决了一直困扰Go团队的Timer/Ticker的GC回收问题,进而解决了Timer的Stop和Reset很难正确使用的问题。

2ae48e5ee9be7d1379977b33ff84cb26.png

不过,就在昨天,一个叫tulir的gopher提出的issue(ttps://github.com/golang/go/issues/69186)差点让Russ Cox“晚节不保”:)。该issue提到,他写的一段使用了Timer的代码在Go 1.22中工作正常,但在Go 1.23中就无法工作了,具体现象是:在linux上,整个程序hang住不动了,而在macOS上,则直接引发panic异常退出:"fatal error: ts set in timer"。

随即,Go101老貘兄“补上一刀”,给出了一个更为简洁的示例:

package main

import "time"

func main() {
 illegalTimerCopy := *time.NewTimer(time.Second)
 illegalTimerCopy.Stop() // block for ever
}

我也实测了该示例,在我的macOS上,用go1.23.0运行,直接panic,即便使用GODEBUG=synctimerchan=1退回到Go 1.23以前的行为也不行。在centos 7.9(kernel 3.10)上跑,也发生了和issue一样的现象:hang住不动。

到这里,我也不得不认为:这是go 1.23 Timer引入的新bug!但真相果真如此吗?

几个小时后,Go大神Ian Lance Taylor现身说法了。他居然表示对Go 1.23之前的版本依然可以正确运行上述代码表示“惊讶”。

3fd512ada1cab6903b57e0d4cadbf765.png

之后,他表示从Go 1.4版本开始,Go标准库文档(#8776)就对Timer类型的使用做出了限制:"A Timer must be created with NewTimer or AfterFunc.",即Timer只能使用NewTimer和AfterFunc创建。

81149417889cdf4ce2def986ba61cb03.png

而像上述代码中的对Timer实例的Copy的行为则是未定义的。

6fb04d4680c2daad354734fea134fe6a.png

目前Ian Lance Taylor将该issue改名为“proposal: cmd/vet: warn about copying a time.Timer value”,即建议在vet中增加warning,但他也不保证该proposal能被accept,因为要看后续是否会受到很多类似的问题报告。

盖棺定论了,原来是我们的文档看的还不够仔细:)。

不过,即便go vet不增加对Timer copy的warning,我也想建议官方修改一下Timer的doc描述,再直白一些,就像对sync.Mutex那样:A Mutex must not be copied after first use.

805c5b5a4f31132d844e5f839f6d9c67.png

在Timer文档中,也补充依据:A Timer must not be copied after being created.

你说呢?


推荐阅读

- Go 1.23中值得关注的几个变化

Go 1.18之后的语法新特性Quiz,你能做对几个

继Ollama之后,Go在AI领域再下一城

- 通过Go实例理解函数式编程

- Go与神经网络:手写数字识别


Gopher部落知识星球在2024年将继续致力于打造一个高品质的Go语言学习和交流平台。我们将继续提供优质的Go技术文章首发和阅读体验。同时,我们也会加强代码质量和最佳实践的分享,包括如何编写简洁、可读、可测试的Go代码。此外,我们还会加强星友之间的交流和互动。欢迎大家踊跃提问,分享心得,讨论技术。我会在第一时间进行解答和交流。我衷心希望Gopher部落可以成为大家学习、进步、交流的港湾。让我相聚在Gopher部落,享受coding的快乐! 欢迎大家踊跃加入!

b22f2d58ecfc11e40c6cfb42ab87a785.jpeg55c326a114c35dd55c1024afbbb473dc.png

b53c990b49edd3efa047e46095d2a630.png
img{512x368}
<think>好的,用户问的是Python 3.6是否支持numpy==1.23.5。我需要先确认这个版本的兼容性。 首先,用户之前的问题是关于numpy.testing.decorators模块缺失,这在1.24版本被移除。所以用户想降级到1.23.5来解决这个问题。但用户现在用的是Python 3.6,需要确认是否兼容。 接下来,我应该检查NumPy官方文档或发布说明。通常,NumPy会列出每个版本支持的Python版本。根据我的知识,NumPy 1.23.x系列应该是支持Python 3.6到3.10的。但Python 3.6的支持可能在某些版本中已经停止,不过1.23.5应该还是支持的。 然后,用户可能是在运行旧项目,所以必须使用Python 3.6。这时候需要确保安装的NumPy版本不仅兼容Python 3.6,还能解决他们之前遇到的问题。另外,用户可能对虚拟环境不熟悉,可能需要指导如何创建虚拟环境来测试。 还要考虑用户是否有权限安装旧版本,或者是否需要使用pip的特定命令。例如,使用pip install numpy==1.23.5可能直接可行,但需要确认是否有对应的wheel文件。如果用户遇到安装问题,可能需要额外的步骤,比如从存档下载或者使用其他工具。 另外,用户可能没有意识到Python 3.6已经不再受官方支持,是否需要建议他们升级Python版本?不过如果项目限制无法升级,那还是得解决当前的问题。这时候需要给出明确的步骤,确保他们能顺利安装并解决问题。 最后,相关问题需要围绕Python版本兼容性、安装旧版库的方法以及替代解决方案展开,帮助用户全面了解可能的选项和注意事项。</think>--- ### ✅ 答案:**Python 3.6 支持 `numpy==1.23.5`** 但需注意以下兼容性细节: --- ### 🔍 **1. NumPy 1.23.5 的 Python 版本支持** - **官方支持的 Python 版本**:`3.7–3.10`([NumPy 1.23 Release Notes](https://numpy.org/doc/stable/release/1.23.0-notes.html#python-version-support))。 - **Python 3.6 的兼容性**: - **理论上支持**:NumPy 1.23.x 的早期版本(如 1.23.5)可能仍兼容 Python 3.6,但官方不再提供测试或维护。 - **实际验证**:可通过以下命令尝试安装: ```bash pip install numpy==1.23.5 ``` - 若安装失败,需手动下载对应版本的 `.whl` 文件(见下方解决方案)。 --- ### 🛠️ **2. 解决方案:如何在 Python 3.6 中安装 `numpy==1.23.5`** #### 方法 1:直接安装(推荐) ```bash pip install numpy==1.23.5 ``` - **成功条件**:系统环境(如操作系统、编译器)需与预编译的 `.whl` 文件兼容。 - **失败原因**:若无对应 Python 3.6 的预编译包,会触发源码编译,可能因依赖缺失失败。 #### 方法 2:手动下载 `.whl` 文件 1. **访问 [NumPy 官方存档](https://pypi.org/project/numpy/1.23.5/#files)**。 2. **选择与 Python 3.6 兼容的 `.whl` 文件**(如 `numpy-1.23.5-cp36-none-win_amd64.whl` 或 Linux/macOS 对应版本)。 3. **本地安装**: ```bash pip install numpy-1.23.5-cp36-none-<your_platform>.whl ``` #### 方法 3:使用虚拟环境(推荐隔离环境) ```bash # 创建虚拟环境 python3.6 -m venv py36_env source py36_env/bin/activate # Linux/macOS py36_env\Scripts\activate # Windows # 安装指定版本 pip install numpy==1.23.5 ``` --- ### ⚠️ **3. 注意事项** 1. **Python 3.6 的安全性**: - Python 官方已于 2021 年停止对 3.6 的支持,可能存在安全风险。 - **建议**:若项目允许,升级到 Python 3.9+ 以获得更好的兼容性和支持。 2. **依赖冲突**: - 若其他库依赖更高版本的 NumPy,可能引发冲突。 - 使用虚拟环境可避免全局污染。 --- ### 🧪 **4. 验证安装** 安装完成后,运行以下代码验证是否成功: ```python import numpy as np print(np.__version__) # 应输出 "1.23.5" ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值