go学习

dai_dai · · 1145 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

一个特殊的变量名是_(下划线)。任何赋给它的值都被丢弃。在这个例子中,将35赋值给b,同时丢弃34。

_, 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的结果是内存中新开辟一个区域存储新切片信息。



有疑问加站长微信联系(非本文作者)

本文来自:CSDN博客

感谢作者:dai_dai

查看原文:go学习

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1145 次点击  
加入收藏 微博
上一篇:go- 特点
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传