我有一个关于常量类型的问题,这些常量限制在某些值以及如何在Golang中实现.说我创建类型unary,其具有两个常数值Positive(1)和Negative(-1)与我想限制该类型(用户unary从创建类型的其它值)unary.我是通过创建一个包并使值Positive和Negative可见并使类型unary限制为包含来实现这一目的吗?请参阅下面的代码
package unary
type unary int////not visible outside of the package unary
const (
Positive unary = 1//visible outside of the package unary
Negative unary = -1//visible outside of the package unary
)
func (u unary) String() string {//visible outside of the package unary
if u == Positive {
return "+"
}
return "-"
}
func (u unary) CalExpr() int {//visible outside of the …Run Code Online (Sandbox Code Playgroud) 我在golang中使用iota定义了以下类型.
type StatusType int
const (
PENDING StatusType = iota
APPROVED
REJECTED
)
Run Code Online (Sandbox Code Playgroud)
我想将REST-API中传递的值限制为StatusType.这样的值不应超过0,1,2.
这是一个例子:
package main
type State int
const (
Created State = iota
Modified
Deleted
)
func main() {
// Some code here where I need the list
// of all available constants of this type.
}
Run Code Online (Sandbox Code Playgroud)
用例是创建有限状态机(FSM).能够获得所有常量将帮助我编写一个测试用例,该测试用例将确保每个新值在FSM映射中都有相应的条目.
我正在编写 PostgreSQL 表架构。
type TestTable struct {
ID int `gorm:"column:id;primaryKey;autoIncrement"`
CarType string `gorm:"column:car_type"`
}
Run Code Online (Sandbox Code Playgroud)
那么我如何添加“SEDAN”、“HATCHBACK”、“MINIVAN”等汽车类型作为枚举数据类型
我知道 Go 惯用语言没有 setter 和 getter。但我需要限制 Go 中变量的值。
我定义了新类型
type MyNewStringType string
Run Code Online (Sandbox Code Playgroud)
定义为 MyStringType 的变量需要限制值。
MyStringType 的变量只能有 3 个值:“是”、“否”、“我不知道”
我怎样才能在Golang中做到这一点?在Java、C++中我有setter和getter,但在Golang中并不正常。
我知道,我可以创造
type MyNewStringType struct {
Variable string
}
Run Code Online (Sandbox Code Playgroud)
并创造
func(m *MyNewStringType) SetVariable(newVar string) error {
if newVar == "Yes" || newVar == "No" || newVar == "I don't know" {
m.Variable = newVar
return nil
} else {
return errors.New("Wrong value")
}
Run Code Online (Sandbox Code Playgroud)
但我认为这是错误的方式。
我正在尝试为我定义的类型生成枚举
type FeeStage int
Run Code Online (Sandbox Code Playgroud)
从这个我知道,我可以用丝毫基于这种类型来创建一个枚举
const(
Stage1 FeeStage = iota
Stage2
Stage3
)
Run Code Online (Sandbox Code Playgroud)
但是,操纵枚举的实际值是相当麻烦且容易出错的
const(
Stage1 FeeStage = iota // 0
Stage2 = iota + 6 // 7
Stage3 = (iota - 3) * 5 // -5
)
Run Code Online (Sandbox Code Playgroud)
有没有办法自动将带有自定义值的ENUM列表转换为某种类型.这是我以前使用的,但只将常量的第一个成员转换为自定义类型.
const(
Stage1 FeeStage = 1
Stage2 = 2
Stage3 = 2
)
Run Code Online (Sandbox Code Playgroud)
这是一个结果相似的游乐场
我遇到了与Rust的所有权规则和特征对象垂头丧气的冲突.这是一个示例:
use std::any::Any;
trait Node{
fn gen(&self) -> Box<Node>;
}
struct TextNode;
impl Node for TextNode{
fn gen(&self) -> Box<Node>{
Box::new(TextNode)
}
}
fn main(){
let mut v: Vec<TextNode> = Vec::new();
let node = TextNode.gen();
let foo = &node as &Any;
match foo.downcast_ref::<TextNode>(){
Some(n) => {
v.push(*n);
},
None => ()
};
}
Run Code Online (Sandbox Code Playgroud)
该TextNode::gen方法必须返回Box<Node>而不是Box<TextNode>,所以我必须将它转发给Box<TextNode>.
Any::downcast_ref的回报值是Option<&T>,所以我无法取得低估结果的所有权并推动它v.
====编辑=====
由于我不擅长英语,我的问题很模糊.
我真正需要的是一个载体,Vec<Box<Node>>或者Vec<Box<Any>>,它可以包含TextNode …
如果我有一个枚举:
type Day int8
const (
Monday Day = iota
Tuesday
...
Sunday
)
Run Code Online (Sandbox Code Playgroud)
什么是更自然的 Go方式来获取它?
温控功能:
func ToString(day Day) string {
...
}
Run Code Online (Sandbox Code Playgroud)
或方法
func (day Day) String() string {
...
}
Run Code Online (Sandbox Code Playgroud) 我目前正在学习围绕罗莎琳德问题(基本上是一堆生物信息学相关的代码katas).
我目前正代表一种DNA链:
type DNAStrand struct {
dna byte[]
}
Run Code Online (Sandbox Code Playgroud)
我最初的原因是封装了字节切片,所以我知道它只包含代表核苷酸的字节:'A', 'C', 'G', 'T'.我意识到这显然没有保证,因为我可以这样做:
DNAStrand{[]byte("foo bar")}
Run Code Online (Sandbox Code Playgroud)
并且不再保证我的dna链包含一个只包含来自这四个字节的元素的字节数组.
由于我的struct只包含一个字节数组,因此它更好/更具思想性:
type DNAStrand []byte
Run Code Online (Sandbox Code Playgroud)
或者让类型包含dna链更好?何时使用这两种方法中的任何一种都有任何经验法则吗?
我有
const (
BlahFoo = 1 << iota
MooFoo
)
Run Code Online (Sandbox Code Playgroud)
然后
type Cluster struct {
a int
b int
}
Run Code Online (Sandbox Code Playgroud)
我希望Cluster.a只是BlahFoo或MooFoo
我该如何执行?
golang 中是否有简单的枚举实现?像下面这样的?
type status enum[string] {
pending = "PENDING"
active = "ACTIVE"
}
Run Code Online (Sandbox Code Playgroud)