英文:
Need to translate code using "exp/utf8string" into later standard library code
问题
我正在尝试运行《The Go Programming Language Phrasebook》中的一个示例,该书是在2012年编写的,基于Go 1.0。该示例使用了exp/utf8string
包,但现在已经变成了unicode/utf8
包。我目前使用的是Go 1.2.1,下面列出的代码无法编译,因为exp/utf8string
包已经废弃了:
package main
import "strings"
import "unicode"
import "exp/utf8string"
import "fmt"
func main() {
str := "\tthe important rôles of utf8 text\n"
str = strings.TrimFunc(str, unicode.IsSpace)
// The wrong way
fmt.Printf("%s\n", str[0:len(str)/2])
// The right way
u8 := utf8string.NewString(str)
FirstHalf := u8.Slice(0, u8.RuneCount()/2)
fmt.Printf("%s\n", FirstHalf)
}
作为GoLang的新手,我不确定旧的实验性包是如何集成到标准库中的。我进行了一些研究,发现utf8string.NewString(str)
现在是expvar.NewString(str)
,所以我将导入语句修改为:
import "expvar"
import "unicode"
并相应地修改了代码以调用expvar.NewString(str)
,但仍然出现了两个错误:
u8.Slice未定义(*expvar.String类型没有Slice字段或方法)
u8.RuneCount未定义(*expvar.String类型没有RuneCount字段或方法)
我尝试了几种不同的方法,但似乎无法使其正常工作。
请问如何修改这个示例代码以适用于GoLang 1.2.1?
英文:
I am trying to ran an example from The Go Programming Language Phrasebook - the book was written in 2012, based on Go 1.0 . The example uses the exp/utf8string
package, which has now become unicode/utf8
. I am currently using Go 1.2.1 and code listed below will not compile as is, since the exp/utf8string
package is now defunct:
package main
import "strings"
import "unicode"
import "exp/utf8string"
import "fmt"
func main()
{
str := "\tthe important rôles of utf8 text\n"
str = strings.TrimFunc(str, unicode.IsSpace)
// The wrong way
fmt.Printf("%s\n", str[0:len(str)/2])
// The right way
u8 := utf8string.NewString(str)
FirstHalf := u8.Slice(0, u8.RuneCount()/2)
fmt.Printf("%s\n", FirstHalf)
}
I am a still a GoLang newbie, so I'm not sure how the older experimental packages were integrated into the standard library. I did a bit of research and found that utf8string.NewString(str)
is nowexpvar.NewString(str)
, so I changed my imports to
expvar
unicode
and modified the code appropriately to call expvar.NewString(str)
,but I'm still getting two errors:
u8.Slice undefined (type *expvar.String has no field or method Slice)
u8.RuneCount undefined (type *expvar.String has no field or method RuneCount)
I've tried a few different ways but can't seem to get it to work.
How should this example code be written for GoLang 1.2.1?
答案1
得分: 4
安装utf8string
包:
$ go get -v code.google.com/p/go.exp/utf8string
code.google.com/p/go.exp (下载)
code.google.com/p/go.exp/utf8string
$
修复程序:
package main
import (
"fmt"
"strings"
"unicode"
"code.google.com/p/go.exp/utf8string"
)
func main() {
str := "\tthe important rôles of utf8 text\n"
str = strings.TrimFunc(str, unicode.IsSpace)
// 错误的方式
fmt.Printf("%s\n", str[0:len(str)/2])
// 正确的方式
u8 := utf8string.NewString(str)
FirstHalf := u8.Slice(0, u8.RuneCount()/2)
fmt.Printf("%s\n", FirstHalf)
}
输出:
the important r
the important rô
将程序修改为仅使用Go 1.2.1标准包:
package main
import (
"fmt"
"strings"
)
func main() {
str := "\tthe important rôles of utf8 text\n"
str = strings.TrimSpace(str)
// 错误的方式
fmt.Printf("%s\n", str[0:len(str)/2])
// 正确的方式
r := []rune(str)
FirstHalf := string(r[:len(r)/2])
fmt.Printf("%s\n", FirstHalf)
}
输出:
the important r
the important rô
英文:
Install package utf8string
:
$ go get -v code.google.com/p/go.exp/utf8string
code.google.com/p/go.exp (download)
code.google.com/p/go.exp/utf8string
$
Fix the program:
package main
import (
"fmt"
"strings"
"unicode"
"code.google.com/p/go.exp/utf8string"
)
func main() {
str := "\tthe important rôles of utf8 text\n"
str = strings.TrimFunc(str, unicode.IsSpace)
// The wrong way
fmt.Printf("%s\n", str[0:len(str)/2])
// The right way
u8 := utf8string.NewString(str)
FirstHalf := u8.Slice(0, u8.RuneCount()/2)
fmt.Printf("%s\n", FirstHalf)
}
Output:
the important r
the important rô
Revising the program to only use Go 1.2.1 standard packages:
package main
import (
"fmt"
"strings"
)
func main() {
str := "\tthe important rôles of utf8 text\n"
str = strings.TrimSpace(str)
// The wrong way
fmt.Printf("%s\n", str[0:len(str)/2])
// The right way
r := []rune(str)
FirstHalf := string(r[:len(r)/2])
fmt.Printf("%s\n", FirstHalf)
}
Output:
the important r
the important rô
答案2
得分: 0
只需使用UTF8包(http://golang.org/pkg/unicode/utf8/)。
- utf8.RuneCountInString - http://golang.org/pkg/unicode/utf8/#RuneCountInString
这个示例非常奇怪,因为没有必要调用"NewString"来创建一个UTF8字符串——在Go中,默认情况下所有的字符串都是UTF8的。
我建议找到另一个资源,因为这个短语手册似乎过时得误导人。
可以尝试使用"Go By Example"和"Way To Go"。
英文:
Just use the UTF8 package (http://golang.org/pkg/unicode/utf8/)
- utf8.RuneCountInString - http://golang.org/pkg/unicode/utf8/#RuneCountInString
The example is extremely odd because there's no need to call "NewString" to create a UTF8 string—all strings in Go are UTF8 by default.
I'd suggest finding another resource since that Phrasebook seems so out of date as to be misleading.
Try "Go By Example" and "Way To Go".
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论