Как отличить значения rune и int32 в переключателе типов?

Имея следующий код

var v interface{}
v = rune(1)

switch v.(type) {
    case int32:
        fmt.Println("int32")
    case rune:
        fmt.Println("rune")
}

получаю ошибку компиляции

tmp/sandbox193184648/main.go:14: duplicate case rune in type switch
    previous case at tmp/sandbox193184648/main.go:12

Если вместо этого я заверну руну в свой собственный тип, переключатель типа компилируется и работает.

type myrune rune

var v interface{}
v = myrune(1)

switch v.(type) {
case int32:
    fmt.Println("int32")
case myrune:
    fmt.Println("rune")
}

см. https://play.golang.org/p/2lMRlpCLzX

Это почему? Как отличить руну и int32 в переключателе типов?


person user7610    schedule 14.03.2017    source источник
comment
Вы не можете. Они одного типа.   -  person JimB    schedule 14.03.2017


Ответы (1)


Это псевдоним для int32, видимо вы их не различаете. Если бы вам действительно нужно было определить свой собственный тип для переноса одного из них, то зачем вам это нужно?

Нет, их нельзя отличить. rune — это псевдоним для int32, а byte — это псевдоним для uint8.

https://groups.google.com/forum/m/#!searchin/golang-nuts/Rune/golang-nuts/jbWUrsQ-Uws

person Kenny Grant    schedule 14.03.2017
comment
Я хочу выделиться, чтобы мне было легче отлаживать вещи. При отладке я хочу, чтобы int32 отображалось как число, а rune — как символ в кавычках. Но, поскольку я не могу их различить, и rune, и int32 должны отображаться одинаково. Либо оба будут отображаться в виде чисел (по умолчанию для fmt.Sprintf("%#v", val)), либо оба будут отображаться в виде символов в кавычках (с использованием "%q"). Эти варианты просто странные, и я бы хотел, чтобы rune и int32 были действительно разными типами. - person Chaim Leib Halbert; 19.10.2017