Hi community,

I try to use slice of any to imitate the tuple type, 
and use this function to compare two slices: a, b.

How can I improve it?

Thanks

```

package tuple2

func Cmp(a, b []any) (int, bool) {
        for i := 0; i != min(len(a), len(b)); i++ {
                if a[i] == nil && b[i] != nil {
                        return -1, true
                }
                if a[i] != nil && b[i] == nil {
                        return 1, true
                }

                a_bool, a_bool_ok := a[i].(bool)
                a_string, a_string_ok := a[i].(string)
                a_int, a_int_ok := a[i].(int)
                a_float64, a_float64_ok := a[i].(float64)

                b_bool, b_bool_ok := b[i].(bool)
                b_string, b_string_ok := b[i].(string)
                b_int, b_int_ok := b[i].(int)
                b_float64, b_float64_ok := b[i].(float64)

                one_side_bool := a_bool_ok != b_bool_ok
                one_side_string := a_string_ok != b_string_ok
                one_side_int := a_int_ok != b_int_ok
                one_side_float64 := a_float64_ok != b_float64_ok

                both_side_diff := one_side_bool || one_side_string || 
one_side_int || one_side_float64
                both_side_numeric := (a_int_ok || a_float64_ok) && 
(b_int_ok || b_float64_ok)

                if both_side_diff && !both_side_numeric {
                        return 0, false
                }

                if both_side_numeric {
                        if a_int_ok && b_int_ok {
                                if a_int < b_int {
                                        return -1, true
                                }
                                if a_int > b_int {
                                        return 1, true
                                }
                        }
                        if a_float64_ok && b_float64_ok {
                                if a_float64 < b_float64 {
                                        return -1, true
                                }
                                if a_float64 > b_float64 {
                                        return 1, true
                                }
                        }
                        if a_int_ok && b_float64_ok {
                                if float64(a_int) < b_float64 {
                                        return -1, true
                                }
                                if float64(a_int) > b_float64 {
                                        return 1, true
                                }
                        }
                        if a_float64_ok && b_int_ok {
                                if a_float64 < float64(b_int) {
                                        return -1, true
                                }
                                if a_float64 > float64(b_int) {
                                        return 1, true
                                }
                        }
                }

                if a_bool_ok && b_bool_ok {
                        if !a_bool && b_bool {
                                return -1, true
                        }
                        if a_bool && !b_bool {
                                return 1, true
                        }
                }
                if a_string_ok && b_string_ok {
                        if a_string < b_string {
                                return -1, true
                        }
                        if a_string > b_string {
                                return 1, true
                        }
                }
        }

        if len(a) < len(b) {
                return -1, true
        }
        if len(a) > len(b) {
                return 1, true
        }

        return 0, true
}

/*
func main() {
        a := []any{1, "hello", 3.14, true}
        b := []any{1, "hello", 3.14, true}
        c, ok := tuple2.Cmp(a, b)
        println(c, ok)
}
*/

```

Is it possible for golang to have tuple in golang 2.
With tuple golang will be even more modern language.

It is very convenient to implement custom comparison operators 
for user types with tuple, like this in c++:

```

struct T{
    std::string name;
    int num;
};

bool operator== (const T &a, const T &b){
    return std::tuple{a.name, a.num} == std::tuple{b.name, b.num};
}

bool operator< (T &a, T &b){
    return std::tuple{a.name, a.num} < std::tuple{b.name, b.num};
}

int main() {
    T a{"aaa", 100}, b{"bbb", 200};
    std::cout << (a == b) << "\n";
    std::cout << (a < b) << "\n";
    
    return 0;
}

```

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/golang-nuts/tencent_3C18CCC635932E7915B10343A3F95DC12708%40qq.com.

Reply via email to