Go database/sql 包查询结果行数精确判断与首行数据获取

Go database/sql 包查询结果行数精确判断与首行数据获取

本文深入探讨Go语言中database/sql包在数据库查询时,如何精确判断返回结果的行数(零行、单行或多行),并安全地获取首行数据。针对QueryRow的局限性,文章提供了一个通用的自定义函数方案,利用db.Query和*sql.Rows的特性,实现对查询结果的细粒度控制,同时强调了错误处理和资源管理的重要性,为开发者提供了处理复杂查询场景的专业指导。

理解 database/sql 包的查询机制

在go语言中,database/sql包提供了与sql数据库交互的标准接口。它主要提供了两种基本的查询方法:queryrow() 和 query()。理解它们的行为对于精确控制查询结果至关重要。

db.QueryRow():

此函数设计用于执行预期返回最多一行结果的查询。它返回一个 *sql.Row 对象。调用 row.Scan() 会尝试将结果扫描到提供的变量中。局限性: QueryRow() 不会报告查询是否返回了零行或多行。如果查询返回多行,它只会处理第一行,而不会产生错误。如果查询返回零行,Scan() 将返回 sql.ErrNoRows 错误。这意味着它无法区分“未找到”和“找到但有多行”这两种情况,这在某些业务逻辑中可能是一个问题。

db.Query():

此函数用于执行预期返回零行、单行或多行结果的查询。它返回一个 *sql.Rows 对象和一个错误。*sql.Rows 对象是一个迭代器,需要通过 rows.Next() 方法遍历结果集,并通过 rows.Scan() 方法将当前行的数据扫描到变量中。优势: Query() 提供了对结果集的完全控制,允许我们遍历所有行,并据此判断实际返回的行数。重要提示: 每次调用 db.Query() 后,务必通过 defer rows.Close() 来关闭 *sql.Rows 对象,以释放底层数据库连接资源。

精确判断查询结果行数的需求

在许多应用场景中,我们不仅需要获取查询结果,还需要明确知道返回了多少行:

零行: 表示未找到匹配项。单行: 表示精确匹配,这是期望的常见结果。多行: 可能表示数据异常、查询条件不精确或需要进一步处理(例如,只取第一个,或报错)。

QueryRow() 的局限性使得它无法满足“查询后需要知道是零行、单行还是多行”的需求,特别是当多行被视为错误条件时。

通用函数方案:获取首行数据并判断行数

为了解决上述问题,我们可以封装一个通用函数,利用 db.Query() 的灵活性来满足这一需求。这个函数将执行查询,尝试获取第一行数据,并返回一个状态码来指示结果集的行数(零行、单行或多行)。

首先,定义一个枚举类型来表示查询结果的行数状态:

package mainimport (    "database/sql"    "fmt"    _ "github.com/go-sql-driver/mysql" // 导入MySQL驱动,也可替换为Postgres等其他驱动)// RowStatus 定义了查询结果的行数状态type RowStatus intconst (    ZeroRows RowStatus = iota // 未找到任何行    OneRow                    // 找到且仅找到一行    MultipleRows              // 找到多行)// String 方法用于方便地打印 RowStatusfunc (s RowStatus) String() string {    switch s {    case ZeroRows:        return "ZeroRows"    case OneRow:        return "OneRow"    case MultipleRows:        return "MultipleRows"    default:        return "UnknownStatus"    }}

接下来,实现核心的通用查询函数 QueryAndCountRows:

// QueryAndCountRows 执行SQL查询,并确定返回的行数,// 同时将第一行数据扫描到 dest 参数中。//// db: 数据库连接对象。// query: SQL查询字符串。// args: 查询参数。// dest: 可变参数,指针列表,用于接收第一行扫描的数据。//// 返回值:// RowStatus: 指示查询结果的行数状态(ZeroRows, OneRow, MultipleRows)。// error: 如果查询或扫描过程中发生错误。func QueryAndCountRows(db *sql.DB, query string, args []interface{}, dest ...interface{}) (RowStatus, error) {    rows, err := db.Query(query, args...)    if err != nil {        return ZeroRows, fmt.Errorf("执行查询失败: %w", err)    }    defer rows.Close() // 确保无论如何都关闭 rows 资源    // 尝试获取第一行    if !rows.Next() {        // 如果没有下一行,检查是否有迭代错误        if err := rows.Err(); err != nil {            return ZeroRows, fmt.Errorf("遍历第一行时发生错误: %w", err)        }        // 没有错误且没有下一行,表示没有找到任何数据        return ZeroRows, nil    }    // 成功获取到第一行,进行扫描    if err := rows.Scan(dest...); err != nil {        return ZeroRows, fmt.Errorf("扫描第一行数据失败: %w", err)    }    // 检查是否还有第二行,以判断是单行还是多行    if rows.Next() {        // 如果有第二行,则表示有多行数据        return MultipleRows, nil    }    // 如果没有第二行,检查是否有迭代错误    if err := rows.Err(); err != nil {        return ZeroRows, fmt.Errorf("遍历第二行时发生错误: %w", err)    }    // 成功扫描第一行,且没有第二行,表示恰好只有一行数据    return OneRow, nil}

示例用法

假设我们有一个名为 test_users 的表,包含 id (INT), name (VARCHAR), age (INT) 字段。

func main() {    // 1. 初始化数据库连接 (请根据实际情况替换连接字符串)    // 例如,使用 MySQL 驱动    // db, err := sql.Open("mysql", "user:password@tcp(127.0.0.1:3306)/testdb?parseTime=true")    // 这里使用一个模拟的数据库连接,实际应用中应正确初始化    // 为了示例运行,我们假设 db 已经初始化并可用    // 实际应用中需要处理 db 的初始化和错误    db, err := sql.Open("mysql", "root:password@tcp(127.0.0.1:3306)/testdb") // 请替换为你的数据库连接字符串    if err != nil {        fmt.Printf("数据库连接失败: %vn", err)        return    }    defer db.Close()    // 确保数据库连接有效    err = db.Ping()    if err != nil {        fmt.Printf("无法连接到数据库: %vn", err)        return    }    fmt.Println("数据库连接成功。")    // 示例:查询 ID 为 1 的用户    var id int    var name string    var age int    fmt.Println("n--- 查询 ID = 1 的用户 ---")    status, err := QueryAndCountRows(db, "SELECT id, name, age FROM test_users WHERE id = ?", []interface{}{1}, &id, &name, &age)    if err != nil {        fmt.Printf("查询出错: %vn", err)        return    }    switch status {    case ZeroRows:        fmt.Println("未找到 ID 为 1 的用户。")    case OneRow:        fmt.Printf("找到一个用户: ID=%d, Name=%s, Age=%dn", id, name, age)    case MultipleRows:        // 根据业务逻辑,多行可能是一个错误        fmt.Printf("错误: 找到多个 ID 为 1 的用户,期望最多一个。首行数据: ID=%d, Name=%s, Age=%dn", id, name, age)    }    // 示例:查询 ID 不存在的用户 (例如 ID = 999)    fmt.Println("n--- 查询 ID = 999 的用户 ---")    var idNotFound int    var nameNotFound string    var ageNotFound int    statusNotFound, err := QueryAndCountRows(db, "SELECT id, name, age FROM test_users WHERE id = ?", []interface{}{999}, &idNotFound, &nameNotFound, &ageNotFound)    if err != nil {        fmt.Printf("查询出错: %vn", err)        return    }    fmt.Printf("查询结果状态: %sn", statusNotFound)    // 示例:查询年龄大于 25 的所有用户 (可能有多行)    fmt.Println("n--- 查询年龄 > 25 的用户 ---")    var firstId int    var firstName string    var firstAge int    statusMultiple, err := QueryAndCountRows(db, "SELECT id, name, age FROM test_users WHERE age > ?", []interface{}{25}, &firstId, &firstName, &firstAge)    if err != nil {        fmt.Printf("查询出错: %vn", err)        return    }    switch statusMultiple {    case ZeroRows:        fmt.Println("未找到年龄大于 25 的用户。")    case OneRow:        fmt.Printf("找到一个年龄大于 25 的用户: ID=%d, Name=%s, Age=%dn", firstId, firstName, firstAge)    case MultipleRows:        fmt.Printf("找到多个年龄大于 25 的用户。首行数据: ID=%d, Name=%s, Age=%dn", firstId, firstName, firstAge)        // 如果需要处理所有行,则需要重新执行 Query() 并遍历        fmt.Println("提示: 如果需要所有结果,请使用 db.Query() 进行完整迭代。")    }}

注意事项:

数据库驱动: 示例中使用了 github.com/go-sql-driver/mysql,请根据你使用的数据库类型(如 PostgreSQL、SQLite 等)导入相应的驱动。错误处理: 始终检查 db.Query() 和 rows.Scan() 返回的错误。资源释放: defer rows.Close() 是强制性的,用于确保 *sql.Rows 对象被关闭,释放底层连接,防止资源泄露。dest 参数: dest 参数必须是变量的指针,以便 Scan 函数能够修改它们的值。获取所有行: QueryAndCountRows 函数只返回了第一行数据。如果业务逻辑需要处理所有返回的行,那么应该直接使用 db.Query() 并通过 for rows.Next() 循环遍历所有行。

总结与最佳实践

选择合适的查询方法:当明确预期只有一行结果,且不关心是否存在多行的情况时,可以使用 QueryRow()。但请注意其无法区分“无结果”和“多结果但只取第一条”的局限性。当需要精确判断结果集行数(零行、单行、多行),或者需要遍历所有结果时,应使用 Query()。defer rows.Close(): 这是使用 db.Query() 时的黄金法则,确保数据库资源被正确释放。细致的错误处理: 数据库操作涉及网络通信和数据解析,各种错误都可能发生,必须进行全面处理。自定义封装: 对于特定的业务需求,如本文中的“获取首行并判断行数”,封装通用函数可以提高代码的复用性和可读性。性能考量: 如果频繁需要获取总行数,可以考虑在SQL查询中使用 COUNT(*),但这会增加数据库的负担。对于大量数据,或需要缓存的场景,可以结合使用缓存系统(如 Redis、Memcached)来存储行数信息。

通过上述方法,开发者可以更精确、更安全地在Go语言中处理数据库查询结果,满足复杂的业务逻辑对数据行数判断的需求。

以上就是Go database/sql 包查询结果行数精确判断与首行数据获取的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1412049.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
Golang反射实现动态配置管理实践
上一篇 2025年12月16日 05:59:31
如何在Golang中使用sync包实现并发控制
下一篇 2025年12月16日 05:59:41

相关推荐

  • Android开发:按钮点击实现Activity切换教程

    Android开发:按钮点击实现Activity切换教程Android开发:按钮点击实现Activity切换教程Android开发:按钮点击实现Activity切换教程Android开发:按钮点击实现Activity切换教程

    本教程详细讲解了在Android应用中如何通过按钮点击实现不同活动(页面)之间的切换。我们将重点介绍如何利用Intent机制来启动目标Activity,并提供具体的代码示例,帮助开发者快速掌握页面导航的核心方法,提升用户体验。 理解Android Intent机制 在android开发中,inten…

    2026年9月28日 • 用户投稿
    000
  • 天禧携手字节扣子:AI生态再扩容,开发者与用户双向赋能

    天禧携手字节扣子:AI生态再扩容,开发者与用户双向赋能天禧携手字节扣子:AI生态再扩容,开发者与用户双向赋能天禧携手字节扣子:AI生态再扩容,开发者与用户双向赋能天禧携手字节扣子:AI生态再扩容,开发者与用户双向赋能

    9月25日,天禧个人超级智能体正式宣布与字节跳动旗下的ai智能体开发平台“扣子”建立生态合作关系。继chatexcel凭借“对话做表”功能引发广泛关注后,此次携手扣子平台,不仅是天禧在ai能力上的又一次重要拓展,更意味着联想的ai战略已迈入平台整合与生态共建的新阶段,ai生态赋能的核心价值得到显著提…

    2026年9月28日 • 用户投稿
    000
  • 如何实现MySQL底层优化:日志系统的高级配置和性能调优

    如何实现MySQL底层优化:日志系统的高级配置和性能调优如何实现MySQL底层优化:日志系统的高级配置和性能调优如何实现MySQL底层优化:日志系统的高级配置和性能调优如何实现MySQL底层优化:日志系统的高级配置和性能调优

    如何实现MySQL底层优化:日志系统的高级配置和性能调优 摘要:MySQL是一种开源的关系型数据库管理系统,被广泛应用于各种规模的应用程序中。在大数据量和高并发的场景下,MySQL的性能优化显得尤为重要。本文将重点介绍MySQL底层的日志系统,并提供了一些高级配置和性能调优的具体代码示例,帮助读者更…

    2026年9月28日 • 用户投稿
    000
  • 如何用豆包AI生成Python命令行工具

    如何用豆包AI生成Python命令行工具如何用豆包AI生成Python命令行工具如何用豆包AI生成Python命令行工具如何用豆包AI生成Python命令行工具

    明确需求后,用豆包ai生成python命令行工具可节省时间。1. 首先清晰描述功能,如“根据关键词搜索指定目录下的文本文件”;2. 豆包ai会生成完整脚本结构,包括argparse参数解析和文件遍历逻辑;3. 可进一步要求优化,如忽略大小写、支持更多文件类型;4. 进阶可让其生成打包模板,便于pip…

    2026年9月28日 • 用户投稿
    000
  • sublime怎么设置默认语法高亮_Sublime为不同文件类型设置默认语法

    sublime怎么设置默认语法高亮_Sublime为不同文件类型设置默认语法sublime怎么设置默认语法高亮_Sublime为不同文件类型设置默认语法sublime怎么设置默认语法高亮_Sublime为不同文件类型设置默认语法sublime怎么设置默认语法高亮_Sublime为不同文件类型设置默认语法

    可通过点击右下角语法名称并选择“Open all with current extension as…”为相同扩展名文件设置默认高亮;2. 编辑Preferences.sublime-settings用户配置添加extensions映射可实现全局绑定,如将.myjs关联至JavaScri…

    2026年9月28日 • 用户投稿
    000
  • PS5Pro强劲表现!《生化9》与《虚实万象》均稳60帧

    PS5Pro强劲表现!《生化9》与《虚实万象》均稳60帧PS5Pro强劲表现!《生化9》与《虚实万象》均稳60帧PS5Pro强劲表现!《生化9》与《虚实万象》均稳60帧PS5Pro强劲表现!《生化9》与《虚实万象》均稳60帧

    在2025年德国科隆举行的gamescom游戏展上,技术分析权威团队digital foundry(df)亲临现场,试玩了多款即将推出的大作。其中,capcom旗下两款备受关注的新作——《生化危机:安魂曲》与《虚实万象》——在ps5 pro开发机上的表现尤为亮眼。 据DF成员约翰·林尼曼(John …

    2026年9月28日 • 用户投稿
    100
  • 使用 JavaScript 验证后调用 Servlet 的正确方法

    使用 JavaScript 验证后调用 Servlet 的正确方法使用 JavaScript 验证后调用 Servlet 的正确方法使用 JavaScript 验证后调用 Servlet 的正确方法使用 JavaScript 验证后调用 Servlet 的正确方法

    本文档旨在指导开发者如何在 JavaScript 验证客户端输入后,正确地调用 Servlet 来处理表单数据。我们将重点关注如何避免常见的 HTTP 405 错误,并提供清晰的代码示例和最佳实践,确保数据安全可靠地传输到服务器。 在 Web 开发中,客户端验证通常用于在数据提交到服务器之前检查其有…

    2026年9月28日 • 用户投稿
    100
  • 如何通过容器化技术提升应用部署效率?

    如何通过容器化技术提升应用部署效率?如何通过容器化技术提升应用部署效率?如何通过容器化技术提升应用部署效率?如何通过容器化技术提升应用部署效率?

    容器化技术通过打包应用及所有依赖,实现环境一致性,彻底解决“在我机器上能跑”的问题。Docker将应用封装为独立镜像,在任何服务器上都能可靠运行;Kubernetes则通过声明式配置实现自动化部署、扩缩容和自愈,极大提升效率与可靠性。实践中需避免镜像过大、网络配置复杂、持久化存储处理不当、资源限制缺…

    2026年9月28日 • 用户投稿
    000
  • 如何实现MySQL底层优化:查询优化器的工作原理及调优方法

    如何实现MySQL底层优化:查询优化器的工作原理及调优方法如何实现MySQL底层优化:查询优化器的工作原理及调优方法如何实现MySQL底层优化:查询优化器的工作原理及调优方法如何实现MySQL底层优化:查询优化器的工作原理及调优方法

    如何实现MySQL底层优化:查询优化器的工作原理及调优方法 在数据库应用中,查询优化是提高数据库性能的重要手段之一。MySQL作为一种常用的关系型数据库管理系统,其查询优化器的工作原理及调优方法十分重要。本文将介绍MySQL查询优化器的工作原理,并提供一些具体的代码示例。 一、MySQL查询优化器的…

    2026年9月28日 • 用户投稿
    000
  • win8资源管理器停止工作_Win8资源管理器故障修复

    win8资源管理器停止工作_Win8资源管理器故障修复win8资源管理器停止工作_Win8资源管理器故障修复win8资源管理器停止工作_Win8资源管理器故障修复win8资源管理器停止工作_Win8资源管理器故障修复

    首先重启Windows资源管理器进程,若无效则通过SFC和DISM命令修复系统文件,接着更新显卡驱动,禁用第三方外壳扩展,并修改注册表启用独立进程运行文件夹窗口,以解决资源管理器无响应或频繁崩溃问题。 如果您在使用Windows 8系统时,遇到资源管理器无响应或频繁崩溃的情况,这将导致桌面和任务栏消…

    2026年9月28日 • 用户投稿
    100
  • 1999元 小米Sound2 Max蓝牙音箱发布:支持双芯无线组网

    1999元 小米Sound2 Max蓝牙音箱发布:支持双芯无线组网1999元 小米Sound2 Max蓝牙音箱发布:支持双芯无线组网1999元 小米Sound2 Max蓝牙音箱发布:支持双芯无线组网1999元 小米Sound2 Max蓝牙音箱发布:支持双芯无线组网

    9月25日,在雷军2025年度演讲暨小米新品发布会上,小米正式推出sound 2 max蓝牙音箱,售价定为1999元。 该音箱采用经典的包豪斯设计语言,整体机身呈现纯净白色,外观简约大气,结构上运用一体式压铸工艺打造,坚固且富有现代美感。用户还可根据喜好更换三种不同材质的磁吸面板,实现个性化搭配。 …

    2026年9月28日 • 用户投稿
    100
  • Android应用开发:使用Intent实现页面跳转

    Android应用开发:使用Intent实现页面跳转Android应用开发:使用Intent实现页面跳转Android应用开发:使用Intent实现页面跳转Android应用开发:使用Intent实现页面跳转

    本文将介绍如何在Android应用中实现页面之间的跳转。通过使用Intent,我们可以轻松地从一个Activity切换到另一个Activity。本文将提供示例代码和详细步骤,帮助你理解Intent的基本用法,并掌握在按钮点击事件中启动新Activity的方法。 在Android应用开发中,页面跳转是…

    2026年9月28日 • 用户投稿
    000
  • 格子达论文查重怎么操作_格子达官方检测系统指南

    格子达论文查重怎么操作_格子达官方检测系统指南格子达论文查重怎么操作_格子达官方检测系统指南格子达论文查重怎么操作_格子达官方检测系统指南格子达论文查重怎么操作_格子达官方检测系统指南

    首先登录格子达官网注册账号并登录,接着在个人中心上传符合格式的论文文件,填写必要信息后提交检测,最后等待系统生成报告并下载查看总相似比、AI占比等数据,结合标注内容进行修改。 格子达论文查重怎么操作?这是不少网友都关注的,接下来由PHP小编为大家带来格子达官方检测系统指南,感兴趣的网友一起随小编来瞧…

    2026年9月28日 • 用户投稿
    000
  • Android 应用中页面(Activity)间导航的实现指南

    Android 应用中页面(Activity)间导航的实现指南Android 应用中页面(Activity)间导航的实现指南Android 应用中页面(Activity)间导航的实现指南Android 应用中页面(Activity)间导航的实现指南

    本文详细介绍了在 Android 应用中如何通过按钮实现不同页面(Activity)之间的切换。核心机制是使用 Intent 对象来指定目标 Activity,并通过 startActivity() 方法启动它。文章提供了 MainActivity.java 中的示例代码,并强调了 AndroidM…

    2026年9月28日 • 用户投稿
    000
  • 按W弹出工作区怎么办?Win10专业版按W弹出工作区解决方法

    按W弹出工作区怎么办?Win10专业版按W弹出工作区解决方法按W弹出工作区怎么办?Win10专业版按W弹出工作区解决方法按W弹出工作区怎么办?Win10专业版按W弹出工作区解决方法按W弹出工作区怎么办?Win10专业版按W弹出工作区解决方法

    近期,部分win10用户反馈,有时按下“w”键会出现ink工作区突然弹出的现象。如果你也遇到了这种情况,可以参考以下由小编整理的win10专业版解决按w弹出工作区的方法,问题的解决方案就在里面。 操作步骤如下: 首先,打开计算机,打开运行窗口,输入命令“regedit”,然后点击“确定”按钮; 随后…

    2026年9月28日 • 用户投稿
    100
  • 运维新概念:高效积累之道

    运维新概念:高效积累之道运维新概念:高效积累之道运维新概念:高效积累之道运维新概念:高效积累之道

    当前技术更新日新月异,各类语言、工具和理念层出不穷,令人应接不暇。唯有持续学习、不断吸收新知,方能紧跟发展潮流,不被时代淘汰。 1、 IT部门面临诸多挑战 2、 目前,IT部门整体尚未获得充分认可。尽管信息化在各单位日益重要,仍有部分管理者将其视为单纯的成本支出部门,认为其只消耗资源而无法直接创收,…

    2026年9月28日 • 用户投稿
    100
  • 如何下载豆包AI应用 豆包AI应用下载与安装步骤解析

    如何下载豆包AI应用 豆包AI应用下载与安装步骤解析如何下载豆包AI应用 豆包AI应用下载与安装步骤解析如何下载豆包AI应用 豆包AI应用下载与安装步骤解析如何下载豆包AI应用 豆包AI应用下载与安装步骤解析

    豆包ai应用下载安装方法有三种: 一、手机应用商店搜索“豆包”或“Doubao”,确认开发者为“北京字节跳动科技有限公司”后点击安装; 二、直接使用“豆包AI网页版在线使用入口☜☜☜☜直接进入”; 三、注意常见问题如无法找到应用时检查关键词、安装失败时查看存储和系统版本、iOS用户提示“未受信任的企…

    2026年9月28日 • 用户投稿
    000
  • sublime prettier插件配置_Prettier代码格式化插件配置指南

    sublime prettier插件配置_Prettier代码格式化插件配置指南sublime prettier插件配置_Prettier代码格式化插件配置指南sublime prettier插件配置_Prettier代码格式化插件配置指南sublime prettier插件配置_Prettier代码格式化插件配置指南

    首先安装JsPrettier插件并配置prettier_cli_path和node_path路径,设置format_on_save_enabled为true以实现保存时自动格式化,确保prettier_options与项目规则一致,推荐在项目中本地安装Prettier并通过快捷键Ctrl+Alt+F…

    2026年9月28日 • 用户投稿
    000
  • 格子达论文检测入口在哪里—格子达学位论文查重入口

    格子达论文检测入口在哪里—格子达学位论文查重入口格子达论文检测入口在哪里—格子达学位论文查重入口格子达论文检测入口在哪里—格子达学位论文查重入口格子达论文检测入口在哪里—格子达学位论文查重入口

    格子达论文查重入口在www.gezida.com,用户注册后可上传Word或PDF文件进行检测,系统采用语义分析算法,比对广泛学术资源,支持分段查重,生成带来源标注的PDF报告,界面简洁并提供实时进度与在线客服。 格子达论文检测入口在哪里—格子达学位论文查重入口,这是不少学生在撰写毕业论文时都关注的…

    2026年9月28日 • 用户投稿
    000
  • 玩家请愿《往日不再2》签名近24万 索尼续作决策引争议!

    玩家请愿《往日不再2》签名近24万 索尼续作决策引争议!玩家请愿《往日不再2》签名近24万 索尼续作决策引争议!玩家请愿《往日不再2》签名近24万 索尼续作决策引争议!玩家请愿《往日不再2》签名近24万 索尼续作决策引争议!

    《往日不再》被广泛视为索尼旗下最具潜力却遭冷遇的ip之一,近期因续作迟迟未现再度引发玩家热议。这款原本规划为三部曲的开放世界游戏,因索尼对项目缺乏支持而止步于首作,甚至连开发团队bend studio都因顾虑被拒,未曾正式提交续作提案。 与此同时,Bend Studio曾被指派开发一款实时服务型游戏…

    2026年9月28日 • 用户投稿
    000

发表回复

登录后才能评论
关注微信