2017-01-11 4 views
-2

Каков наилучший способ вернуть первые n символов в качестве подстроки строки, когда в строке нет n символов, просто верните строку.Возврат первых n символов строки

я могу сделать следующее:

func firstN(s string, n int) string { 
    if len(s) > n { 
      return s[:n] 
    } 
    return s 
} 

но есть уборщик путь?

BTW, в Scala, я могу просто сделать s take n.

+2

Нет, Go не Scala. Как 's берет n'" чище ", чем' firstN (s, n) '? – JimB

+1

Когда вы говорите символ, вы имеете в виду байт или руну? Код в вопросе выглядит хорошо для меня, если цель состоит в том, чтобы вернуть первые N байтов. Для возврата первых N рун требуется цикл. –

ответ

0

Это выглядит довольно чистым для меня. Я бы сделал то же самое.

2

Ваш кода прекрасно, если вы хотите работать с Юникодом:

fmt.Println(firstN("世界 Hello", 1)) // � 

Чтобы заставить его работать с юникодом вы можете изменить функцию следующим образом:

// allocation free version 
func firstN(s string, n int) string { 
    i := 0 
    for j := range s { 
     if i == n { 
      return s[:j] 
     } 
     i++ 
    } 
    return s 
} 
fmt.Println(firstN("世界 Hello", 1)) // 世 

// you can also convert a string to a slice of runes, but it will require additional memory allocations 
func firstN2(s string, n int) string { 
    r := []rune(s) 
    if len(r) > n { 
     return string(r[:n]) 
    } 
    return s 
} 
fmt.Println(firstN2("世界 Hello", 1)) // 世 
Смежные вопросы