github.com/cloudwego/frugal@v0.1.15/internal/binary/defs/defaults.go (about) 1 /* 2 * Copyright 2022 ByteDance Inc. 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package defs 18 19 import ( 20 `fmt` 21 `reflect` 22 `unsafe` 23 ) 24 25 type DefaultInitializer interface { 26 InitDefault() 27 } 28 29 func GetDefaultInitializer(vt reflect.Type) (unsafe.Pointer, error) { 30 var ok bool 31 var mt reflect.Method 32 33 /* element type and pointer type */ 34 et := vt 35 pt := reflect.PtrTo(vt) 36 37 /* dereference the type */ 38 for et.Kind() == reflect.Ptr { 39 pt = et 40 et = et.Elem() 41 } 42 43 /* find the default initializer method */ 44 if mt, ok = et.MethodByName("InitDefault"); ok { 45 return nil, fmt.Errorf("implementation of `InitDefault()` must have a pointer receiver: %s", mt.Type) 46 } else if mt, ok = pt.MethodByName("InitDefault"); !ok { 47 return nil, nil 48 } else if mt.Type.NumIn() != 1 || mt.Type.NumOut() != 0 { 49 return nil, fmt.Errorf("invalid implementation of `InitDefault()`: %s", mt.Type) 50 } else { 51 return *(*[2]*unsafe.Pointer)(unsafe.Pointer(&mt.Func))[1], nil 52 } 53 }