Go Pass Func в поля типа Struct, ошибка «слишком мало значений в структурном литерале типа Test»

type Test struct {
    a int
    b int
}

func f(a, b int) (int, int) {
    return a, b
}

k := Test{(f(5, 6))} // Error

но

type Test struct {
    a int
}

func f(a int) int {
    return a
}

k := Test{(f(5))} // Ok

Как отправить результат функции в поля структуры или создать метод для группы типов, пример:

 func(MyType1, MyType2) f (something) something {}

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

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

Ответы 2

Потому что

k := Test{ f(5, 6) }

эквивалентно передаче массива размером два, а не двух аргументов. Подумайте f([1, 2]) против f(1, 2).

Существует функция распространения/распространения для структур внутри структур, но, к сожалению, ее нет для массивов внутри структур.

Так что простого решения нет, вам придется назначить их самостоятельно.

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

Несмотря на то, что ваша функция в первом примере возвращает два значения, спецификация языка не предоставляет механизм автоматического распределения нескольких возвращаемых значений по неявным полям; вы должны быть откровенны.

Самый простой способ сделать это в вашем первом примере:

   t := Test{}
   t.a, t.b = f(a, b)

Ваш второй вопрос не совсем ясен.

Вы могли бы иметь в виду что-то похожее на:

   func(values ...int) func(...int) []int

то есть функция, принимающая переменное количество аргументов int, возвращающая функцию, которая также принимает переменное количество аргументов int и возвращает часть int.

Невозможно вернуть переменное количество значений, кроме как в виде среза.

Если аргументы должны быть (потенциально) разных типов, вам нужно будет использовать тип any:

   func(values ...any) func(...any) []any

Если у вас был конкретный случай, когда вам нужно два разных явных типа в исходной функции, вам необходимо указать количество и порядок этих значений; когда дело доходит до возвращаемого значения возвращаемой функции, вам снова придется прибегнуть к any:

   func(v1 int, v1 string) func(int, string) []any

Универсальная функция, которая может принимать два значения любого типа, причем эти типы должны быть указаны в месте вызова, является просто общей [sic] формой предыдущего случая:

   func[T1 any, T2 any](v1 T1, v2 T2) func(T1, T2) []any

Аналогично, универсальную функцию можно использовать для начального примера значений 0..n заданного типа:

   func[T any](values ...T) func(...T) []T

Обратите внимание, что ограничение any типов в этих дженериках может не подходить для вашего конкретного случая использования. Недостаточно информации, чтобы предложить более подходящее ограничение.

Надеюсь, это ответит на ваш вопрос. Если нет, вам нужно будет предоставить дополнительную информацию о том, чего вы пытаетесь достичь.

Ваш ответ исчерпывающий, спасибо.

Сергей Ковальчук 10.07.2024 08:20

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