Thursday, January 7, 2010

golang中的字符串

golang的String type与python的basestring实例差不多.

immutable

python里str的情况:
In [3]: name = str("abcde")
In [4]: name[1]
Out[4]: 'b'
In [5]: name[1] = "3"
TypeError: 'str' object does not support item assignment

python里unicode的情况:
In [6]: name = unicode("abcde")
In [7]: name[2]
Out[7]: u'c'
In [8]: name[2] = u'f'
TypeError: 'unicode' object does not support item assignment

golang中的string类型也是immutable的:

func main() {

    var name string = "abcd";
    fmt.Printf("%c\n", name[2]);
    //这种修改将会产出错
    name[1] = 'c';
    //只能得到string变量的开始地址.
    fmt.Printf("%p\n", &name);
    //下面会报错, 因为不能求元素的地址!
    fmt.Prinft("%p\n", &name[2]);

}

string literals

在字符串上, golang使用三种符号:
1. 单引号: 与C一样, 表示是byte,
2. 双引号: 与C一样, 表示N种byte,  只是golang中不可以修改和求元素的地址.
3. 反引号: 不解释字符串的转义符.

python中也有这三种用法, 只是使用的表达方式:
1. 单(双)引号: 表示N种chr实例的集合
2. u开头的unicode string literals, 还没有发现golang有unicode string literals
3. r开头的string literals:

In [10]: print   r'a\nb'
a\nb

unicode问题

双引号得到的是不可修改的byte集. 不是unicode类型!

下面做一个测试, 先得到一个汉字的外码和unicode码:
In [14]: u'中'
Out[14]: u'\xe4\xb8\xad'
In [15]: unicode('中', "utf-8")
Out[15]: u'\u4e2d'

再看golang的代码:

func main() {
    var infomation string = "\u4e2d"; //使用unicode的标志法, 也无法改变string就是byte集的现实!
    fmt.Println( infomation );
    //是unicode吗? 答案:否
    fmt.Println( len( infomation ) );
    fmt.Printf("%x", infomation);
}

输出的結果是:

3
e4b8ad

golang中怎么样python一样, 有unicode string literals呢? 答案: 没有!

只有使用函数得到。


No comments:

Post a Comment

Note: Only a member of this blog may post a comment.