第138篇 solidity 中的初始值

本文详细介绍了Solidity编程语言中变量的初始值,包括值类型和引用类型的默认值,以及如何使用`constant`和`immutable`关键字创建不可变的变量。通过示例合约代码展示了这些概念的实际应用。

1.变量初始值

solidity中,声明但没赋值的变量都有它的初始值或默认值。

1.1 值类型初始值

  • booleanfalse
  • string""
  • int0
  • uint0
  • enum: 枚举中的第一个元素
  • address0x0000000000000000000000000000000000000000 (或 address(0))
  • function
    • internal: 空白方程
    • external: 空白方程

1.2 引用类型初始值

  • 映射mapping: 所有元素都为其默认值的mapping

  • 结构体struct: 所有成员设为其默认值的结构体

<think>我们参考了提供的引用材料,特别是引用[3]中关于Solidity结构体初始化的内容。以下是总结的Solidity结构体初始化方法: 1. **顺序初始化**:按照结构体定义中成员的顺序,直接提供值进行初始化。 ```solidity Kirin kirin001 = Kirin(12, "kirin"); ``` 2. **命名参数初始化**:使用成员名称指定值,可以忽略顺序(但必须初始化所有非mapping成员,且必须忽略mapping成员)。 ```solidity Kirin kirin002 = Kirin({age:18, name:"kirin"}); ``` 3. **注意事项**: - 结构体中如果包含`mapping`类型的成员,在初始化时必须忽略它(如引用[3]所述)。 - 在函数内部,如果要传递结构体参数,函数必须是`internal`类型,且结构体需要标记为`memory`(如引用[3]和[5]所示)。 4. **初始化后的修改**:初始化后,可以通过变量名访问结构体成员并修改(在storage中)。 另外,根据引用[4](虽然是C++例子,但原理类似),嵌套结构体的初始化也是类似的,可以嵌套使用顺序初始化或命名参数初始化。 **示例代码**(基于引用[3]): ```solidity pragma solidity >=0.4.0 <0.6.0; contract User { struct Kirin { uint age; string name; mapping(uint=>string) map; // 初始化时忽略这个mapping } // 只声明而不初始化 Kirin kirin; // 顺序初始化(忽略mapping) Kirin kirin001 = Kirin(12, "kirin"); // 命名参数初始化(忽略mapping) Kirin kirin002 = Kirin({age:18, name:"kirin"}); // 修改结构体成员 function setKirinName(uint id, string memory newName) internal { if (id == 1) { kirin001.name = newName; } else if (id == 2) { kirin002.name = newName; } } } ``` **注意**:在函数中操作结构体时,如果结构体在storage中,修改会直接写入区块链;如果使用memory,则只是临时副本。 §§相关问题§§ 1. Solidity中结构体的mapping成员如何初始化? 2. 如何通过函数返回结构体? 3. 在Solidity中,结构体作为函数参数时为什么必须是internal函数? </think>根据引用内容,Solidity 中结构体的初始化主要有以下三种方式: ### 1. **顺序初始化** 按照结构体定义成员的顺序直接提供值: ```solidity Kirin kirin001 = Kirin(12, "kirin"); // 对应 struct Kirin{ uint age; string name; } [^3] ``` - 必须严格遵循成员定义顺序 - 必须初始化所有**非 mapping 类型**的成员 - 必须忽略 mapping 成员(如引用[3]所述) ### 2. **命名参数初始化** 通过成员名称显式指定值: ```solidity Kirin kirin002 = Kirin({age:18, name:"kirin"}); // 明确指定成员值 [^3] ``` - 可忽略成员顺序 - 同样需要初始化所有非 mapping 成员 - 代码可读性更高 ### 3. **声明后单独初始化** 先声明变量,再单独赋值成员: ```solidity Kirin kirin; // 声明 kirin.age = 12; kirin.name = "kirin"; // 逐个赋值 [^3] ``` ### ️ 重要注意事项 1. **mapping 成员处理** - 初始化时必须忽略 mapping 成员(引用[3]) - mapping 只能在声明后通过单独操作初始化(如 `kirin.map[1] = "value"`) 2. **函数参数限制** - 结构体作为函数参数时,函数必须声明为 `internal` 类型(引用[3][5]) - 需要使用 `memory` 修饰符(引用[5]): ```solidity function test_struct(Kirin memory k) internal { ... } // [^3] ``` 3. **嵌套结构体初始化** - 采用逐层级的花括号嵌套(引用[4]示例): ```solidity Teacher t = Teacher({ id: 100, name: "老王八", stu: Student({name: "小李", score:99}) // 嵌套结构体初始化 }); ``` 4. **storage/memory 转换** - 当 memory 结构体赋值给 storage 变量时: ```solidity function test(student memory s) internal { stu = s; // memory -> storage [^5] } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wonderBlock

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值