面试题答案
一键面试- 创建context:
- 可以使用
context.Background()
创建一个空的上下文,它通常作为所有上下文的根。例如:
ctx := context.Background()
- 若要设置截止时间,可以使用
context.WithTimeout
。例如,设置5秒的超时:
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel()
- 若要创建可取消的上下文,可以使用
context.WithCancel
:
ctx, cancel := context.WithCancel(context.Background()) defer cancel()
- 可以使用
- 传递context到数据库操作函数中:
- 假设我们有一个简单的数据库查询函数,例如使用Go标准库的
database/sql
包:
func queryData(ctx context.Context, db *sql.DB) ([]Row, error) { rows, err := db.QueryContext(ctx, "SELECT * FROM your_table") if err!= nil { return nil, err } defer rows.Close() var results []Row for rows.Next() { var row Row err := rows.Scan(&row.Field1, &row.Field2) if err!= nil { return nil, err } results = append(results, row) } return results, nil }
- 在调用这个函数时,传递之前创建的上下文:
ctx := context.Background() data, err := queryData(ctx, yourDB) if err!= nil { // 处理错误 }
- 假设我们有一个简单的数据库查询函数,例如使用Go标准库的
- 处理可能出现的取消操作:
- 对于使用
context.WithCancel
创建的上下文,在需要取消操作的地方调用cancel
函数。例如:
ctx, cancel := context.WithCancel(context.Background()) go func() { // 一些逻辑判断 if someCondition { cancel() } }() data, err := queryData(ctx, yourDB) if err!= nil { if err == context.Canceled { // 处理取消错误 } else { // 处理其他错误 } }
- 对于
context.WithTimeout
创建的上下文,当超时时间到达时,上下文会自动取消,数据库操作函数(如db.QueryContext
)会返回context.DeadlineExceeded
错误,调用者可以据此处理超时情况:
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() data, err := queryData(ctx, yourDB) if err!= nil { if err == context.DeadlineExceeded { // 处理超时错误 } else { // 处理其他错误 } }
- 对于使用