切片方法

时间:2019-05-11 19:35:20

标签: go methods slice

尽管我认为标题中并未正确描述我所遇到的问题,但这是我现在能够描述的唯一方法。

我有一个结构Mini,该结构在另一个文件中定义。一组Minis应该描述为切片。当我想更改Mini结构的某些字段时,将其附加到切片上需要自定义函数。

直到现在我得到以下代码:

import (
    "fmt"
    "reflect"
)

//Minis is a slice of all Minis
type Minis struct {
    AllMinis []*Mini
}

//Append adds a new Mini to the Minis slice
func (m *Minis) Append(n *Mini) {
    m.AllMinis = append(m.AllMinis, n)
}

此代码完全正常。 但是在我看来,只有一个领域的结构是一种无知的行为。

一般来说,有什么方法可以在结构或更优雅的解决方案上建立方法吗?

谢谢!

1 个答案:

答案 0 :(得分:4)

将类型声明为切片:

//Minis is a slice of all Minis
type Minis []*Mini

//Append adds a new Mini to the Minis slice
func (m *Minis) Append(n *Mini) {
    *m = append(*m, n)
}

Run it on the playground

concat感到恐慌,因为QForename将nil slice指针作为接收者传递给concat。通过使用非nil指针进行修复:

func (m *Minis) QForename(q string) *Minis {
    var matches Minis
    for _, n := range *m {
        if n.Forename == q {
            matches.concat(n)
        }
    }
    return &matches
}