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 {}
Потому что
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
типов в этих дженериках может не подходить для вашего конкретного случая использования. Недостаточно информации, чтобы предложить более подходящее ограничение.
Надеюсь, это ответит на ваш вопрос. Если нет, вам нужно будет предоставить дополнительную информацию о том, чего вы пытаетесь достичь.
Ваш ответ исчерпывающий, спасибо.
Спецификация языка этого не позволяет. Вам необходимо использовать временные переменные, чтобы назначить несколько возвращаемых значений полям структуры. Я не понимаю вторую часть вашего вопроса.