solidity基础数据类型(很常用)

字符串类型

涉及英语

string 字符串

unicode 编码

关键字: string

字符串是UTF-8编码的字节序列,因此它们可以包含任何UTF-8字符。string类型在Solidity中是动态大小的,这意味着它们可以存储任意长度的字符串,但这也意味着处理字符串通常比处理固定大小的数据类型更昂贵,特别是在需要存储到Ethereum区块链上时。

使用方式

声明和初始化字符串变量的基本语法如下: 基本上和大多数语言一样 

了解字符串基本声明方式

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract My {
    string a = "hello";

    string b = "word";

    string c = unicode"哈喽 哈哈";
}

字符串操作

Solidity本身对字符串的内置操作非常有限

比如字符串拼接,下表总结了不同编程语言中字符串拼接的常用方法:

语言

拼接方法

Python

+''.join([str1, str2])

JavaScript

+或 模板字符串${str1}${str2}

Java

+StringBuilder.append()

C#

+String.Concat(str1, str2)

Ruby

+"#{str1}#{str2}"

Swift

+或 字符串插值\()

Go

+fmt.Sprintf

Kotlin

+或 字符串模板$

solidity

使用abi.encodePacked(str1, str2)bytes类型操作,新版可以使用string.concat

可以例如,最简单的字符串操作,将 2 个字符串合并,在Solidity 中都没办法直接通过+号合并,甚至你都不能直接获取字符串的长度。

如果需要进行这些操作,通常需要将字符串转换为bytes类型,或者在合约外部处理字符串逻辑。

实现,获取字符串长度,以及,字符串拼接, 字符串对比

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract My {
    string a = "hello";

    string b = "word";

    string c = unicode"哈喽 哈哈";

    string d = "hello";

    // 字符串拼接
    function name() public view returns (string memory) {
        return string(abi.encodePacked(a, " ", b));
    }

    // /获取字符串长度
    function length() public view  returns (uint256) {
        return bytes(c).length;
    }

    //字符串对比
    function isEq() public view  returns (bool){
        
        return keccak256(abi.encodePacked(a)) == keccak256(abi.encodePacked(d)) ;
    }
}

由于字符串是动态大小的数据类型,处理它们(比如拼接、切片或比较)通常比处理固定大小的数据类型更复杂和更昂贵。

例如: 字符串拼接需要创建一个新的动态数组来存储结果,这个过程涉及到内存分配和多次复制操作,每一步都会消耗gas。

通过以上例子可见在寸土寸金的以太坊网络,处理字符串是多么昂贵

优化建议

  • 对于复杂的字符串操作,考虑在应用层(比如使用JavaScript、Python等)而不是在智能合约中处理。
  • 对于不需要永久存储在区块链上的数据,使用memorycalldata类型来减少存储成本。
  • 在Ethereum智能合约中处理字符串可能会消耗较多的gas,特别是当字符串作为函数参数或者需要在区块链上存储时。

总的来说,虽然字符串操作在Solidity中是可行的,但应该谨慎使用,以避免不必要的高成本。

PS: string 并不是值类型, 他是属于数组后面数组哪里我们也会在讲、

放在这里讲,是为了认识 solidity 与其他语言的区别, 方便更好的学习

注意事项
●在Ethereum智能合约中处理字符串可能会消耗较多的gas,特别是当字符串作为函数参数或者需要在区块链上存储时。
●Solidity中的字符串是不可变的,这意味着一旦字符串被创建,你就不能修改它的内容。如果需要修改字符串,通常的做法是创建一个新的字符串变量。
●对于复杂的字符串操作,考虑在应用层(比如使用JavaScript、Python等)而不是在智能合约中处理。
通过了解这些基本概念和限制,你可以更有效地在Solidity合约中使用字符串类型。

布尔类型

涉及英语

bool 布尔

true 真

false 假

关键字: bool , 可能的取值为常数值 true 和 false。

支持的运算符,

    • ! (逻辑非)
    • && (逻辑与, "and")
    • || (逻辑或, "or")
    • == (等于)
    • != (不等于)

运算符 || 和 && 都遵循同样的短路( short-circuiting )规则。

就是说在表达式 f(x) || g(y) 中, 如果 f(x) 的值为 true , 那么 g(y) 就不会被执行,即使会出现一些副作用。

布尔类型&#

  • 18
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值