在 Solidity 中,view 是一个函数修饰符 ,用于声明不修改状态变量 的函数。它告诉编译器和调用者:这个函数只读不写,不会消耗 gas(除非在交易中调用)。
✅ view 的核心作用
| 特性 |
说明 |
| 只读 |
不会修改区块链上的任何状态(如变量、余额、事件等)。 |
| 不消耗 gas |
如果通过 call 调用(如 Web3.js、Ethers.js 的 .call()),不消耗 gas。 |
| 可在合约内部调用 |
其他函数可以安全地调用它,不用担心副作用。 |
| 不能修改状态 |
以下操作会报错: • 修改状态变量 • 触发事件 • 创建合约 • 使用 selfdestruct |
✅ 使用示例
pragma solidity ^0.8.0;
contract Example {
uint public number = 42;
// ✅ 正确:只读函数
function getNumber() public view returns (uint) {
return number;
}
// ✅ 正确:使用 view 读取多个变量
function getDouble() public view returns (uint) {
return number * 2;
}
// ❌ 错误:试图修改状态,编译失败
function setNumber(uint _n) public view {
number = _n; // Error: Function declared as view
}
}
✅ 什么时候用 view
| 场景 |
示例 |
| 获取变量值 |
balanceOf(address) |
| 计算结果 |
getPrice() |
| 验证条件 |
isValidUser(address) |
| 返回数组/结构体 |
getUserInfo(address) |
✅ 对比其他修饰符
| 修饰符 |
是否修改状态 |
是否消耗 gas |
用途 |
view |
❌ 不修改 |
❌ 不消耗(除非在交易中) |
只读 |
pure |
❌ 不读也不写 |
❌ 不消耗 |
纯计算 |
payable |
✅ 可接收 ETH |
✅ 消耗 gas |
转账 |
✅ 总结一句话
如果你的函数只是读取数据 ,就用 view;如果连数据都不读 ,只是计算,就用 pure。