_, b := 34, 35
完整的整数类型列表(符号和无符号)是int8,int16,int32,int64 和byte,uint8,uint16,uint32,uint64。byte 是uint8 的别名。浮点类型的值有float32 和float64 (没有float 类型)。64 位的整数和浮点数总是64 位的,即便是在32 位的架构上。需要留意的是这些类型全部都是独立的,并且混合用这些类型向变量赋值会引起编译器错误,例如下面的代码:相似的类型都是独立的
package main
func main() {
var a int //通用整数类型
var b int32 //32 位整数类型
a = 1
b = a + a //混合这些类型是非法的
b = b + 5 // 5 是一个(未定义类型的)常量,所以这没问题
}
触发一个赋值错误:
types.go:7: cannot use a + a (type int) as type int32 in assignment
赋值可以用八进制、十六进制或科学计数法:077,0xFF,1e3 或者6.022e23 这些都
是合法的。
字符串
赋值字符串的例子:
s := "Hello World ! "
字符串在Go 中是UTF-8 的由双引号(”)包裹的字符序列。如果你使用单引号(’)则表示一个字符(UTF-8 编码)——这种在Go 中不是string。一旦给变量赋值,字符串就不能修改了:在Go 中字符串是不可变的。从C 来的用户,下面的情况在Go 中是非法的。
var s s t r i n g = "hello"
s[0] = 'c' 修改第一个字符为’c’,这会报错
在Go 中实现这个,需要下面的方法:
s := "hello"
c := []rune(s) ..0
c[0] = 'c' ..1
s2 := s t r i n g (c) ..2
fmt.Printf("%s\n", s2) ..3
..0 转换s 为rune 数组;
..1 修改数组的第一个元素;
..2 创建新的字符串s2 保存修改;
..3 用fmt.Printf 函数输出字符串。
rune
Rune 是int32 的别名。用UTF-8 进行编码。这个类型在什么时候使用呢?例如需要遍
历字符串中的字符。可以循环每个字节(仅在使用US ASCII 编码字符串时与字符等价,
而它们在Go 中不存在!)。因此为了获得实际的字符,需要使用rune 类型。
函数append 向slice s 追加零值或其他x 值,并且返回追加后的新的、与s有相同类型的slice。如果s 没有足够的容量存储追加的值,append 分配一个足够大的、新的slice 来存放原有slice 的元素和追加的值。因此,返回的slice 可能指向不同的底层array。
package main
import "fmt"
func main() {
s := [5]int{1, 2, 3, 4, 5}
s1 := s[1:3]
s2 := s[0:2]
fmt.Println(s1, s2)
// s1和s2指向同一个底层数组,copy只是数据上的变化,而没有影响到各个切片的指向位置!
copy(s2, s1)
fmt.Println(s, s1, s2)
s1[0] = 9
fmt.Println(s, s1, s2)
}
output:
[2 3] [1 2]
[2 3 3 4 5] [3 3] [2 3]
[2 9 3 4 5] [9 3] [2 9]
package main
import "fmt"
func main() {
s := [5]int{1, 2, 3, 4, 5}
s1 := s[1:3]
s2 := make([]int, 2) // make已经给s2分配好底层array的空间,并且用0填补array
fmt.Println(s2)
copy(s2, s1)
fmt.Println(s2)
s2[0] = 9
s1[0] = 99
fmt.Println(s1, s2)
}
output:
[0 0]
[2 3]
[99 3] [9 3]
COPY总结:copy(s2, s1)过程只是将切片s1指向底层array的数据copy至切片s2指向底层array的数据上
-------------------------------------------------------------------
package main
import "fmt"
func main() {
s := [5]int{1, 2, 3, 4, 5}
s1 := s[1:3]
s3 := append(s1, 9)
s3[0] = 99
fmt.Println(s, s1, s3)
arr := [5]int{1, 2, 3, 4, 5}
arr1 := arr[2:]
arr2 := append(arr1, 9)
arr2[0] = 99
fmt.Println(arr, arr1, arr2)
}
output:
[1 99 3 9 5] [99 3] [99 3 9]
[1 2 3 4 5] [3 4 5] [99 4 5 9]
APPEND总结:s2 := append(s1, *)是切片s1上记录的切片信息复制给s2,如果s1指向的底层array长度不够,append的过程会发生如下操作:内存中不仅新开辟一块区域存储append后的切片信息,而且需要新开辟一块区域存储底层array(复制原来的array至这块新array中),最后再append新数据进新array中,这样,s2指向新array。反之,s2和s1指向同一个array,append的结果是内存中新开辟一个区域存储新切片信息。
有疑问加站长微信联系(非本文作者)