当前位置: 首页>>代码示例>>Golang>>正文


Golang FuncType.DotDotDot方法代码示例

本文整理汇总了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
}
开发者ID:strogo,项目名称:kasia.go,代码行数:70,代码来源:getvarfun.go


注:本文中的reflect.FuncType.DotDotDot方法示例由纯净天空整理自Github/MSDocs等开源代码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。