Solidity 入门教程(三):函数 Function 详解 —— 用对函数,写好合约
函数是 Solidity 中的核心组成部分,是合约响应外部调用、实现内部逻辑的“发动机”。掌握函数的定义方法、访问权限、函数类型(view/pure/payable)、继承关键字(virtual/override)对于写出高质量的智能合约至关重要。
一、函数基本结构
function <函数名>([参数]) [可见性] [函数类型] [virtual|override] [修饰符] [returns(返回类型)]
{// 函数体
}
二、可见性(Visibility)
对比示例
contract VisibilityDemo {// 公开函数,用户可以调用function sayHello() public pure returns (string memory) {return "Hello, world!";}// 外部函数,合约外部可调用,内部不能用 this.sayHi()function sayHi() external pure returns (string memory) {return "Hi from external!";}// 内部函数,内部或继承可用function _internalLogic() internal pure returns (string memory) {return "Internal use only";}// 私有函数,仅本合约内使用function _secret() private pure returns (string memory) {return "Private secret";}
}
✅ 实践建议:
-
对外暴露的函数,建议使用
external
,更节省 gas。 -
仅内部复用逻辑用
internal
。 -
private
用于敏感数据校验、合约内部安全操作。
三、函数类型(Function Type)
1. view
—— 读取状态但不修改
用于读取状态变量。不会消耗 gas(如果在 view 环境下调用)
uint public count;function getCount() public view returns (uint) {return count;
}
2. pure
—— 纯函数,不读写状态
只进行纯计算逻辑,无状态依赖。适合数学运算、工具函数。
function add(uint a, uint b) public pure returns (uint) {return a + b;
}
场景:计算利息、数学函数、转换等。
3. payable
—— 可接收 ETH 转账的函数
接收者函数必须标记为 payable
,否则即使用户转账也会失败。
function receiveEther() public payable {}
场景:捐赠合约、充值函数、众筹系统。
四、继承相关:virtual 与 override
Solidity 支持合约继承,允许子合约重写父合约函数。
contract Parent {function greet() public virtual pure returns (string memory) {return "Hi from Parent";}
}contract Child is Parent {function greet() public override pure returns (string memory) {return "Hi from Child";}
}
场景:常用于模板设计、治理逻辑、标准合约改写(如 ERC20、Ownable 等)
五、完整案例:多种函数类型与可见性组合演示
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.21;contract FunctionExample {uint private storedData;// 设置值(写操作)function set(uint x) public {storedData = x;}// 读取值(view)function get() public view returns (uint) {return storedData;}// 纯函数(不访问状态)function multiply(uint a, uint b) public pure returns (uint) {return a * b;}// 可支付函数function deposit() public payable {}// 获取合约余额function balance() public view returns (uint) {return address(this).balance;}// 内部逻辑函数function _double(uint x) internal pure returns (uint) {return x * 2;}// 外部函数function callMe() external pure returns (string memory) {return "You called me!";}// 私有辅助函数function _secret() private pure returns (string memory) {return "Shhh...";}
}