MST

星途 面试题库

面试题:Go不定参数在复杂业务场景下的边界控制

假设你正在开发一个微服务,该微服务接收不定数量的用户ID(字符串类型)作为参数,每个用户ID对应一个用户操作记录。要求在处理这些用户ID时,首先检查传入的用户ID数量不能超过100个,同时,每个用户ID的长度必须在6到18个字符之间。如果满足边界条件,就将这些用户ID对应的操作记录从数据库中取出并返回;如果不满足,返回相应的错误信息。请用Go语言实现这个功能,并简要说明如何进行错误处理以保证系统的健壮性。
36.5万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
package main

import (
    "database/sql"
    "fmt"
    "log"

    _ "github.com/go-sql-driver/mysql" // 这里以mysql为例,实际根据所用数据库替换
)

// 获取用户操作记录
func GetUserOperationRecords(db *sql.DB, userIDs []string) ([]string, error) {
    if len(userIDs) > 100 {
        return nil, fmt.Errorf("用户ID数量超过100个")
    }

    for _, id := range userIDs {
        if len(id) < 6 || len(id) > 18 {
            return nil, fmt.Errorf("用户ID长度不在6到18个字符之间")
        }
    }

    var records []string
    for _, id := range userIDs {
        var record string
        err := db.QueryRow("SELECT operation_record FROM user_operations WHERE user_id =?", id).Scan(&record)
        if err != nil {
            if err == sql.ErrNoRows {
                // 记录日志,用户ID存在但无操作记录
                log.Printf("用户ID %s 无操作记录", id)
            } else {
                // 数据库查询错误,记录日志并返回错误
                log.Printf("查询用户ID %s 操作记录时出错: %v", id, err)
                return nil, fmt.Errorf("查询用户ID %s 操作记录时出错: %v", id, err)
            }
        } else {
            records = append(records, record)
        }
    }

    return records, nil
}

错误处理说明

  1. 参数校验错误:在函数开始时,对传入的用户ID数量和每个用户ID的长度进行校验。如果不满足条件,直接返回相应的错误信息,这样可以避免无效参数进入后续复杂的数据库操作流程,保证系统的健壮性。
  2. 数据库操作错误:在执行数据库查询时,捕获可能出现的错误。如果是 sql.ErrNoRows 错误,表示用户ID存在但无操作记录,此时记录日志并继续处理下一个用户ID。如果是其他数据库查询错误,记录详细的错误日志并返回错误,以便上层调用者进行处理。通过这种方式,既保证了单个用户ID操作记录查询失败不影响其他用户ID的处理,又能将关键错误信息反馈给调用者,使系统在面对数据库异常时保持健壮性。