2014-11-05 36 views
0

我試圖改變圍棋現有的字符串,但我不斷收到此錯誤「不能分配給new_str [I]」如何在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'功能從標準庫? – 2014-11-06 03:05:16

回答

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

在圍棋字符串是不可變的。這是做的一個非常糟糕的方式你想要什麼(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 
相關問題