【问题标题】:Can I bind one element of class to another while initializing in one line?我可以在一行中初始化时将一个类元素绑定到另一个元素吗?
【发布时间】:2017-12-08 09:13:49
【问题描述】:

我有一个这样的类(结构):

type Question struct{
    Question string
    answerOne string
    answerTwo string
    answerCorrect string
}

我这样初始化它:

q1:=Question{
    Question:"What?",
    answerOne:"A",
    answerTwo:"B",
    answerCorrect: ? //I want this have similar value as `answerOne`
}

在初始化时,我希望我的一个值与另一个值具有相似的值。有什么办法吗?

【问题讨论】:

  • 不,当然不是。是什么让您认为这应该是可能的?
  • 因为它是非常有用的工具。但是我从未在其他语言中看到过这样的事情。我想,也许是谷歌开发者做到了。

标签: go struct initialization composite-literals


【解决方案1】:

你不能只使用文字,但你可以定义一个函数。

func NewQuestion() *Question {
    q := &Question{
        Question:  "What?",
        answerOne: "A",
        answerTwo: "B",
    }
    q.answerCorrect = q.answerOne
    return q
}

// ...

q1 := NewQuestion()

【讨论】:

  • 是的,看起来是这样。
【解决方案2】:

类似于在创建Question 值之后设置correctAnswer 字段,您可以将正确答案存储在一个变量之前,并在复合文字中使用两次:

answerA := "A"
q := Question{
    Question:      "What?",
    answerOne:     answerA,
    answerTwo:     "B",
    answerCorrect: answerA,
}

【讨论】:

    【解决方案3】:

    您可以创建一个指向结构的指针,然后将值分配给结构变量answerCorrect。最后,您可以打印 valueAt 结构指针。

    package main
    
    import "fmt"
    
    // Question struct for content
    type Question struct {
        Question      string
        answerOne     string
        answerTwo     string
        answerCorrect string
    }
    
    func main() {
        question := &Question{
            Question:  "What?",
            answerOne: "A",
            answerTwo: "B",
        }
    
        // apply condition to chose from the answer
    
        question.answerCorrect = question.answerTwo
        fmt.Println(*question)
    }
    

    【讨论】:

    • 我认为@mkopriva 的解决方案比直接在main 内部的question.answerCorrect = question.answerTwo 更优雅
    • 这只是你可以做的一个选项,并不意味着你需要创建一个函数。
    • 应该创建一个函数来隐藏一些特定的东西,比如“将值设置为answerCorrect”,因为使用你的代码的程序员对这个要求一无所知。跨度>
    • 我认为你在这里误判了这个问题。你是对的,但看看 Bungler 没有提出任何具体要求的问题。
    • 谢谢,但answerCorrect 这是一个“特定要求”,@Bungler 应该创建一个函数来保护将使用此代码的程序员免受此代码的“水下岩石”的伤害。谁知道在创建“问题”对象后他应该将值设置为answerCorrect 字段? - 没有人。因此,如果@Bungler 会按照我的方式进行,那么它的代码会比他按照你的方式更简洁:)
    猜你喜欢
    • 2023-03-15
    • 1970-01-01
    • 2018-06-17
    • 1970-01-01
    • 2010-11-12
    • 1970-01-01
    • 1970-01-01
    • 2015-05-19
    相关资源
    最近更新 更多