新發(fā)基金的好處和壞處是什么?新基金的封閉期一般是多久?
新發(fā)基金的好處和壞處是什么?新發(fā)基金的優(yōu)點(diǎn):1、認(rèn)購費(fèi)率低:一般
2023/07/06
作者:ShadowYD
(資料圖)
關(guān)鍵字參數(shù)
眾所周知很多語言的function 中都支持 key=word 關(guān)鍵字參數(shù), 但 golang 是不支持的, 我們可以利用泛型去簡單的實(shí)現(xiàn).
funcDefaultKeyWordParams[Dany](defValD,params...D)D{iflen(params)==0{returndefVal}returnparams[0]}functest(category...string){//不填寫則返回默認(rèn)值realCategory:=DefaultKeyWordParams[string]("AGroup",category...)fmt.Println(realCategory)}funcmain(){test()}
快速排序
UpdateAt: 2023-02-22
實(shí)現(xiàn)一個(gè)可進(jìn)行控制反轉(zhuǎn)的通用類型快速排序, 解決一下原生的sort包進(jìn)行類型定義的繁瑣.
//QuickSort通用快速排序funcQuickSort[Tany](arr[]T,compareFnfunc(a,bT)bool){iflen(arr)<2{return}pivot:=arr[0]left:=1right:=len(arr)-1forleft<=right{ifcompareFn(arr[left],pivot){left++}elseifcompareFn(pivot,arr[right]){right--}else{arr[left],arr[right]=arr[right],arr[left]}}arr[0],arr[right]=arr[right],arr[0]QuickSort(arr[:right],compareFn)QuickSort(arr[right+1:],compareFn)}
測試用例
funcTestQuickSort(t*testing.T){nums:=[]int{9,3,1,7,4,8,6,2,5}fmt.Println("Unsorted:",nums)QuickSort[int](nums,func(a,bint)bool{returna去重復(fù)
這是一個(gè)簡單的實(shí)現(xiàn), 復(fù)雜點(diǎn)可以通過回調(diào) + 泛型來實(shí)現(xiàn);
funcRemoveDuplicate[Tstring|int|float64](duplicateSlice[]T)[]T{set:=map[T]interface{}{}res:=[]T{}for_,item:=rangeduplicateSlice{_,ok:=set[item]if!ok{res=append(res,item)set[item]=nil}}returnres}funcmain(){fmt.Println(RemoveDuplicate[string]([]string{"a","c","a"}))fmt.Println(RemoveDuplicate[int]([]int{1,2,1,1,1}))}通過控制反轉(zhuǎn)實(shí)現(xiàn)通用的去重復(fù)方法, 支持任意類型;
typeStudentstruct{NamestringAgeint}funcNewStudent(namestring,ageint)*Student{return&Student{Name:name,Age:age}}funcDefaultFilter(iteminterface{})(uniqueKeyinterface{}){returnitem.(*Student).Name}funcRemoveDuplicateWithFilter[Tcomparable](compareSlice[]T,filterFuncfunc(iteminterface{})(keyinterface{}))[]T{set:=map[interface{}]interface{}{}res:=[]T{}for_,item:=rangecompareSlice{i:=filterFunc(item)_,ok:=set[i]if!ok{res=append(res,item)set[i]=nil}}returnres}funcmain(){s:=[]*Student{NewStudent("a",1),NewStudent("a",1),NewStudent("b",2),NewStudent("b",2),}l:=RemoveDuplicateWithFilter[*Student](s,DefaultFilter)for_,i:=rangel{fmt.Println(i.Name,i.Age)}}聯(lián)合約束類型
該例子只是一個(gè)演示, 沒有實(shí)際效果
typeIDinterface{int|string}//寫法[TID,Dstring]==[Tint|string,Dstring]typeUserModel[TID,Dstring]struct{IdTNameD}funcNewUserModel[AID,Dstring](idA,nameD)*UserModel[A,D]{return&UserModel[A,D]{Id:id,Name:name}}funcmain(){fmt.Println(NewUserModel[int,string](10,"hello"))fmt.Println(NewUserModel[string,string]("10","hello"))}分頁
這是一段線上在使用的分頁代碼, 當(dāng)無法使用外部存儲(chǔ)器進(jìn)行分頁時(shí)直接使用該對(duì)象進(jìn)行分頁, 支持任意類型;
typeKeepItembool//若需要保留的item則返回true即可typeFilterFuncfunc(iteminterface{})KeepItemtypePageList[Tany]struct{Totalint`json:"total"`Pageint`json:"page"`Sizeint`json:"size"`List[]T`json:"list"`}typePager[Tany]struct{limitintoffsetinttotalintpageCntintlist[]T}funcNewPager[Tany](list[]T)*Pager[T]{return&Pager[T]{limit:10,offset:1,total:len(list),list:list,}}func(this*Pager[T])Filter(filterFnFilterFunc)*Pager[T]{tmpList:=[]T{}for_,item:=rangethis.list{iffilterFn(&item){tmpList=append(tmpList,item)}}this.list=tmpListthis.total=len(tmpList)returnthis}func(this*Pager[T])Offset(cint)*Pager[T]{this.offset=creturnthis}func(this*Pager[T])Limit(cint)*Pager[T]{this.limit=creturnthis}func(this*Pager[T])List()[]T{//頁碼ifthis.offset<=0{this.offset=1}//sizeifthis.limit>this.total{this.limit=this.total}//總頁數(shù)this.pageCnt=int(math.Ceil(float64(this.total)/float64(this.limit)))ifthis.offset>this.pageCnt{return[]T{}}startIdx:=(this.offset-1)*this.limitendIdx:=startIdx+this.limitifendIdx>this.total{endIdx=this.total}returnthis.list[startIdx:endIdx]}func(this*Pager[T])Output()*PageList[T]{return&PageList[T]{Total:this.total,Page:this.offset,Size:this.limit,List:this.list,}}//testfuncmain(){page:=NewPager[int]([]int{1,2,3,4,5,6,7,8,9,10})list:=page.Offset(1).Limit(3).Filter(func(iteminterface{})KeepItem{if*item.(*int)%2==1{returntrue}returnfalse}).List()fmt.Println(list)}通用初始化模型
可以解決在多態(tài)下使用同一個(gè)初始化函數(shù)進(jìn)行對(duì)象初始化, 寫法上有點(diǎn)繞大家自行多實(shí)驗(yàn)幾次就能明白.
typeModelObjinterface{User|Product}typeUserstruct{Uidint}func(this*User)SetId(idint){this.Uid=id}typeProductstruct{Pidint}func(this*Product)SetId(idint){this.Pid=id}//TrimModelObj是一個(gè)動(dòng)態(tài)類型的Interface,由M決定當(dāng)前Interface的最終類型typeTrimModelObj[MModelObj]interface{*MSetId(idint)}//TrimModelObj[Model]由第二個(gè)參數(shù)決定當(dāng)前的動(dòng)態(tài)類型;//NewModelObj[*User,User](32)如Model是User類型,最終TrimModelObj==*User,所以我們需要為Trim傳遞*UserfuncNewModelObj[TrimTrimModelObj[Model],ModelModelObj](idint)Trim{m:=new(Model)t:=Trim(m)fmt.Printf("%p",m)//類型轉(zhuǎn)換成指定的*Modelt.SetId(id)returnt}funcmain(){//newusermodelobjectuser:=NewModelObj[*User,User](32)fmt.Printf("%p",user)fmt.Printf("%T",user)fmt.Println(user.Uid)//newproductmodelobjectprod:=NewModelObj[*Product,Product](18)fmt.Printf("%p",prod)fmt.Printf("%T",prod)fmt.Println(prod.Pid)}審核編輯:湯梓紅
標(biāo)簽: