Solidity 入门教程(三):函数 Function 详解 —— 用对函数,写好合约

函数是 Solidity 中的核心组成部分,是合约响应外部调用、实现内部逻辑的“发动机”。掌握函数的定义方法、访问权限、函数类型(view/pure/payable)、继承关键字(virtual/override)对于写出高质量的智能合约至关重要。

一、函数基本结构

function <函数名>([参数]) 
    [可见性] 
    [函数类型] 
    [virtual|override] 
    [修饰符] 
    [returns(返回类型)] 
{
    // 函数体
}

二、可见性(Visibility)

Solidity 入门教程(三):函数 Function 详解 —— 用对函数,写好合约_第1张图片对比示例

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 支持合约继承,允许子合约重写父合约函数。

Solidity 入门教程(三):函数 Function 详解 —— 用对函数,写好合约_第2张图片

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...";
    }
}

六、小结:函数使用对照表

Solidity 入门教程(三):函数 Function 详解 —— 用对函数,写好合约_第3张图片

你可能感兴趣的:(Solidity,区块链)