Замена одной строки в срезе группой строк

Я хочу иметь фрагмент строк, и когда определенные строки будут найдены, они будут заменены группой связанных строк.

Например, если у меня есть это:

[]string{"A","FROM_B_TO_E","F"}

После запуска моего метода я хочу иметь:

[]string{"A","B","C","D","E","F"}

Я придумал этот код, дело в том, что хотя я могу распечатать свой слайс to_be_added непосредственно перед его фактическим добавлением, он почему-то не работает. Однако это сработает, если я изменю свой translateRule, поэтому вместо того, чтобы возвращать фрагмент строки, он возвращает только одну строку:

  func groupRules(validationRules []string){
        for index,rulename := range validationRules {
            if succeeded, to_be_added := translateRule(rulename) ; succeeded == true{
                fmt.Println("Entro! ", to_be_added)
                validationRules = append(append(validationRules[:index],to_be_added...), validationRules[index+1:]...)
            }
        }
    }
    func translateRule(rule string) ( bool , []string ) {
        if rule == "rs_full" {
            return true,[]string{"sapo","rana"}
        }
        return false,nil
    }

person Matias Barrios    schedule 25.07.2018    source источник
comment
Вы должны передать указатель func groupRules(validationRules *[]string)   -  person Uvelichitel    schedule 25.07.2018
comment
@Увеличитель Я так не думаю. Вам не нужно передавать указатель при отправке фрагмента, так как он откладывается по умолчанию. Кроме того, как я прокомментировал в своей заметке, если я to_be_added является строкой, а не []строкой, она отлично работает.   -  person Matias Barrios    schedule 25.07.2018
comment
@MatiasBarrios: срезы — это значения, как и все остальное, и если вы хотите изменить аргумент, вам нужен указатель на него. Вы можете перезаписать значения внутри среза, но значение среза является только копией.   -  person JimB    schedule 25.07.2018
comment
Используйте тот же подход, что и append, верните новый срез и переназначьте его исходной переменной.   -  person mkopriva    schedule 25.07.2018
comment
@JimB Я действительно пытался использовать указатель. Вот причина, по которой я не могу и не должен: нарезать"> stackoverflow.com/questions/21278023/   -  person Matias Barrios    schedule 25.07.2018
comment
@MatiasBarrios: это здесь не уместно. Добавление к массиву изменяет его, поэтому вам нужен указатель, чтобы это отражалось вне функции.   -  person JimB    schedule 25.07.2018
comment
play.golang.org/p/E_1GH6r4f87   -  person mkopriva    schedule 25.07.2018
comment
@mkopriva Проверьте это: play.golang.org/p/rTlrh_SbKkK . Как только я пытаюсь разрезать один из этих указателей, он терпит неудачу. И мне нужно разделить срез, чтобы выполнить это. Вот почему я настаиваю на том, что я не могу использовать этот подход. Если вы можете каким-то образом изменить мой код с помощью указателей и заставить его работать, я буду ругать вас и признаю, что был неправ.   -  person Matias Barrios    schedule 25.07.2018
comment
play.golang.org/p/ZZKFwve1TNi s[:] оценивается первым, поэтому Go думает, что вы при попытке нарезать указатель используйте круглые скобки, чтобы изменить порядок оценки. Или сделайте это в два этапа play.golang.org/p/nmQPiPpwruW.   -  person mkopriva    schedule 25.07.2018
comment
или сделайте то, что делает большинство кода Go, и верните новый слайс, а не берите указатель на слайс.   -  person JimB    schedule 25.07.2018
comment
@JimB Ни указатели, ни простой проход не сработали. Так что я действительно закончил тем, что сделал именно это, и теперь это работает.   -  person Matias Barrios    schedule 25.07.2018


Ответы (1)


Итак, мой недостаток опыта работы с Go или плохой код, который я пишу, привели меня к следующему:

func groupRules(validationRules []string) []string{
    var tmp_slice []string
    for _ ,rulename := range validationRules {
        if succeeded, to_be_added := translateRule(rulename) ; succeeded == true{
            tmp_slice = append(tmp_slice,to_be_added...)
        }else{
            tmp_slice = append(tmp_slice,rulename)
        }
    }
    return tmp_slice
}
func translateRule(rule string) ( bool , []string ) {
    if rule == "rs_full" {
        return true,[]string{"sapo","rana","tigre"}
    }
    return false,nil
}

Теперь работает безотказно.

Спасибо вам всем.

person Matias Barrios    schedule 25.07.2018