Memory vs Calldata
- 
memory: Typically used for function parameters and temporary variables within functions. Stored in memory and not persistent on the blockchain.
- 
calldata: Similar to memory, stored in memory and not persistent on the blockchain. The key difference is that calldata variables are immutable and commonly used for function parameters.
Learn more: Data location and assignment behavior
Below, we demonstrate how to write data using both calldata and memory
contract CalldataAndMemory {
    struct Confi {
        uint16 age;
        string name;
        string wish;
    }
    Confi John;
    Confi Jane;
    function writeToJohn(Confi calldata JohnData) external {
        John = JohnData;
    }
    function writeToJane(Confi memory JaneData) external {
        Jane = JaneData;
    }
}
Recommendations for gas optimization:
🌟 In practical situations, if it's possible to use calldata, it is recommended to use calldata instead of memory.