Изменить указатель на срез типа на другой срез другого типа

var buf1 []Somestruct1
var buf2 []Somestruct2

var selected_buf //pointer, needs to be declared. I used *int, []interface{}, *[]interface{}, but nothing seems to work so far

changeme := 0
switch changeme {
    case 0:
        // should point to buf1 to mutate it in future
        selected_buf = &buf1
    case 1:
        // should point to buf2 to mutate it in future
        selected_buf = &buf2
}

// examples of use and mutation
len(selected_buf)
selected_buf = append(selected_buf, Somestruct1) // or Somestruct2 depending on pointer

Я хочу реорганизовать некоторый код, но не могу этого сделать, потому что указатель дает мне различные ошибки в зависимости от того, как я решу его реализовать. Раньше работало что-то подобное:
var newstruct Somestruct3
for i := range buf1 {
    current := buf1[i]
    if current.somefield == someint {
        newstruct.somefield = &current
    }
}

И это работало нормально. хз что делать. пожалуйста помогите)

"модераторы, будьте добры - пишу с телефона в хреновой сети. спасибо"

То, что вы пытаетесь сделать, не сработает. Какую реальную проблему вы пытаетесь решить? Зачем вам это нужно? Вполне вероятно, что есть и другие пути достижения цели.

Burak Serdar 31.03.2023 04:46

@BurakSerdar Да, это как бы изменение типа переменной «на лету». Мы знаем, что это невозможно для языков со статической типизацией. Я нашел решение, как провести рефакторинг. Somestruct1 и Somestruct2 в любом случае связаны, поэтому цикл проходит через первый и вложенный цикл через второй. Ничего страшного. На данный момент)

Eugene Zolotuhin 31.03.2023 05:01
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
API ввода вопросов - это полезный инструмент для интеграции моделей машинного обучения, таких как ChatGPT, в приложения, требующие обработки...
1
2
64
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как я вижу, эти два типа будут объединены в один тип, поэтому одна возможная работа, которую можно сделать, — это ввести интерфейс с возможными методами и добавить его к этому интерфейсу.

type testinterface interface {
}

func main() {
    var tmp []Somestruct1
    var tmp2 []Somestruct2
    var tmp3 []testinterface

    tmp3 = append(tmp3, &Somestruct1)
    tmp3 = append(tmp3, &Somestruct2)
}

Спасибо, попробую в следующий раз. Файл, над которым я работал, находится по адресу github.com/zhexyez/go-build-html/tree/master. Рефакторинга пока нет. Найдите корпус «R», но он уже изменил свою логику.

Eugene Zolotuhin 31.03.2023 13:07

Другие вопросы по теме