本文整理汇总了Golang中reflect.FuncType.DotDotDot方法的典型用法代码示例。如果您正苦于以下问题:Golang FuncType.DotDotDot方法的具体用法?Golang FuncType.DotDotDot怎么用?Golang FuncType.DotDotDot使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类reflect.FuncType
的用法示例。
在下文中一共展示了FuncType.DotDotDot方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Golang代码示例。
示例1: argsMatch
// Funkcja sprawdza zgodnosc typow argumentow. Jesli to konieczne konwertuje
// argumenty do typu interface{}. Jesli to potrzebna, funkcja odpowiednio
// dostosowuje args dla funkcji.
func argsMatch(ft *reflect.FuncType, args *[]reflect.Value, method int) int {
// Liczba arguemntow akceptowanych przez funkcje/metode
num_in := ft.NumIn() - method
// Sprawdzamy zgodnosc liczby argumentow i obecnosc funkcji dotdotdot
var head_args, tail_args []reflect.Value
if ft.DotDotDot() {
num_in--
if len(*args) < num_in {
return RUN_WRONG_ARG_NUM
}
head_args = (*args)[0:num_in]
tail_args = (*args)[num_in:]
} else {
if num_in != len(*args) {
return RUN_WRONG_ARG_NUM
}
head_args = *args
}
// Sprawdzamy zgodnosc typow poczatkowych argumentow funkcji
for kk, av := range head_args {
at := ft.In(kk + method)
//fmt.Printf("DEB: ctx: %s, fun: %s\n", av.Type(), at)
if at != av.Type() {
// Sprawdzamy czy arguentem funkcji jest typ interface{}
if it, ok := at.(*reflect.InterfaceType); ok && it.NumMethod() == 0 {
// Zmieniamy typ argumentu przekazywanego do funkcji
vi := av.Interface()
head_args[kk] = reflect.NewValue(&vi).(*reflect.PtrValue).Elem()
} else {
return RUN_WRONG_ARG_TYP
}
}
}
if !ft.DotDotDot() {
return RUN_OK
}
// Okreslamy typ argumentów zawartych w dotdotdot
st := ft.In(ft.NumIn() - 1).(*reflect.SliceType)
at := st.Elem()
it, ok := at.(*reflect.InterfaceType)
at_is_interface := (ok && it.NumMethod() == 0)
// Przygotowujemy miejsce na argumenty
ddd := reflect.MakeSlice(st, len(tail_args), cap(tail_args))
for kk, av := range tail_args {
if at != av.Type() {
// Sprawdzamy czy arguentem funkcji jest typ interface{}
if at_is_interface {
// Zmieniamy typ argumentu przekazywanego do funkcji
vi := av.Interface()
tail_args[kk] = reflect.NewValue(&vi).(*reflect.PtrValue).Elem()
} else {
return RUN_WRONG_ARG_TYP
}
}
// Umieszczamy argument w ddd
ddd.Elem(kk).SetValue(av)
}
// Zwracamy zmodyfikowana tablice argumentow
*args = append(head_args, ddd)
return RUN_OK
}