2014-11-05 2 views
0

Я пытаюсь изменить существующую строку в Go, но я получаю эту ошибку «не может назначить new_str [я]»Как назначить новый символ в строке в Go?

package main 
import "fmt" 

func ToUpper(str string) string { 
    new_str := str 
    for i:=0; i<len(str); i++{ 
     if str[i]>='a' && str[i]<='z'{ 
      chr:=uint8(rune(str[i])-'a'+'A') 
      new_str[i]=chr 
     } 
    } 
    return new_str 
} 

func main() { 
    fmt.Println(ToUpper("cdsrgGDH7865fxgh")) 
} 

Это мой код, я хочу, чтобы изменить нижний регистр в верхний регистр, но я не могу изменить строку. Зачем? Как я могу его изменить?

P.S Я хочу использовать ТОЛЬКО пакет fmt!

Заранее спасибо.

+1

Есть ли какая-либо конкретная причина, почему вы не хотите использовать 'функцию strings.ToUpper' из стандартной библиотеки? –

ответ

4

Вы не можете ... они неизменяемы. От Golang Language Specification:

Строки неизменяемы: после создания невозможно изменить содержимое строки.

Однако вы можете бросить его к []byte ломтиком и изменить что:

func ToUpper(str string) string { 
    new_str := []byte(str) 
    for i := 0; i < len(str); i++ { 
     if str[i] >= 'a' && str[i] <= 'z' { 
      chr := uint8(rune(str[i]) - 'a' + 'A') 
      new_str[i] = chr 
     } 
    } 
    return string(new_str) 
} 

Рабочий пример: http://play.golang.org/p/uZ_Gui7cYl

3

В строках Go неизменны. Вот один очень плохой способ делать то, что вы хотите (playground)

package main 

import "fmt" 

func ToUpper(str string) string { 
    new_str := "" 
    for i := 0; i < len(str); i++ { 
     chr := str[i] 
     if chr >= 'a' && chr <= 'z' { 
      chr = chr - 'a' + 'A' 
     } 
     new_str += string(chr) 
    } 
    return new_str 
} 

func main() { 
    fmt.Println(ToUpper("cdsrgGDH7865fxgh")) 
} 

Это плохо, потому что

  • вы лечите вашу строку в качестве символов - что, если это UTF-8? Использование range str является способом пойти
  • добавления к строкам медленно - много распределений - на bytes.Buffer будет хорошая идеей
  • есть очень хорошая библиотека рутина, чтобы сделать это уже strings.ToUpper

Это стоит изучить линию new_str += string(chr) немного больше. Строки неизменяемы, поэтому это делает новую строку с chr на конце, она не расширяет старую строку. Это крайне неэффективно для длинных строк, поскольку выделенная память будет стремиться к квадрату длины строки.

В следующий раз просто используйте strings.ToUpper!

3

Используйте range и избегайте ненужных преобразований и распределений. Строки неизменяемы. Например,

package main 

import "fmt" 

func ToUpper(s string) string { 
    var b []byte 
    for i, c := range s { 
     if c >= 'a' && c <= 'z' { 
      if b == nil { 
       b = []byte(s) 
      } 
      b[i] = byte('A' + rune(c) - 'a') 
     } 
    } 
    if b == nil { 
     return s 
    } 
    return string(b) 
} 

func main() { 
    fmt.Println(ToUpper("cdsrgGDH7865fxgh")) 
} 

Выход:

 
CDSRGGDH7865FXGH