3

次のコードがあります。

package main

import (
    "log"
)

type Data struct {
    Id int
    Name string
}

type DataError struct {
    Message string
    ErrorCode string
}

func main() {
    response := Data{Id: 100, Name: `Name`}
    if true {
        response = DataError{Message: `message`, ErrorCode: `code`}
    }
    log.Println(response)
}

このコードはエラーを返します:

./start.go:20: DataError リテラル (DataError 型) を代入の Data 型として使用できません

response異なるタイプの var データに割り当てることができなかったようです(私の場合DataError)。可能な解決策は、インターフェースを介して結合Dataおよび構造化することであると聞きました。DataErrorそれとも、別のより良い解決策がありますか?

この問題を解決する方法を教えてください。

ありがとう

4

2 に答える 2

1

特定のインターフェイス署名または空のインターフェイスを使用しない限り、同じ変数に「割り当て可能」ではない2つの異なるタイプを割り当てることはできません。

https://golang.org/ref/spec#Assignability

そのコードはコンパイルされます:

func main() {
    var response interface{} // empty interface AKA Object AKA void pointer
    response = Data{Id: 100, Name: `Name`}
    if true {
        response = DataError{Message: `message`, ErrorCode: `code`}
    }
    log.Println(response)
}

すべてのタイプが空のインターフェースを実装しているためですが、他にオプションがない場合にのみそれを行いたいと考えています。

2 つの型がいくつかのメソッドを共有している場合、特定のインターフェイスを使用します。たとえば、 (pseudo-code) :

type Responder interface {
    Respond() string
}

type Data struct { /* code */
}

func (d Data) Respond() string { return "" }

type DataError struct { /* code */
}

func (d DataError) Respond() string { return "" }

func main() {

    var response Responder // declared as interface
    response = Data{}
    response = DataError{}
    fmt.Println(response)

}

go 仕様の簡単なスキャンが有用であることに疑問がある場合はいつでも、それが唯一の権威であり、そこにあるほとんどの仕様と比較してかなりよく書かれています. ほとんどの場合、ルールは非常に明確であり、それが囲碁の強みです。

于 2016-09-27T14:06:17.200 に答える