news 2026/10/21 21:54:05

GitHub Copilot 在 IntelliJ IDEA 和 PyCharm 中的实战指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
GitHub Copilot 在 IntelliJ IDEA 和 PyCharm 中的实战指南

GitHub Copilot 发布那年我就开始用了,当时还是 VS Code 专属插件,公司里一大票 IntelliJ IDEA 用户只能眼巴巴看着。现在官方插件已经原生支持 IntelliJ IDEA 和 PyCharm,Java、Kotlin、Python 开发者不用换编辑器,就能在主力 IDE 里直接享受 AI 辅助编程。这篇文章不打算复述官方文档,而是把这段日子积累的实际体验完整讲一遍:从插件安装、账号授权,到补全触发、注释驱动开发,再到写测试和重构,最后附上我在实操里踩过的坑和排查记录。适合三类人:已经装了 Copilot 但感觉用不顺手的人,想看这订阅费到底值不值的人,以及想在团队里推动 AI 辅助开发的负责人。

1. 先摸清底细:Copilot 到 IDEA 和 PyCharm 里到底改变了什么

1.1 它和传统补全不是同一个物种

JetBrains 自带的代码补全,本质是基于类型推断和符号表的检索。你敲一个变量名,它把可能的方法、字段列出来,你从中挑一个,这是“从已知代码库里找零件”。Copilot 做的事情完全不同:它根据当前文件的上下文、注释、函数签名,甚至项目里相关代码的风格,去预测你接下来最可能写的整段代码。它给的不是一个方法名,而是一段完整实现,甚至是一个带异常处理的函数体。

举一个最简单的例子。在 PyCharm 里你新建一个 Python 文件,写下函数名def read_csv(path):然后回车换行,传统补全只会给你一个pass占位符。而 Copilot 会基于函数名和上下文,直接推测你要用csv模块、打开文件、处理编码、把每行转成字典,然后返回列表。当然,推测未必总是对的,但它确实把“写代码”这件事的门槛从“逐字符敲击”变成了“判断与取舍”。

这种差异带来的实际影响是:在写 CRUD、DTO、配置解析、测试断言这类模式化代码时,Copilot 的产出速度比我手写快一大截。但在逻辑复杂、业务规则密集的代码里,它的输出往往只是“看起来合理”,审查成本反而更高。想清楚这一点,才知道什么时候该依赖它,什么时候该自己盯紧。

1.2 原生支持 JetBrains 插件体系的价值

IntelliJ IDEA 和 PyCharm 是很多团队的主力 IDE。以前想用 Copilot,要么切到 VS Code,要么在网页端复制粘贴代码,体验非常割裂。原生插件支持意味着 AI 补全可以直接读取当前项目上下文,包括打开的文件、最近编辑过的代码、项目里的语言框架,甚至能感知到光标位置附近的结构。

我个人的感知是,原生集成的另一个隐含优势是“留在原工作流里”。调试断点、版本控制、重构工具、测试运行这些习惯不需要改变,Copilot 只是在你原来的 IDE 体验上新加了一层能力。对比之下,切到别的编辑器去用 AI 功能,看起来只是换了个工具,实际上丢掉的是项目索引、插件生态和肌肉记忆。

这里也解释一下 JetBrains 插件体系的运行逻辑:它基于 IDE 的插件开发框架打包分发,通过官方插件市场自动匹配 IDE 版本。所以只要在 Marketplace 里搜到、安装、重启,就能获得和 VS Code 端基本对等的核心能力。对普通用户来说,这比手动下载安装包要省心得多,也是我推荐优先走内置市场的原因。

1.3 哪些人适合用,哪些人先别冲

先说适合的:写样板代码多的开发者收益最明显。后端接口、数据库映射、测试断言、脚本工具,这些场景重复度高、模式固定,Copilot 的生成结果往往直接可用。其次是写新项目脚手架的人,它能根据你文件的 import 风格和命名习惯,把初始代码铺得比较规整。还有不熟悉某语言语法的人,比如平时写 Java、临时要写一个 Python 脚本,Copilot 能把你从“查语法”的泥潭里拉出来。

不太适合的:对生成代码没有判断力的人。如果你不了解这段代码的业务逻辑,纯靠 AI 生成就敢上线,那迟早要出问题。Copilot 的定位是“高级参考实现”,不是“免检产品”。团队里如果有合规要求高的模块,建议先走内部代码审查流程,再考虑要不要启用 AI 辅助。

我个人的判断标准很简单:AI 生成的代码,我至少要能讲清楚它每一行在干什么。讲不清楚就自己重写。这种心态下,Copilot 是生产力工具;反过来用,它就是技术债加速器。

2. 从安装到授权:把 Copilot 接进 IDE 的完整路径

2.1 环境准备:版本检查与账号开通

动手之前先确认三件事:IDE 版本、GitHub 账号、订阅状态。Copilot 是订阅服务,官方提供免费档和付费档,付费档功能更完整,个人和团队用哪种,取决于你对请求次数和附加功能的需求。建议先用免费档体验,确认价值后再升级。

IDE 版本方面,我踩过一个旧版本兼容性的坑:在某个较老的 IDEA 版本上装插件,装完没有任何提示,控制台还报了一堆不兼容接口的错。后来升级到近两年的版本,问题直接消失。所以如果你用的是比较老的版本,别急着甩锅给插件,先升级 IDE。JetBrains 产品线更新节奏快,插件也会跟着适配,长期不升级的 IDE 很容易遇到“装上但不可用”的尴尬。

网络环境这里多说一句:Copilot 的补全请求需要把当前编辑上下文发送到 GitHub 的服务器,这意味着你得保证本机能够正常访问 GitHub 服务。如果你所在团队有企业代理或者内网限制,先让网络管理员把相关域名加入白名单,否则登录授权和补全请求都会莫名其妙地超时。

2.2 安装插件:内置市场的正确姿势

推荐路径是走 IDE 内置插件市场。打开设置界面,Windows 和 Linux 是File -> Settings,macOS 是IntelliJ IDEA -> Preferences或者对应 IDE 的偏好设置入口。进入Plugins,切换到Marketplace页签,搜索栏输入GitHub Copilot,找到官方插件,点击Install。装完按提示重启 IDE,插件就生效了。

为什么不推荐手动下载 zip?因为内置市场会自动匹配当前 IDE 版本对应的插件版本,省去版本不兼容的麻烦。手动安装通常只适用于完全离线的环境,或者企业内网有自己的插件仓库。如果你想手动安装,可以去 JetBrains 插件市场页面下载 zip 包,然后在Plugins页面点齿轮图标,选择Install Plugin from Disk。这个路径我试过一次,能用,但每次更新都要重复一遍,很麻烦,适合特殊场景,不适合日常。

另外提一下,插件市场里搜索的时候要注意甄别。官方插件的发布方是GitHub,名字就叫GitHub Copilot,不要装到名字相似但来历不明的第三方插件,那些大概率是蹭热度的,指不定会做些什么。

2.3 登录授权:Device Code 流程实操

插件装好、IDE 重启后,右下角或者工具窗口区域会出现一个新的 Copilot 图标。点击它,会提示Sign in to GitHub。接下来的流程是设备码授权:弹窗里会显示一串代码,类似ABCD-1234,你需要去浏览器打开github.com/login/device,登录你的 GitHub 账号,然后输入这串代码,确认授权。

这里有几个容易卡住的点。第一,设备码有有效期,如果你打开网页磨蹭太久,码过期了就要重新生成,别在上面死磕。第二,如果 IDE 弹出来的浏览器窗口一直转圈,建议直接把设备码复制下来,用系统默认浏览器打开页面手动输入,成功率更高。第三,企业内部网络有代理时,授权流程可能走不完,这时候先排查代理设置,别反复点重试。

授权完成后,IDE 会自动完成 token 交换,工具窗口会显示当前登录账号。到这里,核心接入工作就结束了。后续注意一点:如果某个版本升级后你发现 Copilot 又变成未登录状态,这是已知的缓存失效现象,重新走一次授权流程即可,不用太紧张。

2.4 安装后的快速验证方法

装完别急着开始写大项目,先用一个临时文件验证是否生效。新建一个空白文件,随便写一个函数名加括号,比如def fetch_user_data():,换行后等一两秒,如果看到灰色文字建议,按Tab接受,说明链路已经通了。

如果没看到灰色文字,先别慌,有几个常规排查姿势。确认 IDE 窗口右下角显示的账号状态是已登录;确认当前文件类型是 Copilot 支持的语言;确认光标位置上下文足够明确,比如函数没有体、注释写得含糊,都可能不触发建议。此时可以按强制触发快捷键(后面会细说),看看补全是否出现。如果强制触发也没反应,大概率是插件安装问题,回头检查版本和日志。

3. 核心功能实测:补全、注释驱动与对话式编程

3.1 灰色补全的触发、接受与切换

Copilot 在 JetBrains 里的交互方式,核心是“灰色文字”。当光标停在某个位置,它觉得你可能要写什么,就会用灰色文字显示一段建议。这个时候:

  • 按Tab接受全部建议;
  • 按Esc取消这次建议;
  • 按Alt+](macOS 是Option+])看下一个建议;
  • 按Alt+[(macOS 是Option+[)看上一个建议;
  • 手动强制触发建议:Alt+\(macOS 是Option+\)。

这套交互看起来简单,但上手后要养成习惯:不是每次建议都值得接受。我见过的很多新手,看到灰字就下意识按 Tab,结果代码风格被带偏,或者引入了根本不需要的依赖。正确的做法是瞄一眼建议内容,判断它是否符合函数签名、是否有额外 import、是否有隐藏副作用,再决定接受还是 Esc。

另一个细节是,随着你继续打字,灰色建议会实时更新。也就是说,你可以先故意写错一部分,让 Copilot 有机会给出更贴合意图的建议。这个“边写边逼它修正”的交互,比等它一次给全更可靠。

3.2 注释驱动开发:把意图写清楚再说

你可能听说过“注释驱动开发”这个说法,实际用起来确实是最出效果的姿势。传统方式是先写方法签名,再补实现;Copilot 的模式是:先写清楚“要什么”,它生成“怎么实现”。

我常用的写法是,在函数体内部先写一句注释,描述这个函数必须做的事,然后让 Copilot 顺着注释和签名去生成实现。举个例子,在 IDEA 里写一个 Java 配置加载器:

import java.io.IOException; import java.io.InputStream; import java.nio.file.Files; import java.nio.file.Path; import java.util.Properties; public class ConfigLoader { // 读取配置文件 config.properties,返回 Properties 对象,文件不存在时返回空对象 public Properties loadConfig(Path path) { try (InputStream is = Files.newInputStream(path)) { Properties props = new Properties(); props.load(is); return props; } catch (IOException e) { return new Properties(); } } }

这个实现里有几个细节值得注意:Files.newInputStream而不是new FileInputStream,try-with-resources自动关闭流,异常时返回空Properties而不是让异常向上抛。如果是我手写,这些细节也会考虑,但 Copilot 的优势在于它“看”过的代码模式足够多,能把这些约定俗成的写法在一瞬间组合出来。对我这种写了几年 Java 的人,它是加速器;对刚入门的人,它就是免费的代码风格范本。

不过注释只解决“意图表达”,解决不了“意图错误”。如果注释本身就写含糊了,生成结果也会含糊。我的经验是:注释里要写清楚输入、输出、边界条件,比如“文件不存在时返回空对象”“按订单金额降序排列”“超过 100 条记录则分页返回”。描述越具体,生成结果越可用。

3.3 Copilot Chat:解释、测试与修复

除了行内补全,Chat 功能是另一个重头戏。在 JetBrains 生态里,Chat 通常集成在 Copilot 的工具窗口中,你可以在对话框里提问,也可以选中一段代码后让它解释或修改。对老项目来说,最实用的三个场景是解释代码、生成测试、修复报错。

解释代码:接手一个没人维护的模块,选中一段逻辑复杂的方法,右键选择解释或者直接拖进对话框,让它逐段讲清楚这段代码在干什么。虽然它的解释偶尔会漏掉项目特定的业务约定,但整体上能极大缩短读代码的时间。

生成测试:对函数右键选择生成测试,它会根据函数签名和实现,生成一组包含边界情况的测试用例。我在 PyCharm 里用它给一个日期处理函数生成过 pytest 测试,连2024-02-29这种闰年边界都覆盖到了。生成的测试未必完全符合你的断言风格,但它提供了一个很好的起点,省去从零编写测试脚手架的时间。

修复报错:当 IDE 报错信息不够直观时,把报错代码和错误信息贴进去,让它给出修改建议。这个场景下我建议把建议当作“第二意见”,而不是直接接受。因为它看不到整个项目的上下文,有时会提供一个局部正确但全局错误的重构方案。

3.4 快捷键速查与自定义配置

用熟快捷键,体验差距很大。我把常用的整理成一张表,方便对照设置:

操作Windows / LinuxmacOS
接受建议TabTab
拒绝当前建议EscEsc
查看下一个建议Alt+]Option+]
查看上一个建议Alt+[Option+[
强制触发建议Alt+\Option+\
打开 Copilot 工具窗口点击侧边栏图标或快捷键同左

配置方面,进入 IDE 设置里的Tools -> GitHub Copilot,有几个选项值得关注。自动补全可以开关,如果你不喜欢持续弹出的灰字,完全可以关掉自动建议,改成手动触发模式。这对性能敏感、或者不想被打断的开发者很友好。另一个常用配置是针对本地文件、模板文件、生成代码目录设置排除规则,避免 Copilot 在这些文件上频繁出建议,干扰阅读。

最后提醒一句:快捷键是可以改的。如果你觉得Alt+\和系统快捷键冲突,在 IDE 的Keymap设置里搜索Copilot就能找到对应绑定,改成自己顺手的组合。我见过有人因为默认快捷键和输入法切换冲突,差点放弃这个工具,改完键位后体验立刻提升。

4. 一个 PyCharm 案例:从注释到 CSV 报表脚本的完整生成

4.1 需求与初始代码

光讲原理不如看一次完整过程。这里用一个模拟项目来演示:假设我需要写一个 Python 脚本,读取销售数据sales.csv,按月份汇总销售额,输出月度报表。CSV 的格式大概是:

month,amount,region 2025-01-15,1200.50,华东 2025-01-22,800.00,华北 2025-02-03,950.00,华南

我在 PyCharm 里新建一个sales_report.py,先手写主干的函数签名和注释,把意图交代清楚:

import csv from collections import defaultdict def read_sales(path: str) -> list[dict]: """读取CSV文件,每一行转成一个字典,跳过空行。""" pass def monthly_report(records: list[dict]) -> dict[str, float]: """按月份统计销售额,month字段格式为'2025-01-15',取前7个字符作为键。""" pass def main(): records = read_sales('sales.csv') report = monthly_report(records) for month in sorted(report.keys()): print(f"{month}: {report[month]:.2f}") if __name__ == '__main__': main()

这个文件写到这里,函数体全是空的。接下来就是 Copilot 发挥的时候。

4.2 看 Copilot 如何补齐每个函数

我把光标停在第一个函数的注释后面,回车,灰色建议立刻出现。它给出的实现和我想的基本一致:

def read_sales(path: str) -> list[dict]: """读取CSV文件,每一行转成一个字典,跳过空行。""" records = [] with open(path, encoding='utf-8', newline='') as f: reader = csv.DictReader(f) for row in reader: if row: records.append(row) return records

里面有两个细节值得夸一下:显式指定了encoding='utf-8',避免 Windows 环境下中文乱码;加了newline='',这是 Python 官方文档推荐处理 CSV 文件的写法,能避免 Excel 生成的 CSV 出现多余空行。这两个点很多初学者会漏,Copilot 能直接补上,说明它的训练数据里这类常见坑覆盖得比较全。

第二个函数的补全同样平滑:

def monthly_report(records: list[dict]) -> dict[str, float]: """按月份统计销售额,month字段格式为'2025-01-15',取前7个字符作为键。""" result = defaultdict(float) for row in records: month = row['month'][:7] result[month] += float(row['amount']) return dict(result)

注意这里用defaultdict(float)来初始化,省去了判断 key 是否存在的分支。如果你在手写,十有八九会写if month not in result: result[month] = 0然后再累加。两种写法都对,但 Copilot 的选择更加简洁。这也是我强调审查价值的原因——你可以从它的输出里学到更精炼的表达。

整个流程走下来,我只需要做两件事:把意图写进注释,按 Tab 接受合理建议。全程没有碰过 Stack Overflow,也没翻文档。对一个用 Python 频率不高的 Java 开发者来说,这种体验在以前是难以想象的。

4.3 测试生成与代码审查

脚本能跑通只是第一步。在生产实践里,没测试的脚本早晚出问题。我选中monthly_report函数,右键调用 Chat 相关的测试生成功能,它给了我一个 pytest 测试文件,我在这里展示核心思路:

import pytest from sales_report import monthly_report def test_monthly_report_groups_by_month(): records = [ {"month": "2025-01-15", "amount": "100.00"}, {"month": "2025-01-22", "amount": "200.00"}, {"month": "2025-02-03", "amount": "300.00"}, ] result = monthly_report(records) assert result == {"2025-01": 300.0, "2025-02": 300.0}

这个测试断言了核心的分组和累加逻辑,用临时字典数据避免了文件 IO 依赖,干净、可读。虽然正式项目里我还会补充空列表、非法金额这类边界用例,但作为生成的起点已经足够扎实。

到这里,一个从空文件到可运行脚本再到单元测试的完整工作流就闭环了。我的体验是:AI 编程工具最理想的应用场景,就是这种“需求明确、实现模式化、测试壳子”的工作。它把脑力劳动中大量低价值的部分分担掉了,让开发者把精力投入到真正需要判断力的地方。

5. 常见问题排查实录与避坑心得

5.1 没有灰色补全,先按这个顺序排查

“插件装了、登录了、但就是不弹建议”是我见过最多的问题。按下面的顺序排查,绝大多数情况能解决:

  • 确认当前文件类型是 Copilot 支持的语言,冷门 DSL 和纯文本文件不触发;
  • 按下强制触发键Alt+\,如果还是没有,继续往下查;
  • 打开设置里的Tools -> GitHub Copilot,确认账号状态是已登录;
  • 查看 IDE 底部日志,搜索copilot关键字,看有没有明显的报错信息;
  • 重启 IDE 并等待索引完成,大型项目的首次索引阶段可能不触发补全。

如果以上都不行,考虑 IDE 版本兼容性。某公司内网环境里见过一整批旧版本 IDEA 都装不上插件的情况,统一升级后问题全部消失。

5.2 登录授权卡住怎么办

授权卡住大多发生在设备码流程。常见表现:点击登录后浏览器一直打不开、设备码页面报错、IDE 转圈半天没有反应。我的处理经验是先复制设备码,用系统浏览器手动打开授权页面,确认输入后不要关闭页面,等待 IDE 自动跳转。这一步如果还是卡住,大概率是网络环境对 GitHub 服务的访问不稳定,或企业代理干预了连接。

另一个人人都可能遇到的情况:IDE 版本升级后重新要求登录。这是插件缓存失效导致的,不是账号出问题。重新走一次授权流程,两分钟内就能恢复。如果某次更新后频繁掉线,建议去官方插件页面确认你用的 IDE 版本是否在支持列表里,老版本配合新插件确实容易出现状态丢失。

5.3 补全结果总是跑偏,问题多半在上下文

很多人抱怨 Copilot 补全质量差,我调试过之后发现,大部分时候问题出在上下文不足,而不是工具不行。所谓上下文,包括文件头部的 import、函数名是否具体、注释是否清楚、同文件里是否有风格一致的代码示例。

举个例子,函数名写getData,补全会给你一个极其笼统的实现;改成getMonthlyRevenueData,配合注释“按月统计销售额并按月份排序”,输出立刻精准很多。另一个常见的上下文问题是:文件太大,前面的代码把模型注意力带偏了。解决办法是缩小当前文件范围,或者把当前写的函数尽量自包含,减少对遥远代码的依赖。

还有一个小技巧:如果你觉得 Copilot 没有正确理解需求,可以先手动写出函数调用的预期输出示例,放在注释里。例如写“输入2025-01-15,输出2025-01”,这种示例往往能显著纠正生成方向。

5.4 性能与资源占用控制

JetBrains 系列 IDE 本身就是资源大户,加了 Copilot 插件后,会额外产生一个常驻进程,用于处理补全请求和模型交互。在大型项目初次索引时,CPU 占用可能明显上升。如果你电脑配置不高,或者项目特别大,建议做两件事:在设置里关闭自动补全,改为手动触发;把不需要参与补全的目录(比如build、target、生成代码目录)加入排除列表。

不用 Copilot 的时候,也可以通过工具窗口直接暂停或禁用它,需要时再打开。这样既保留了功能,又不让常驻进程在你专注阅读代码时刷存在感。经过配置后,插件对日常开发的干扰可以降到很低。

5.5 团队协作与代码安全的注意点

最后说一个容易被忽略的问题:数据安全。Copilot 的补全机制需要把当前文件的上下文发送到 GitHub 服务器,换来的是更准确的生成结果。这意味着,如果你的代码里包含密钥、内部 IP、客户敏感信息,这些内容会随请求一起发出去。虽然服务方有自己的数据处理和隐私保护机制,但作为开发者,不该赌这个风险。

建议很明确:不要把敏感配置写在注释里,也不要在包含明文密钥的目录里开着自动补全。企业场景下,管理员有相应的策略开关,可以限制代码片段回传或关闭某些团队成员的补全功能,团队负责人应检查并落实这些设置。

我在实际使用中的体会是:Copilot 真正改变的不只是打字速度,而是把注意力从“怎么写”转移到了“判断写得对不对”。在 IDEA 和 PyCharm 里用熟之后,我已经很少打开别的编辑器专门做 AI 补全了。最后分享两个小习惯:一是给每个函数写清晰的 docstring,你会收获质量翻倍的补全建议;二是接受任何一段建议前,一定通读一遍,确认没有多余依赖和隐藏副作用。如果你刚开始切换,建议先用小项目练手,别一上来就在老项目里全量开启自动补全,那种被打断的节奏感需要适应期。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/21 21:54:01

RAG架构中的向量引擎:原理、实战与调优

提一个有意思的现象:最近不少做视频生成、多模态项目的朋友都在聊,为什么像 Sora2、Veo3 这类顶流模型,对外讲的都是生成能力多强,对内却在偷偷铺一条完全不同的技术线——向量引擎。我自己前阵子帮某个跨平台系统做知识库升级时也…

作者头像 李华
网站建设 2026/10/21 21:51:30

jQuery progressbar进度条插件:实现原理与实战避坑指南

简介:这是一份 jQuery progressbar 插件的可用示例资源,面向需要为文件上传、后台处理或页面加载流程补充实时进度反馈的前端开发者。压缩包内共 9 个文件,以 HTML 演示页面、jQuery 脚本、PNG/GIF 效果截图以及 txt/url 说明文档为主&#x…

作者头像 李华
网站建设 2026/10/21 21:51:03

Qt GraphicsView鼠标绘制矩形:坐标换算与橡皮筋交互

简介:这是一个基于QT 5.15.2与VS2019环境编写的C示例工程,核心利用QGraphicsView与QPainter实现鼠标矩形绘制,并将交互逻辑封装为QGraphicsRectItem。工程面向需要快速掌握图形视图框架与鼠标事件处理的Qt界面开发者,尤其适合刚接…

作者头像 李华
网站建设 2026/10/21 21:50:57

基于YOLOv8的车牌识别系统实战:从数据到部署全流程解析

前一阵帮某高校的A同学把“基于深度学习YOLOv8的智能车牌识别系统设计”从头到尾跑通了一遍,从需求分析、数据准备、模型训练到界面打包,整整折腾了两周。做完之后不少人来问:这套东西到底怎么落地?报告怎么写?答辩PPT…

作者头像 李华
网站建设 2026/10/21 21:50:13

知识管理插件实践:从信息捕获到自动化输出

做知识管理这几年,一个很深的体会是:工具越多,越容易把"收集"当成"掌握"。书签攒了几百条,稍后读从来没读完,笔记软件里躺着大量剪藏,真要输出一份报告时却连一个能直接引用的段落都翻…

作者头像 李华
网站建设 2026/10/21 21:50:08

轻量地图打点与整理工具开发:GeoJSON数据模型与前端实践

前阵子整理手机里的地图收藏夹,发现一个尴尬的事实:我收藏了两百多个地点,但真正要用的时候一个也想不起来。它们分散在不同地图应用、聊天记录和截图里,分类只有“想去”和“收藏”两种状态,至于“为什么想去”“和谁…

作者头像 李华