You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在TON-Solidity智能合约中如何返回mapping类型数据?

TON-Solidity函数能否返回mapping类型?

不能,TON-Solidity不支持函数直接返回mapping类型。

原因说明

mapping是引用类型,在TON的TVM执行模型中,mapping仅存储键到值的索引映射,不会存储完整的键值对列表,函数返回时无法直接序列化全部内容传递给调用方,因此你写的示例语法本身就不被编译器支持。

替代实现方案

  • 方案1:全量返回所有键值对
    你可以额外维护一个存储所有已使用键的数组,需要返回全量数据时遍历数组取出所有对应值,组装为键数组+值数组的结构返回,示例代码如下:
    struct SomeStruct {
        uint256 id;
        string info;
    }
    
    // 合约存储的目标mapping
    mapping(address => SomeStruct) private myMapping;
    // 额外维护的所有键列表
    address[] private allMappingKeys;
    
    function func() public view returns (address[] memory keys, SomeStruct[] memory values) {
        uint256 count = allMappingKeys.length;
        keys = new address[](count);
        values = new SomeStruct[](count);
        for (uint256 i = 0; i < count; i++) {
            keys[i] = allMappingKeys[i];
            values[i] = myMapping[allMappingKeys[i]];
        }
    }
    
    注意:如果mapping数据量较大,全量返回可能会超出单次交易的gas限制,该方案仅适合数据量较小的场景
  • 方案2:单键查询
    如果调用方不需要全量数据,仅需要查询指定键的值,可以直接实现接收键参数的查询函数,单次返回单个值:
    function getStructByAddress(address target) public view returns (SomeStruct memory) {
        return myMapping[target];
    }
    

内容的提问来源于stack exchange,提问作者Nikolai Kushpela

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 04:36:03