如何判断以太坊地址类型?
如何判断以太坊地址类型?
一、账户类型解释
2.1 以太坊外部账户(Externally Owned Account,EOA)
外部账户(EOA)是由私钥控制的账户,在以太坊网络中用来发送交易和执行其他操作。EOA 不是智能合约,它没有合约代码,只能用于发送交易(例如转账以太币)。其主要特点是:
- 没有合约代码:外部账户没有部署智能合约的代码。
- 拥有私钥:外部账户由用户的私钥控制,只有拥有该私钥的人才能签署交易。
- 交易类型:EOA 发起的交易仅限于转账以太币或调用合约。
外部账户的特征:
- 账户的地址通常是
0x
开头的 40 个十六进制字符。 - 它不会有与之相关联的合约代码。
2.2 以太坊合约地址(Contract Account)
合约地址是由智能合约创建的账户,它由合约的代码控制。智能合约是部署在以太坊网络上的可编程代码,可以接受交易、存储数据、执行逻辑等。合约地址的主要特点是:
- 拥有合约代码:合约地址包含了可执行的合约代码,它允许外部地址调用合约的函数。
- 由合约代码控制:合约地址不能直接由私钥控制,它由智能合约的代码决定。
- 交易类型:合约地址通过调用合约函数来执行操作,而不仅仅是进行转账。智能合约可以接收来自外部账户的交易并做出响应。
合约地址的特征:
- 也以
0x
开头,并且长度为 40 个十六进制字符。 - 它会与特定的智能合约代码相关联。
关于以太坊账户的详细解读,可以查看:以太坊账户详解
二、地址判断
2.1 判断方法
- 检查地址的代码是否存在
在以太坊中,合约地址是有部署在区块链上的智能合约代码的,而普通地址(外部账户)没有代码。
步骤:
- 使用
eth_getCode
RPC 调用来检查一个地址的代码。如果返回的是0x
,表示该地址是一个外部账户(普通地址)。如果返回的是非空的代码,表示该地址是一个合约地址。
curl https://eth.com/ \-X POST \-H "Content-Type: application/json" \--data '{"method":"eth_getCode","params":["0xdac17f958d2ee523a2206206994597c13d831ec7","latest"],"id":1,"jsonrpc":"2.0"}'
例如,若返回 "0x"
,则说明该地址是一个普通地址。如果返回一个非零的代码(例如:0x606060405260043610610196576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806306fdde031461019b5780630753c30c14610229578063095ea7b3146102625780630e136b191),表示这是一个合约地址。
- 使用 Etherscan 等区块链浏览器
如果你有地址的相关信息,可以通过访问区块链浏览器(如 Etherscan)查看该地址是否被标记为合约地址。Etherscan 会显示“合约”标签,指示该地址是智能合约地址。
- 通过交易历史
- 普通地址通常只会执行简单的交易(例如转账以太币)。
- 合约地址会有部署合约或调用合约函数的交易记录。如果通过交易记录可以看到该地址与智能合约的交互(如调用
transfer
、mint
等合约函数),则可以确定该地址是合约地址。
- 检查地址的活动
合约地址通常会有复杂的交易活动,如调用函数、创建交易等。而普通地址只是参与普通的转账交易,通常没有其他的复杂行为。可以通过查看该地址的交易历史来做一个大致的判断。
通过这些方法,你可以有效地判断一个以太坊地址是普通地址还是合约地址。
2.2 代码示例
我们将使用第一种检查地址的代码是否存在的方法进行判断,并且使用golang的方法进行测试,以下是我们的代码示例
代码示例
package mainimport ("context""encoding/hex""fmt""github.com/ethereum/go-ethereum/common""github.com/ethereum/go-ethereum/ethclient""log"
)func main() {// 连接到以太坊节点client, err := ethclient.Dial("https://rpc.ankr.com/eth")if err != nil {log.Fatalf("Failed to connect to the Ethereum client: %v", err)}// 需要检查的以太坊地址address := common.HexToAddress("0xdac17f958d2ee523a2206206994597c13d831ec7")// 调用 eth_getCode 来检查地址是否是合约地址code, err := client.CodeAt(context.Background(), address, nil) // 第二个参数为 nil,表示查询最新的状态if err != nil {log.Fatalf("Failed to get code at address: %v", err)}// 将字节码转换为十六进制字符串,并以 '0x' 开头codeHex := "0x" + hex.EncodeToString(code)fmt.Println("code is:", codeHex)// 如果返回的代码为空,说明是普通地址;如果有代码,说明是合约地址if len(code) == 0 {fmt.Println("The address is a regular wallet address (EOA).")} else {fmt.Println("The address is a smart contract address.")}
}
2.3 拓展:数据库中查询
通常,我们可能需要从数据库中获取地址,然后并发判断地址类型,以下是我们的golang代码示例
package mainimport ("context""database/sql""fmt""log""sync""github.com/ethereum/go-ethereum/common""github.com/ethereum/go-ethereum/ethclient"_ "github.com/go-sql-driver/mysql"
)// 检查地址是否为合约地址的函数
func checkIfContract(client *ethclient.Client, address string, wg *sync.WaitGroup, results chan<- string) {defer wg.Done()// 将地址转换为eth的地址格式ethAddress := common.HexToAddress(address)// 查询地址的代码code, err := client.CodeAt(context.Background(), ethAddress, nil)if err != nil {results <- fmt.Sprintf("Error checking address %s: %v", address, err)return}// 判断代码是否为空if len(code) == 0 {results <- fmt.Sprintf("Address %s is a regular wallet address (EOA).", address)} else {results <- fmt.Sprintf("Address %s is a smart contract address.", address)}
}// 从数据库中获取以太坊地址
func getEthereumAddresses(db *sql.DB) ([]string, error) {var addresses []string// 执行查询(假设表名为 'eth_addresses',列名为 'address')rows, err := db.Query("SELECT address FROM eth_addresses")if err != nil {return nil, fmt.Errorf("failed to execute query: %w", err)}defer rows.Close()// 遍历查询结果并将地址加入到切片中for rows.Next() {var address stringif err := rows.Scan(&address); err != nil {return nil, fmt.Errorf("failed to scan row: %w", err)}addresses = append(addresses, address)}// 检查是否有错误发生if err := rows.Err(); err != nil {return nil, fmt.Errorf("error while iterating rows: %w", err)}return addresses, nil
}func main() {// 连接到MySQL数据库,使用连接池dsn := "username:password@tcp(localhost:3306)/your_database_name"db, err := sql.Open("mysql", dsn)if err != nil {log.Fatalf("Failed to connect to the database: %v", err)}defer db.Close()// 检查数据库连接是否可用if err := db.Ping(); err != nil {log.Fatalf("Failed to ping the database: %v", err)}// 获取所有以太坊地址addresses, err := getEthereumAddresses(db)if err != nil {log.Fatalf("Failed to get Ethereum addresses from database: %v", err)}// 连接到以太坊节点(使用Infura或Geth节点)client, err := ethclient.Dial("https://mainnet.infura.io/v3/YOUR_INFURA_PROJECT_ID")if err != nil {log.Fatalf("Failed to connect to the Ethereum client: %v", err)}// 并发查询每个地址var wg sync.WaitGroupresults := make(chan string, len(addresses)) // 设置一个缓冲 channel 来存储结果// 启动多个 goroutine 并发查询for _, address := range addresses {wg.Add(1)go checkIfContract(client, address, &wg, results)}// 等待所有查询完成wg.Wait()close(results)// 打印所有结果for result := range results {fmt.Println(result)}
}
以上代码的优化点;
主要优化点:
- 数据库连接池使用:通过
sql.Open
创建数据库连接并使用连接池(db.Ping()
用于确保数据库连接可用)。不需要每次查询时都打开新连接。 - 错误处理改进:通过
fmt.Errorf
包装错误信息,使其更具可读性,并提供详细的上下文。 sync.WaitGroup
和chan
并发控制:这些部分没有变化,但确保 goroutines 的执行是并发的且高效的。- 日志:改进了错误日志,提供更清晰的错误上下文。
CodeAt
查询上下文:确保查询时使用context.Background()
,而不是nil
,保持一致性。db.Ping()
:用于检查数据库连接是否正常,防止在查询时出现连接问题。
性能考虑:
- 使用缓冲通道(
results
)来存储查询结果,避免了在多个 goroutine 中频繁地发生阻塞。 sync.WaitGroup
确保所有的并发任务在程序退出之前都已完成。
这种优化方式使得代码更健壮,易于维护,并提高了处理并发任务时的性能。
相关文章:
如何判断以太坊地址类型?
如何判断以太坊地址类型? 一、账户类型解释 2.1 以太坊外部账户(Externally Owned Account,EOA) 外部账户(EOA)是由私钥控制的账户,在以太坊网络中用来发送交易和执行其他操作。EOA 不是智能…...
有限元分析学习——Anasys Workbanch第一阶段笔记(14)静定与超静定问题、约束类型介绍、简支梁挠度求解和自定义材料库建立
目录 0 序言 1 静定与超静定问题 2 Workbranch中Supports介绍 3 简支梁挠度的有限元求解 4 自定义材料库建立 0 序言 静定与超静定问题、约束类型介绍、简支梁挠度求解和自定义材料库建立(内容对应视频22到24课)。 1 静定与超静定问题 在有限元分析中,不同的…...
为医院量身定制做“旧改”| 全视通物联网智慧病房
随着经济工作会议、卫生健康工作会议、“经济高质量发展成效”系列新闻发布会的依次召开,强基工程、三明医改、儿科和精神卫生服务年、中医药传承创新发展、促进生育、养老服务改革、病房改造提升行动...等关键词正成为新的热点,2025年卫生健康工作面临一…...
Java面试专题——面向对象
面向过程和面向对象的区别 面向过程:当事件比较简单的时候,利用面向过程,注重的是事件的具体的步骤/过程,注重的是过程中的具体的行为,以函数为最小单位,考虑怎么做。 面向对象:注重找“参与者…...
PHP异步非阻塞MySQL客户端连接池
文章精选推荐 1 JetBrains Ai assistant 编程工具让你的工作效率翻倍 2 Extra Icons:JetBrains IDE的图标增强神器 3 IDEA插件推荐-SequenceDiagram,自动生成时序图 4 BashSupport Pro 这个ides插件主要是用来干嘛的 ? 5 IDEA必装的插件&…...
【Linux 源码】内核态到用户态
文章目录 1. 由来2. 流程图3. 中断3.1 概念3.2 8259A芯片3.4 中断时的栈处理3.4.1 相同特权级3.4.2 不同特权级 3.5 中断流程3.6 定位中断程序3.7 中断流程步骤总结 4. 源码4.1 move_to_user_mode4.2 0号进程4.3 TSS和LDT在GDT表排布4.4 ldt中的0x17栈段 5. 总结 1. 由来 首…...
goland map学习-实践使用练习:判断存在及遍历
对于数据: type Person struct {Address stringAge intJob stringName string }type People map[string]Personvar per People{"1": Person{Address: "1",Age: 1,Job: "1",Name: "1",},"2&quo…...
【威联通】FTP服务提示:服务器回应不可路由的地址。被动模式失败。
FTP服务器提示:服务器回应不可路由的地址。被动模式失败。 问题原因网络结构安全管理配置服务器配置网关 问题 FTP服务器提示:服务器回应不可路由的地址…...
两份PDF文档,如何比对差异,快速定位不同之处?
PDF文档比对是通过专门的工具或软件,自动检测两个PDF文件之间的差异,并以可视化的方式展示出来。这些差异可能包括文本内容的修改、图像的变化、表格数据的调整、格式的改变等。比对工具通常会标记出新增、删除或修改的部分,帮助用户快速定位…...
Vue.js 组件之间的通信模式
Vue.js 组件之间的通信模式 组件之间的通信模式 在 Vue.js 中,组件之间的通信是构建复杂应用的关键。根据组件之间的关系和需求,Vue 提供了多种通信方式。本文介绍了常见的通信模式及其详细示例。 一、父子组件通信 1. 父组件向子组件传递数据&#…...
【Linux 重装】Ubuntu 启动盘 U盘无法被识别,如何处理?
背景 U盘烧录了 Ubuntu 系统作为启动盘,再次插入电脑后无法被识别 解决方案(Mac 适用) (1)查找 USB,(2)格式化(1)在 terminal 中通过 diskutil list 查看是…...
.Net Core微服务入门全纪录(四)——Ocelot-API网关(上)
系列文章目录 1、.Net Core微服务入门系列(一)——项目搭建 2、.Net Core微服务入门全纪录(二)——Consul-服务注册与发现(上) 3、.Net Core微服务入门全纪录(三)——Consul-服务注…...
pyautogui自动化鼠标键盘操作
pyautogui,用来写自动化脚本,比按键精灵更方便。pyautogui.position()可以获取当前鼠标位置。pyautogui不支持中文输入,利用 pyperclip从剪切板粘贴输入。 # -*- coding: utf-8 -*- import time import os import traceback import logging …...
2024年AI大模型技术年度总结与应用实战:创新与突破并进
前言 回顾2024年,我一共发布了286篇博文,粉丝数也达到了43000多。这一年里,我收获颇丰,始终坚持AI大模型的研究方向,并且积极开展大模型的实战应用,也取得了一系列令人振奋的突破。 在286篇博文中&#…...
HTML中相对路径和绝对路径详解
文章目录 HTML中相对路径和绝对路径详解一、引言二、绝对路径1、定义2、使用场景3、代码示例 三、相对路径1、定义2、使用方法3、代码示例 四、使用示例1、图片路径2、CSS和JavaScript文件路径3、页面内部链接 五、总结 HTML中相对路径和绝对路径详解 一、引言 在HTML开发中&a…...
联通用户管理系统(一)
#联通用户管理系统(一) 1.新建项目 如果你是windows的话,界面应该是如下的: 2.创建app python manage.py startapp app01一般情况下:我们是在pycharm的终端中运行上述指令,但是pychrm中为我们提供了工具…...
STM32-CAN总线
1.CAN总线简介 CAN总线是由BOSCH公司开发的一种简洁易用、传输速度快、易扩展、可靠性高的串行通信总线 2.CAN总线特征 两根通信线(CAN_H、CAN_L),线路少,无需共地差分信号通信(相对的是单端信号)&#…...
mac m1下载maven安装并配置环境变量
下载地址:Download Apache Maven – Maven 解压到一个没有中文和空格的文件夹 输入pwd查看安装路径 输入cd返回根目录再输入 code .zshrc 若显示 command not found: code你可以通过以下步骤来安装和配置 code 命令: 1. 确保你已经安装了 Visual Studio…...
Linux -- HTTP 请求 与 响应 报文
目录 请求报文: 请求方法 响应报文: 状态码 与 状态码描述 共性 常见的报头 请求报文: 请求方法 方法说明GET获取资源POST传输实体主体PUT传输文件HEAD获得报文首部DELETE删除文件OPTIONS询问支持的方法TRACE追踪路径CONNECT要求用…...
oneplus3t-lineage-14编译-android7
lineageOS-14.1-oneplus3t-build.md lineageOS-14(android7)的开发者模式/usb调试(adb)有root功能, 而lineageOS-16(android9)无 oneplus3t-lineage-14编译-android7 1 清华linageos镜像 x lineage-14.1-20180223-nightly-oneplus3-signed.zip ntfs分区挂载为普通用户目录…...
Spring Boot与Spring的区别
在当今的Java开发领域,Spring框架无疑是最为重要且广泛应用的框架之一。而随着技术的不断发展和开发者对效率与便捷性的追求,基于Spring框架的Spring Boot应运而生。接下来,将详细阐述Spring Boot与Spring的主要区别,并通过实际的…...
阿九的python 爬虫进阶课18.3 学习笔记
文章目录 前言1. 爬取大标题2. 爬取小标题3. 证券栏下的标题4. 某篇文章里的具体内容 前言 网课链接:https://www.bilibili.com/video/BV1kV4y1576b/新浪财经网址:https://finance.sina.com.cn/需先下载库: conda install lxml布置爬取的一…...
对人型机器人的研究和展望
目录 概述 1 核心软硬件部件 1.1 运动控制部分 1.1.1 减速机 1.1.2 编码器 1.1.3 直流无刷电机 1.2 智能仿生手 1.3 控制板卡 2 人型机器人的应用 3 未来展望 概述 如果现在有人问:当前那个行业最火?毫无疑问答案肯定是人型机器人了。当前各类机…...
docker 使用远程镜像启动一个容器
使用前提: 首先你得安装docker,其次你得拥有一个远程镜像 docker run --name io_11281009 --rm -it -p 2233:22 -v .:/root/py -e ed25519_rootAAAAC3NzaC1lZDI1********Oy7zR7l7aUniR2rul ghcr.lizzie.fun/fj0r/io srv对上述命令解释: 1.docker run:…...
VTK知识学习(37)-频域处理
1、前言 在图像处理和分析中,经常会将图像从图像空间转换到其他空间中,并利用这些空间的性质对转换后的数据进行分析处理。图像频域处理借助空间变换将图像从图像空间转换到频域空间,根据频域空间的性质对数据进行处理(如滤波),最…...
什么是软件架构
什么是软件架构 程序员说,软件架构是要决定编写哪些C程序或OO类、使用哪些库和框架 程序经理说,软件架构就是模块的划分和接口的定义 系统分析员说,软件架构就是为业务领域对象的关系建模 配置管理员说,软件架构就是开发出来的…...
RoCE网络及其协议栈详解(没有中间商赚差价的网络)
引言 随着数据中心对高性能、低延迟通信需求的不断增长,传统的TCP/IP以太网连接已经难以满足现代应用的要求。为了解决这些问题,RDMA(Remote Direct Memory Access)技术应运而生。RDMA是一种允许网络中的不同计算机直接访问对方内…...
el-dialog弹窗的@open方法中,第一次引用ref发现undefined问题,第二次后面又正常了
解决方法 直接不用这个open方法,转而用opened,代码例子: <el-dialog title"单个新增" :visible.sync"PlacardShowSingle" opened"openpbSingle()" width"1100px" top"1%" :close-on-c…...
基于阿里云视觉智能平台实现换脸程序
简介 阿里云视觉智能平台提供了一种强大的换脸功能,能够将视频中的人脸替换成其他图片中的脸。这种功能广泛应用于视频编辑、特效制作等领域。本文将介绍如何使用阿里云视觉智能平台进行视频换脸。 核心工作流程 整个换脸程序的实现可分为以下几个主要步骤&#…...
【2024年华为OD机试】(A卷,100分)- 完美走位 (Java JS PythonC/C++)
一、问题描述 题目解析 题目描述 在第一人称射击游戏中,玩家通过键盘的 A、S、D、W 四个按键控制游戏人物分别向左、向后、向右、向前进行移动。假设玩家每按动一次键盘,游戏人物会向某个方向移动一步。如果玩家在操作一定次数的键盘并且各个方向的步数相同时,此时游戏人…...
一文夯实垃圾收集的理论基础
如何判断一个引用是否存活 引用计数法 给对象中添加一个引用计数器,每当有一个地方引用它,计数器就加 1;当引用失效,计数器就减 1;任何时候计数器为 0 的对象就是不可能再被使用的。 优点:可即刻回收垃圾&a…...
jenkins-api操作
一. 简述: 在一个比较复杂的环境中, 往往会有自己开发的运维管理平台。在代码发布这块,尽管jenkins有一个比较方便的UI, 但很多团队还是喜欢集中式管理, 将发布功能(仅仅把jenkins作为一个发布组件使用)嵌入运维管理平…...
SpringBoot3+Vue3学习
什么是Spring Boot? Spring Boot 是Spring 提供的一个子项目,用于快速构建Spring应用程序 传统方式弊端:之前的项目都用Spring FrameWork构建,需要手动引入依赖,依赖之间有可能存在冲突,较为麻烦;在配置…...
SQL刷题快速入门(三)
其他章节: SQL刷题快速入门(一) SQL刷题快速入门(二) 承接前两个章节,本系列第三章节主要讲SQL中where和having的作用和区别、 GROUP BY和ORDER BY作用和区别、表与表之间的连接操作(重点&…...
Flutter鸿蒙化中的Plugin
Flutter鸿蒙化中的Plugin 前言鸿蒙项目内PluginFlutter端实现鸿蒙端实现创建Plugin的插件类注册Plugin 开发纯Dart的package为现有插件项目添加ohos平台支持创建插件配置插件编写插件内容 参考资料 前言 大家知道Flutter和鸿蒙通信方式和Flutter和其他平台通信方式都是一样的&…...
Ubuntu 22.04.5 修改IP
Ubuntu22.04.5使用的是netplan管理网络,因此需要在文件夹/etc/netplan下的01-network-manager-all.yaml中修改,需要权限,使用sudo vim或者其他编辑器,修改后的内容如下: # Let NetworkManager manage all devices on …...
后端:MyBatis
文章目录 1. MyBatis1-1. Mybatis 工具类的封装1-2. Mybatis 通过集合或实体类传递参数-实现插入数据(增)1-3. MyBatis 实现删除数据(删)1-4. MyBatis 实现修改数据(改)1-5. MyBatis 实现查询数据(查) 2. MyBatis 配置文件中的一些标签和属性2-1.environments标签2-2. dataSour…...
CBAM-2018学习笔记
名称: Convolutional Block Attention Module (CBAM) 来源: CBAM: Convolutional Block Attention Module 相关工作: #ResNet #GoogleNet #ResNeXt #Network-engineering #Attention-mechanism 创新点: 贡献: 提…...
HTML根元素<html>的语言属性lang:<html lang=“en“>
诸神缄默不语-个人CSDN博文目录 在编写HTML页面时,通常会看到<html lang"en">这行代码,特别是在网页的开头部分,就在<!DOCTYPE html>后面。许多开发者可能对这个属性的含义不太了解,它到底有什么作用&…...
解决github无法clone的问题
问题背景 (base) ~$ git clone https://github.com/isaac-sim/IsaacLab.git 正克隆到 IsaacLab... fatal: 无法访问 https://github.com/isaac-sim/IsaacLab.git/:gnutls_handshake() failed: Error in the pull function.解决办法 我使用了代理,需要配…...
第1章:Python TDD基础与乘法功能测试
写在前面 这本书是我们老板推荐过的,我在《价值心法》的推荐书单里也看到了它。用了一段时间 Cursor 软件后,我突然思考,对于测试开发工程师来说,什么才更有价值呢?如何让 AI 工具更好地辅助自己写代码,或许…...
【华为路由/交换机的ftp文件操作】
华为路由/交换机的ftp文件操作 PC:10.0.1.1 R1:10.0.1.254 / 10.0.2.254 FTP:10.0.2.1 S1:无配置 在桌面创建FTP-Huawei文件夹,里面创建config/test.txt。 点击上图中的“启动”按钮。 然后ftp到server,…...
【HBuilderX 中 Git 的使用】
目录: 一:安装必要的版本控制工具二:把Github上的项目克隆到本地三:将本地的项目上传到Github上 一:安装必要的版本控制工具 1️⃣ 安装 TortoiseGit 工具,下载地址:https://tortoisegit.org/do…...
语言模型的价值定位与技术突破:从信息处理到创新认知
标题:语言模型的价值定位与技术突破:从信息处理到创新认知 文章信息摘要: 当前语言模型的核心价值主要体现在信息综合与处理能力上,用户友好的交互界面是其成功关键。在模型计算机制方面,推理能力的实现包括chain-of-…...
使用Websocket进行前后端实时通信
1、引入jar,spring-websocket-starter <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId> </dependency> 2、配置websocket config import org.springframe…...
【Leetcode 热题 100】70. 爬楼梯
问题背景 假设你正在爬楼梯。需要 n n n 阶你才能到达楼顶。 每次你可以爬 1 1 1 或 2 2 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? 数据约束 1 ≤ n ≤ 45 1 \le n \le 45 1≤n≤45 解题过程 昨天刚刚当成扩展题做过,今天遇到了再写一次。…...
STM32更新程序OTA
STM32的OTA(Over-The-Air)更新程序是一种通过无线通信方式,为设备分发新软件、配置甚至更新加密密钥的技术。以下是关于STM32 OTA更新程序的详细介绍: 一、OTA升级流程 STM32的OTA升级流程通常包括以下几个关键步骤:…...
【海贼王航海日志:前端技术探索】一篇文章带你走进JavaScript(三)
目录 1 -> WebAPI背景知识 1.1 -> 什么是WebAPI 1.2 -> 什么是API 1.3 -> 什么是DOM 1.3.1 -> DOM树 2 -> 获取元素 2.1 -> querySelector 2.2 -> querySelectorAll 3 -> 事件初识 3.1 -> 基本概念 3.2 -> 事件三要素 4 -> 操…...
计算机创造的奇迹——C语言
一.简介 C语言是一种较早的程序设计语言,诞生于1972年的贝尔实验室。1972 年,Dennis Ritchie 设计了C语言,它继承了B语言的许多思想,并加入了数据类型的概念及其他特性。 尽管C 语言是与 UNIX 操作系统一起被开发出来的ÿ…...
TypeScript - 利用GPT辅助学习
TypeScript 一、基础1. 安装 TypeScript2. 创建你的第一个 TypeScript 文件3. 编译 TypeScript 代码4. 变量声明与类型注解5. 函数与类型注解6. 总结 二、进阶常用类型1. 类型别名2. 对象类型3. 类型断言4.typeof 操作符 高级类型1. 类2. 交叉类型3. 泛型与 keyof4. 索引签名类…...