// Playground for https://stackoverflow.com/a/56699658/11458991
package main
import (
"fmt"
"errors"
"log"
"reflect"
"strings"
)
// RowID stores the ID of a single row in a table. An ID can be a composite of multiple columns
type RowID []string
// String implements Stringer interface for RowID
func (r RowID) String() string {
return fmt.Sprintf("[%s]", strings.Join(r, ", "))
}
func castToStringerSlice(iface interface{}) ([]fmt.Stringer, bool /* ok */) {
if reflect.TypeOf(iface).Kind() != reflect.Slice {
return nil, false
}
v := reflect.ValueOf(iface)
stringers := make([]fmt.Stringer, v.Len())
for i := 0; i < v.Len(); i++ {
stringers[i] = v.Index(i)
}
return stringers, true
}
func PrintChanges(iface_ids interface{}) {
ids, ok := castToStringerSlice(iface_ids)
if !ok {
log.
Fatal(errors.
New("the argument to PrintChanges must be a slice of Stringers")) }
for _, id := range ids {
fmt.Println(id)
}
}
func PrintChange(id fmt.Stringer) {
fmt.Println(id)
}
func main() {
rowIDs := []RowID{
{"1", "2"},
{"22"},
}
PrintChange(rowIDs[0])
PrintChanges(rowIDs)
}
Ly8gUGxheWdyb3VuZCBmb3IgaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzU2Njk5NjU4LzExNDU4OTkxCgpwYWNrYWdlIG1haW4KCmltcG9ydCAoCgkiZm10IgoJImVycm9ycyIKCSJsb2ciCgkicmVmbGVjdCIKCSJzdHJpbmdzIgopCgovLyBSb3dJRCBzdG9yZXMgdGhlIElEIG9mIGEgc2luZ2xlIHJvdyBpbiBhIHRhYmxlLiBBbiBJRCBjYW4gYmUgYSBjb21wb3NpdGUgb2YgbXVsdGlwbGUgY29sdW1ucwp0eXBlIFJvd0lEIFtdc3RyaW5nCgovLyBTdHJpbmcgaW1wbGVtZW50cyBTdHJpbmdlciBpbnRlcmZhY2UgZm9yIFJvd0lECmZ1bmMgKHIgUm93SUQpIFN0cmluZygpIHN0cmluZyB7CglyZXR1cm4gZm10LlNwcmludGYoIlslc10iLCBzdHJpbmdzLkpvaW4ociwgIiwgIikpCn0KCmZ1bmMgY2FzdFRvU3RyaW5nZXJTbGljZShpZmFjZSBpbnRlcmZhY2V7fSkgKFtdZm10LlN0cmluZ2VyLCBib29sIC8qIG9rICovKSB7CglpZiByZWZsZWN0LlR5cGVPZihpZmFjZSkuS2luZCgpICE9IHJlZmxlY3QuU2xpY2UgewoJCXJldHVybiBuaWwsIGZhbHNlCgl9CgkKICAgIHYgOj0gcmVmbGVjdC5WYWx1ZU9mKGlmYWNlKQoJc3RyaW5nZXJzIDo9IG1ha2UoW11mbXQuU3RyaW5nZXIsIHYuTGVuKCkpCgogICAgZm9yIGkgOj0gMDsgaSA8IHYuTGVuKCk7IGkrKyB7CiAgICAgICAgc3RyaW5nZXJzW2ldID0gdi5JbmRleChpKQogICAgfQogICAgCiAgICByZXR1cm4gc3RyaW5nZXJzLCB0cnVlCn0KCmZ1bmMgUHJpbnRDaGFuZ2VzKGlmYWNlX2lkcyBpbnRlcmZhY2V7fSkgewoJaWRzLCBvayA6PSBjYXN0VG9TdHJpbmdlclNsaWNlKGlmYWNlX2lkcykKCWlmICFvayB7CgkJbG9nLkZhdGFsKGVycm9ycy5OZXcoInRoZSBhcmd1bWVudCB0byBQcmludENoYW5nZXMgbXVzdCBiZSBhIHNsaWNlIG9mIFN0cmluZ2VycyIpKQoJfQoJZm9yIF8sIGlkIDo9IHJhbmdlIGlkcyB7CgkJZm10LlByaW50bG4oaWQpCgl9Cn0KCmZ1bmMgUHJpbnRDaGFuZ2UoaWQgZm10LlN0cmluZ2VyKSB7CglmbXQuUHJpbnRsbihpZCkKfQoKZnVuYyBtYWluKCkgewoJcm93SURzIDo9IFtdUm93SUR7CgkJeyIxIiwgIjIifSwKCQl7IjIyIn0sCgl9CgoJUHJpbnRDaGFuZ2Uocm93SURzWzBdKQoJCglQcmludENoYW5nZXMocm93SURzKQp9