Solidity 内存数据位置

Solidity Memory data location

我一直在追随我学习 Solidity 的新旅程。现在我参加了结构 + 数据位置课程,我遇到了一种情况,即我没有使用与讲师完全相同的示例,但两者都有效。我想知道哪一个在技术上更正确。

关于讲师的方式,我理解如果那个数据变量已经存在,充满了数据,并且我们在存储上使用它,那是可以理解的,但对于内存情况,我仍然不不懂它的意思。

这里有两个例子:

我的:

struct PERSON {
        uint256 id;
        string name;

    }

PERSON public personList;

function updateNewPerson(uint256 _index, string memory _name) public {
        PERSON memory newUpdatedPerson;
        newUpdatedPerson.name = _name;
        personList[_index] = newUpdatedPerson;
    }

教师代码:

  struct PERSON {
            uint256 id;
            string name;
    
        }

PERSON public personList;


    function updateNewPerson(uint256 _index, string memory _name) public {
            PERSON memory newUpdatedPerson = personList[index];
            newUpdatedPerson.name = _name;
            personList[_index] = newUpdatedPerson;
        }

这与我要引用的存储数据位置相同:

function updateStoragePerson(uint256 _index, string memory _name) public {
        PERSON storage newUpdatedPerson = personList[_index];
        newUpdatedPerson.name = _name;
}

我想弄清楚那里有什么不同,我想我开始理解它了,如果我错了请纠正我。

所以在我的示例中,我基本上只是传递新用户插入的新值,在本例中是 _name,然后在将它返回给数组时通过索引数组将其传递到它的位置。

在讲师示例中,他传递数组索引案例内容,即 id 和 name,然后从函数中插入新的 name 值,然后再将数据传回数组,在本例中为 id 和_name 相同。

我看到的是,在您的代码中,当您创建一个 newUpdatedPerson 时,您正在创建一个 PERSON 类型的空变量,然后您只用名称填充它,而您的指导员从一个已经存在然后更新其价值的人。这将导致您的 personList 中的 newUpdatedPerson 更新其名称,但其 ID 将变为空。

关于存储数据位置,它所做的是将newUpdatedPerson存储到区块链中,从而产生额外的gas费用。此外,newUpdatedPerson 不会存储到 personList 中,我认为您需要这样做,并且您从 personList[_index] 调用的人不会被更新。

希望此信息对您有所帮助:)

  • 状态变量默认存储(值存储在区块链中)。

  • 函数中的局部变量默认在内存中(值临时存储在内存中)。

  • 结构默认存储(值存储在区块链中)。

我解释了内存和存储类型的不同之处