服务端2月24日 10:34
Zustand 与 Redux 相比有哪些优缺点?### Zustand 的核心优势
**极简 API,告别样板代码**
Zustand 创建 store 只需一个函数调用,无需定义 action types、reducers、action creators。与 Redux Toolkit 的 createSlice 相比,代码量减少 60% 以上:
```js
// Zustand — 一个函数搞定 store
import { create } from 'zustand'
const useStore = create((set) => ({
count: 0,
increment: () => set((stat...服务端2月24日 10:33
Zustand 中的 set 函数有几种使用方式?Zustand 的 set 函数有三种使用方式,面试中需要完整回答。
### 1. 对象式更新——直接传入新状态
```javascript
const useStore = create((set) => ({
count: 0,
reset: () => set({ count: 0 })
}));
```
适用于更新不依赖当前状态值的场景,写法简洁。set 会将传入的对象与当前状态**浅合并**,未提及的字段保持不变。
### 2. 函数式更新——基于当前状态计算新值
```javascript
const useStore = create((set) => (...服务端3月1日 22:30
Solidity 智能合约中如何实现访问控制?有哪些最佳实践?访问控制是 Solidity 智能合约安全的第一道防线。据统计,2025 年上半年因访问控制漏洞造成的损失超过 16 亿美元,位居 OWASP Web3 安全威胁榜首。面试中,访问控制是高频考点,面试官通常从 Ownable 入手,逐步追问到 RBAC、多签和时间锁的组合方案。
### 一、Ownable 模式:最基础的访问控制
Ownable 是最简单的访问控制方式——合约只有一个 owner,只有 owner 能执行特定函数。
```solidity
contract Ownable {
address public owner;
event Ownershi...服务端3月1日 22:26
Solidity 智能合约中如何实现重入攻击防护?重入攻击(Reentrancy Attack)是以太坊智能合约中危害最大的安全漏洞之一。截至 2026 年,因重入攻击造成的损失已超过 5.62 亿美元,仅 2025 年 GMX V1 Perps 就因此损失 4200 万美元,Arcadia V2 同年也遭重入攻击。理解重入攻击的原理和防护手段,是每一个 Solidity 开发者的必修课。
### 重入攻击的本质
重入攻击的核心在于:合约在更新内部状态之前调用了外部合约,攻击者利用这个时间窗口递归回调目标函数,在状态被修正前重复执行提款逻辑。
```solidity
// 存在漏洞的合约
contract VulnerableBa...服务端3月1日 23:18
Solidity 中 require、assert、revert 和自定义错误有什么区别?错误处理是智能合约安全的第一道防线。Solidity 提供了 require、assert、revert 三种内置机制,从 0.8.4 起又引入了自定义错误(Custom Error),在 Gas 效率和错误信息可读性上做了大幅改进。理解它们的区别和适用场景,是写好合约的基本功。
## 核心结论:四种机制怎么选?
| 机制 | 用途 | Gas 退还 | 错误信息 | 适用场景 |
|------|------|----------|----------|----------|
| require | 输入验证、外部条件 | 退还剩余 | 字符串 | 检查函数参数、返回值 |
| a...服务端2月24日 23:43
GORM 如何连接不同的数据库?GORM 是 Go 语言中最流行的 ORM 框架,官方支持 MySQL、PostgreSQL、SQLite、SQL Server 四种数据库,社区还提供了 ClickHouse、TiDB 等驱动。不同数据库的连接方式各有差异,掌握正确的连接姿势和配置方法,是生产环境稳定运行的基础。
## 连接 MySQL
MySQL 是 GORM 中使用最广泛的数据库,连接时需要指定 DSN(Data Source Name)字符串。
### 基本连接
```go
import (
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
dsn := "...服务端3月1日 20:09
DNS 缓存是如何工作的?TTL 怎么设置才合理?DNS 缓存是域名解析系统的核心加速机制——每次浏览器访问一个域名,背后可能经历多级缓存的命中或穿透。理解 DNS 缓存的工作原理和 TTL 配置策略,是后端和网络面试中的高频考点。
## DNS 缓存的工作原理
当你在浏览器输入一个域名时,解析请求不会每次都从根域名服务器开始逐级查询。DNS 系统在多个层级设置了缓存,尽可能复用之前的查询结果:
1. **浏览器缓存**:Chrome 等浏览器会在进程内维护 DNS 缓存, chrome://net-internals/#dns 可以查看。默认缓存时间约 1-5 分钟,部分浏览器会根据 TTL 自行调整
2. **操作系统缓存**...服务端2月24日 23:45
GORM 中如何处理错误?GORM 的所有数据库操作都可能返回错误,正确处理这些错误是写出健壮 Go 应用的基本功。GORM 的错误处理方式和普通 Go 代码略有不同——因为它采用了链式调用 API,错误不会直接从方法返回,而是存储在 `*gorm.DB` 的 `Error` 字段中。
## 错误处理基础
### 检查 db.Error
GORM 在执行 Finisher 方法(`Create`、`First`、`Find`、`Update`、`Delete` 等)后会将错误写入 `db.Error`。检查方式有两种:
```go
// 方式一:直接调用 .Error
if err := db.Creat...服务端2月24日 23:42
GORM 中有哪些性能优化技巧?GORM 是 Go 生态中使用最广泛的 ORM,但在高并发、大数据量场景下,默认配置往往会成为瓶颈。以下从查询、批量操作、连接管理、事务控制等维度,梳理实际项目中必须掌握的性能优化手段。
## 查询优化
### 选择特定字段
默认 `Find` 会查询所有列,当表字段多、数据量大时,传输和解析开销不可忽视。用 `Select` 只取需要的列:
```go
// 不推荐
var users []User
db.Find(&users)
// 推荐:只查需要的字段
var users []User
db.Select("id", "name", "email").Find(&use...服务端2月24日 23:39
GORM 中如何使用事务?GORM 中的事务机制是保证数据库操作原子性和一致性的核心能力。面试中常围绕手动事务与自动事务的区别、嵌套事务的实现原理、隔离级别的选择策略展开追问。
## GORM 的事务模式有哪些?
GORM 提供三种事务使用方式,适用场景各不相同:
### 自动事务(默认行为)
GORM 默认将单个 Create/Update/Delete 操作包裹在事务中执行,确保单条写入的原子性:
```go
// GORM 内部自动开启事务,执行完毕后自动提交
db.Create(&user)
db.Save(&user)
db.Delete(&user)
```
如果业务不需要这个默认行为,可...