go语言编写一个用panic-and-recover机制编写一个检测用户账号合法性的程序,账号长度为8-16个字符,由数字、字母、下划线构成,第一个字符为字母或下划线,不能出现空格,不能出现非法字符等。
时间: 2024-12-02 16:17:04 浏览: 14
Go语言中,你可以使用`panic`和`recover`关键字来处理运行时错误并继续执行程序的一部分。下面是一个简单的示例,展示了如何使用这个机制来验证用户账号的合法性:
```go
package main
import (
"bufio"
"fmt"
"os"
"regexp"
"strconv"
)
func isAlphaOrUnderscore(c rune) bool {
return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || c == '_'
}
func isValidUsername(username string) bool {
if len(username) < 8 || len(username) > 16 {
panic("Invalid username length")
}
re := regexp.MustCompile(`^[a-zA-Z_][a-zA-Z0-9_]*$`) // 正则表达式匹配规则
if !re.MatchString(username) {
panic("Invalid characters or spaces found in username")
}
return true
}
func readUsername() string {
reader := bufio.NewReader(os.Stdin)
fmt.Print("Enter your username: ")
username, _ := reader.ReadString('\n')
return strings.TrimSpace(username)
}
func main() {
defer func() {
if r := recover(); r != nil {
switch v := r.(type) {
case error:
fmt.Println(v)
default:
fmt.Printf("An error occurred: %v", r)
}
}
}()
username := readUsername()
if !isValidUsername(username) {
panic("Invalid username format")
}
fmt.Println("Valid username!")
}
```
在这个例子中,`isAlphaOrUnderscore`函数检查单个字符是否为字母或下划线。`isValidUsername`函数用于验证整个字符串,如果不符合规则,就使用`panic`抛出错误信息。主函数`main`中读取用户输入,并通过`defer recover`捕获可能出现的`panic`异常。
当运行程序并尝试输入无效账号时,会看到相应的错误信息而不是程序崩溃。
阅读全文