Код, который вы пишете, не выдаст ошибку nil при компиляции. Он вызывает ошибку nil point только при неправильном использовании.
failuresInCommits map[string][]string
Вы использовали его после make()
?
Failures map[git_repo.FilePath]*FailureData
Вы использовали это после 'make ()'?
хорошо, теперь вы сосредоточены на ok := r.Failures[filePath].failuresInCommits
, вы убедились, что r.Failures[filePath]
возвращает 'failuresIncommits, true',
если нет, то r.Failures [filePath] равен нулю, хорошо, вы скажете мне, что такое nil.failuresInCommits
.
, есть также риск, что вы можете только x.failureInCommits в этом конкретномпакет.Если вы сделаете то же самое в каком-то другом пакете, x.failureInCommits будет недоступен из-за ограниченного поля нижнего регистра.
Как сделать?
package main
type FilePath string
type FailureData struct {
failuresInCommits map[string][]string
}
func NewFailureData() FailureData {
return FailureData{
failuresInCommits: make(map[string][]string, 0),
}
}
func (fd *FailureData) Set(k string, v []string) {
fd.failuresInCommits[k] = v
}
type DetectionResults struct {
Failures map[FilePath]*FailureData
//Have other things
}
func NewDetectionResults() *DetectionResults {
return &DetectionResults{
Failures: make(map[FilePath]*FailureData, 0),
}
}
func (dr *DetectionResults) Set(fp FilePath, fd *FailureData) {
dr.Failures[fp] = fd
}
func main() {
fd := NewFailureData()
dr := NewDetectionResults()
comments := []string{"push error", "commit error", "add error"}
fd.Set("hash-18ef8abujce8fad0h8j", comments)
dr.Set("/etc/go/gopath/src/github.com/xxx/xxx/main.go: 12", &fd)
}