go 中的字符串是一个内建数据类型。字符串虽然是字符序列,但并不是一个字符数组。可以创建新的 字符串,
但是不能改变字符串。不过我们可以通过新的字符串来达到想改变字符串的目的。 下面列举"strings.go"例子说明
字符串的常见用法:
11 s := "hello"
12 if s[1] != 'e' { os.Exit(1) }
13 s = "good bye"
14 var p *string = &s
15 *p = "ciao"
不管如何,试图修改字符串的做法都是被禁止的:
s[0] = 'x';
(*p)[1] = 'y';
Go 中的字符串和 C++中的"const strings"概念类似,字符串指针则相当于 C++中的"const strings" 引用。
是的,它们都是指针,但是 Go 中用法更简单一些。
数组的声明如下:
var arrayOfInt [10]int;
数组和字符串一样也是一个值对象,不过数组的元素是可以修改的。不同于 C 语言的是:"int" 类型数组
"arrayOfInt"并不能转化为"int"指针。因为,在 Go 语言中数组是一个值对象,它在内部保存"int"指针。
数组的大小是数组类型的一部分。我们还可以通过 slice(切片) 类型的变量来访问数组。 首先,数据元素的类
型要和 slice(切片)类型相同,然后通过"a: high" 类似的 语法来关联数组的 low 到 heigh-1 的子区间元素。
Slices 和数组的声明语法类似,但是不像数组那样 要指定元素的个数(""和"10"的区别);它在内部引用特定的
空间,或者其它数组的空间。 如果多个 Slices 引用同一个数组,则可以共享数组的空间。但是不同数组之间是无
法共享内存空间的。
在 Go 语言中 Slices 比数组使用的更为普遍,因为它更有弹性,引用的语法也使得它效率很高。 但是,Slices 缺
少对内存的绝对控制比数组要差一些。例如你只是想要一个可以存放 100 个元素 的空间,那么你就可以选择数组
了。创建数组:
[3]int{1,2,3}
上面的语句创建一个含有 3 个元素的 int 数组。
当需要传递一个数组给函数时,你应该将函数的参数定义为一个 Slice 。这样,在调用函数的时候, 数组将被自
动转换为 slice 传入。
比如以下函数以 slices 类型为参数(来自"sum.go"):
09 func sum(a []int) int { // returns an int
10 s := 0
11 for i := 0; i < len(a); i++ {
12 s += a[i]
13 }
14 return s
15 }
函数的返回值类型(int)在 sum()函数的参数列表后面定义。
为了调用 sum 函数,我们需要一个 slice 作为参数。我们先创建一个数组,然后将数组转为 slice 类型:
s := sum([3]int{1,2,3}[:])
如果你创建一个初始化的数组,你可以让编译器自动计算数组的元素数目,只要在数组大小中填写"..." 就 可以了:
s := sum([...]int{1,2,3}[:])
是实际编码中,如果不关心内存的具体细节,可以用 slice 类型(省略数组的大小)来代替数组地址为函数参数:
s := sum([]int{1,2,3});
还有 map 类型,可以用以下代码初始化: