相关疑难解决方法(0)

Golang:创建常量类型并限制类型的值

我有一个关于常量类型的问题,这些常量限制在某些值以及如何在Golang中实现.说我创建类型unary,其具有两个常数值Positive(1)Negative(-1)与我想限制该类型(用户unary从创建类型的其它值)unary.我是通过创建一个包并使值PositiveNegative可见并使类型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)

constants go

24
推荐指数
1
解决办法
1万
查看次数

如何在golang中检查值是否为iota常量?

我在golang中使用iota定义了以下类型.

type StatusType int

const (
    PENDING StatusType = iota
    APPROVED
    REJECTED
)
Run Code Online (Sandbox Code Playgroud)

我想将REST-API中传递的值限制为StatusType.这样的值不应超过0,1,2.

enums go

10
推荐指数
2
解决办法
5740
查看次数

如何在Go中获取所有类型的常量

这是一个例子:

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映射中都有相应的条目.

fsm go

8
推荐指数
2
解决办法
1063
查看次数

如何在 gorm 中添加枚举?

我正在编写 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 go-gorm

8
推荐指数
1
解决办法
2万
查看次数

如何限制 Golang 中变量的值?

我知道 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)

但我认为这是错误的方式。

go

5
推荐指数
1
解决办法
5836
查看次数

GO中自定义类型的ENUM

我正在尝试为我定义的类型生成枚举

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)

是一个结果相似的游乐场

enums go iota

4
推荐指数
1
解决办法
1900
查看次数

如何从特征对象获取Any:downcast_ref的所有权?

我遇到了与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.

====编辑=====

由于我不擅长英语,我的问题很模糊.

我正在 Go标准库中实现(复制可能更精确)模板解析器.

我真正需要的是一个载体,Vec<Box<Node>>或者Vec<Box<Any>>,它可以包含TextNode …

rust

3
推荐指数
1
解决办法
639
查看次数

什么是在Go中获取枚举字符串表示的惯用方法?

如果我有一个枚举:

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)

go

3
推荐指数
2
解决办法
391
查看次数

什么时候类型应该是一个包含另一种类型的结构?什么时候应该只是"扩展"(?)那种类型?

我目前正在学习围绕罗莎琳德问题(基本上是一堆生物信息学相关的代码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链更好?何时使用这两种方法中的任何一种都有任何经验法则吗?

struct types go

2
推荐指数
1
解决办法
3098
查看次数

我如何在golang中进行枚举?

我有

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

我该如何执行?

go

2
推荐指数
1
解决办法
2635
查看次数

如何在 go 中使用枚举?

golang 中是否有简单的枚举实现?像下面这样的?

type status enum[string] {
    pending = "PENDING"
    active = "ACTIVE"
}
Run Code Online (Sandbox Code Playgroud)

go

0
推荐指数
2
解决办法
2万
查看次数

标签 统计

go ×10

enums ×2

constants ×1

fsm ×1

go-gorm ×1

iota ×1

rust ×1

struct ×1

types ×1