Go 生成自定义结构类型的常量全局变量
我想创建一个“类”来处理输入验证。我首先制作了一种类型的Go 生成自定义结构类型的常量全局变量,go,types,constants,Go,Types,Constants,我想创建一个“类”来处理输入验证。我首先制作了一种类型的Input,它是一个用于存储用户输入的字符串,另一种类型是REGP,它存储regex模式和模式描述。我创建了两个常量实例REGP\u LOGINNAME和REGP\u PASSWORD。但我得到的错误是,常量初始值设定项REGP literal不是常量。为什么? package aut import "regexp" type Input string type REGP struct { pattern string
Input
,它是一个用于存储用户输入的字符串,另一种类型是REGP
,它存储regex模式和模式描述。我创建了两个常量实例REGP\u LOGINNAME
和REGP\u PASSWORD
。但我得到的错误是,常量初始值设定项REGP literal不是常量。为什么?
package aut
import "regexp"
type Input string
type REGP struct {
pattern string
Descr string
}
const REGP_LOGINNAME = REGP{ //const initializer REGP literal is not a constant
"regex pattern 1",
"regex description 1",
}
const REGP_PASSWORD = REGP{ //const initializer REGP literal is not a constant
"regex pattern 2",
"regex description 2",
}
func (i Input) isMatch(regp REGP) bool {
isMatchREGP, _ := regexp.MatchString(regp.pattern, string(i))
return isMatchREGP
}
错误消息:
/usr/local/go/bin/go build -i [/home/casper/gopath/codespace_v2.6.6/dev/server_side/golang/go_codespace_v2.1/server/lib/aut]
# _/home/casper/gopath/codespace_v2.6.6/dev/server_side/golang/go_codespace_v2.1/server/lib/aut
./validation.go:15: const initializer REGP literal is not a constant
./validation.go:20: const initializer REGP literal is not a constant
Error: process exited with code 2.
我最终发现,似乎不可能使REGP
指针或其内部变量保持常量。所以我把它们变成了全局变量
package aut
import "regexp"
type Input string
type REGP struct {
pattern string
Descr string
}
var REGP_LOGINNAME = REGP{
pattern: "/^(?=^.{6,20}$)^[a-zA-Z][a-zA-Z0-9]*[._-]?[a-zA-Z0-9]+$/",
Descr: "regex description 1",
}
var REGP_PASSWORD = REGP{
pattern: "/^(?=^.{8,}$)(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?!.*\s)[0-9a-zA-Z!@#$%^&*()]*$/",
Descr: "regex description 2",
}
func (i Input) isMatch(regp REGP) bool {
isMatchREGP, _ := regexp.MatchString(regp.pattern, string(i))
return isMatchREGP
}
Go中的constants只能是标量值(例如2
,true
,3.14
,“及更多”
)或仅由常量组成的任何表达式(例如1+2
,“hello”+“world”
,或2*math.Pi*1i
)
这意味着不能将非标量值的结构类型(如REGP\u LOGINNAME
)分配给常量。相反,请使用一个变量:
var (
REGP_LOGINNAME = REGP{
pattern: `/^(?=^.{6,20}$)^[a-zA-Z][a-zA-Z0-9]*[._-]?[a-zA-Z0-9]+$/`,
Descr: "regex description 1",
}
REGP_PASSWORD = REGP{
pattern: `/^(?=^.{8,}$)(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?!.*\s)[0-9a-zA-Z!@#$%^&*()]*$/`,
Descr: "regex description 2",
}
)
进一步阅读
旁白:我当然不知道您的用例,但我真的怀疑您是否真的需要或想要使用regexp来验证用户密码。取而代之的是,考虑通过它(一个用于处理和执行Unicode字符串安全性的框架;不透明的字符串配置文件被设计来处理密码)。类似地,UsernameCaseMapped和UsernameCasePreserved配置文件(也在链接包中实现)可用于用户名,以确保不会出现两个看起来相同但具有不同unicode字符的用户名。当然,还可以进行进一步的验证。有布尔常量、符文常量、整数常量、浮点常量、复数常量和字符串常量。REGP不是其中之一。@JimB-你的意思是我不能使自定义类型为常量?你有什么办法让它看起来更好吗?没错。大多数代码都会使用一个变量,或者只是让regex字符串组成一种方式,将模式
和描述
包装在一起,形成全局变量?是的,您可以创建一个REGP类型的全局变量。