Как выполнить метод для структуры, которая является полем для другой структуры - PullRequest
0 голосов
/ 25 марта 2019

Я создал 2 таких структуры:

type HostsFile struct {
    path    string
    masters string
    nodes   string
}

type AnsInstance struct {
    name      string
    url       string
    yamlPath  string
    user      string
    pass      string
    branch    string
    hostsFile *HostsFile
}

HostsFile struct имеет такие методы:

func (p *HostsFile) SetMasters(masters string) {
    p.masters = masters
}

func (p *HostsFile) SetNodes(nodes string) {
    p.nodes = nodes
}

и AnsInstance имеет такой метод, который использует методы из HostFilestruct:

func (p *AnsInstance) PrepInstExec(masters string, nodes string) {
    p.hostsFile.SetMasters(masters)
    p.hostsFile.SetNodes(nodes)
    p.hostsFile.GenerateHostsFile()
}

Когда я выполняю PrepInstExec следующим образом:

ansInstance.PrepInstExec("lalala,fafafaf", "bakuka,matata")

Я получаю сообщение об ошибке:

panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x18 pc=0x4ccba3]

goroutine 1 [running]:
card-installer/ansexec.(*HostsFile).SetMasters(...)
        /home/holo/go/src/card-installer/ansexec/ansexec.go:19
card-installer/ansexec.(*AnsInstance).PrepInstExec(0xc0000c5e90, 0x6d1a2c, 0xe, 0x6d15b9, 0xd)
        /home/holo/go/src/card-installer/ansexec/ansexec.go:145 +0x53
main.main()
        /home/holo/go/src/card-installer/main.go:101 +0x84e
exit status 2

Что я делаю не так?Можно ли использовать методы exec для одной структуры, которая встроена в другую?

EDIT:

Я создаю новый AnsInstance таким образом:

func NewAnsInstance(name string, url string, path string) *AnsInstance {
    p := new(AnsInstance)
    p.name = name
    p.url = url
    p.yamlPath = path
    p.branch = "master"
    return p
}

Ответы [ 2 ]

2 голосов
/ 25 марта 2019

может быть это hostsFile 'nil ??

func main() {
    ansInstance := NewAnsInstance("name", "url", "path")

    // add code and check hostsFile
    fmt.Printf("%+v\n", ansInstance)
}
1 голос
/ 25 марта 2019

Поскольку hostsFile * HostsFile имеет указатель типа, значением по умолчанию / ноль при создании экземпляра структуры будет ноль.Так что вызов методов по nil вызовет панику.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...