2015-07-10 2 views
-1

Я хотел бы написать программу, которая получит массив (из строки, int или что-то еще) и создать другой массив того же типа, содержащий только первый элемент.Воспроизведение массива того же типа

Например:

для массива строк arr := []string("hello", "world")

мой выход будет arr2 := []string(arr[0]);

Я не могу использовать функцию копирования, так как сделать это, я бы создать (сделать) новый кусочек для него. И в этом случае мне все еще нужно выяснить, какой тип первого массива (строка, int, bool и т. Д.)

Возможно, я мог бы использовать reflect.TypeOf(), но я все равно не знаю, как использовать этот информацию для создания одного и того же типа среза или массива.

Я не собираюсь использовать условные обозначения для этого. Например:

if reflect.TypeOf(arr) == []int { 
    arr := []int(arr[0]) 
} else if reflect.TypeOf(arr) == []string 
    arr := []string(arr[0]) 
} ... 

Я был бы рад получить помощь там. Спасибо заранее.

ответ

2

Вы можете просто subslice на месте:

s2 := s1[0:1] 

Но если вам действительно нужно, чтобы создать новый кусок, вы можете сделать это следующим образом:

func f(s interface{}) interface{} { 
    v := reflect.ValueOf(s) 
    t := v.Type() 
    res := reflect.MakeSlice(t, 1, 1) 
    res.Index(0).Set(v.Index(0)) 
    return res.Interface() 
} 

Экспозиция: http://play.golang.org/p/w1N3pgvAwr.

+0

Спасибо. Я попытался использовать s2: = s1 [: 1], но на Go Playground, и для этого я получил ошибку. Но я попробовал сейчас на своем компьютере, и да, это решение работает просто отлично! Еще раз спасибо. –

Смежные вопросы