75640


Go言語でinterfaceと構造体を以下のように定義しました。

[code]

    type Human interface {
        Greeting()
    }
    
    type Person struct {
        Name string
    }
    
    func (p Person) Greeting() {
        fmt.Println("Hello" + p.Name)
    }
    
    func main() {
        var John Human = Person{Name: "John"}
        John.Greeting()
    }
    
[/code]

このようにした場合、main関数内からPerson構造体のフィールドであるNameにアクセスする方法はあるのでしょうか。  
`John.Name`としてもエラーが発生し値を取得することができませんでした。インターフェースを

[code]

    type Human interface {
        Greeting()
        getName() string
    }
    func (p Person) getName() string {
        return p.Name
    }
    
[/code]

などとして、`John.getName()`とするしかないのでしょうか。


CC BY-SA 4.0
2021-05-03T00:58:18.210
75638
2021-05-03T02:49:38.630
2021-05-03T01:15:26.497
30396
30396
question
go
Go言語におけるインターフェースと構造体のフィールドへのアクセスについて


`var john Human = Person{Name: "John"}` として定義したとして、`Human` 型 には `Name`
フィールドが無いので、おっしゃるとおり `john.Name` では取得できません。

`Name`
を無理矢理取得するには、たとえば[型アサーション](https://tour.golang.org/methods/15)を使うことで、interface
の実装となっている `Person` 型として扱う方法が考えられます：`john.(Person).Name`（[Go
Playground](https://play.golang.org/p/ckmFwBbja5Y)）。

ただし、もし初めから `Name` へのアクセスが必須だと分かっているのであれば、`john` を `Person` 型として定義した上で `Human`
interface の機能も使う、という風にした方が自然でしょう。

[code]

    var john Person = Person{Name: "John"}
    john.Greeting()
    fmt.Println("Hi, " + john.Name)
    
[/code]

（[Go Playground](https://play.golang.org/p/dNknOoQ2wCp)）


CC BY-SA 4.0
2021-05-03T02:49:38.630
75640
2021-05-03T02:49:38.630
19110
75638
answer