How to write customized error with optional error struct passed
type Y2HError struct {
errMsg string
errDetail error
}
func (e *Y2HError) Error() string {
if e.errDetail != nil {
return e.errMsg + "\n-------------------\n" + e.errDetail.Error()
}
return e.errMsg
}
func NewY2HError(errMsg string, errSlice ...error) *Y2HError {
var errDetail error = nil
if len(errSlice) == 1 {
errDetail = errSlice[0]
}
return &Y2HError{errMsg, errDetail}
}
How to do generic type checking
Use reflect package to get TypeOf(object)
func parseHtml(htmlElements []interface{}) []byte {
for _, elem := range(htmlElements) {
switch reflect.TypeOf(elem).Kind(){
case reflect.String:
fmt.Println("it is string")
case reflect.Map:
fmt.Println("it is map")
}
}
...
}
How to append []byte to another []byte
Please follow: http://golang.org/doc/go_spec.html#Appending_and_copying_slices, it need pay attention that you need to use "[]T…" for the final argument. append() takes a slice of type []T, and then a variable number of values of the type of the slice member T. In other words, if you pass a []uint8 as the slice to append() then it wants every subsequent argument to be a uint8. The solution to this is to use the slice… syntax for passing a slice in place of a varargs argument. Your code should look like:
content := make([]byte, 0)
for i :=0; i<10; i++ {
fileContent := ioutil.ReadFile("test.file")
content = append(content, fileContent...)
}
How to convert interface{} to string
Use fmt.Sprintf("%v", variable)
to cast interface{}
to string if you know the object is a string type