Solidity面试题更新 2026-08-05

在 Solidity 中,函数可见性修饰符包含哪些?请说明它们各自的访问控制范围以及主要差异。

技术原理Solidity

考察说明

考查对 Solidity 函数可见性修饰符及其适用场景的理解。

回答思路

  1. 【回答框架 1】Solidity 中函数可见性分为四种:public、private、internal 和 external。public 函数既可在合约内部调用,也可通过外部交易或消息调用,并会自动生成 getter 函数(适用于状态变量)。private 函数仅限当前合约内部调用,子合约无法访问。internal 函数可在当前合约及继承合约中调用,但不对外部可见。external 函数只能从合约外部调用,但可以通过 this 关键字在内部调用。
  2. 【回答框架 2】区别在于:public 和 external 的外部调用方式不同,public 支持内部和外部调用,而 external 仅支持外部调用(内部需用 this)。从 gas 角度看,external 函数在接收大型数组等参数时更省 gas,因为它直接引用 calldata,而 public 会拷贝到 memory。private 是最严格的限制,internal 适合供派生合约复用的内部逻辑。
  3. 【回答框架 3】选择依据:对外提供接口用 public 或 external,若考虑 gas 优化且参数较大用 external;内部逻辑复用用 internal,仅当前合约使用用 private。实际开发中,public 是最常用的,但应避免滥用 private,以防过于封闭不利于模块化。
  4. 【关键点 1】四种可见性:public、private、internal、external。
  5. 【关键点 2】public 可内外部调用,自动生成 getter;private 仅限本合约。
  6. 【关键点 3】internal 可被继承合约访问,external 仅外部调用且更省 gas。
  7. 【易错点 1】混淆 private 与 internal 的继承可见性。
  8. 【易错点 2】误以为 external 函数不能用于内部调用,实际可通过 this 调用。
  9. 【易错点 3】忽视 public 状态变量自动生成 getter 的默认行为。