在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
数组数组的定义: 数组是具有固定长度并拥有零个或者多个相同数据类型元素的序列 定义一个数组的方法: 例子: 像上面这种定义方法,我们是指定了数组的长度,但是还有如下定义方法: 数组中的每个元素是通过索引来访问,索引是从0开始 这里需要知道:数组的长度也是数组类型的一部分,所以要知道[3]int和[4]int是不同的数组类型 默认情况下一个新数组中的元素初始值为元素类型的零值 初始化数组: 有一下几种方法: 关于数组的类型: 数组的遍历 数组的遍历方法: 二维数组 var a[3][2] 其实二维数组可以通过excel表格理解,就是几行几列的问题,像上面的这个例子就是一个3行2列的二维数组。 关于数组的比较 如果两个数组的元素类型相同是可以相互比较的,例如数组a:= [2]int{1,2}和数组b:=[2]int{3,4} 通过下面的例子演示更加清晰: a := [2]int{1, 2} b := [...]int{1, 2} c := [2]int{3, 2} d := [3]int{1, 2} fmt.Println(a == b, a == c, b == c) fmt.Println(a == d) 上面的例子中第一个打印的结果是true,false,false,而当添加第二个打印的时候,就无法编译过去,因为两者是不能比较的 切片slice定义 slice 表示一个拥有相同类型元素的可变长的序列 定义一个slice其实和定义一个数组非常类似 和数组对比slice似乎就是一个没有长度的数组 slice的初始化 var b[] int = []int{1,2,3,4} 同样遍历切片和数组是一模一样的 通过把数组和slice对比我们其实可以发现,两者其实非常类似,当然两者也确实有着紧密的关系 slice的底层实现就是一个数组,通常我们会叫做slice的底层数组。 指针指向数组的第一个可以从slice中访问的元素,这个元素不一定是数组的第一个元素 这样我们也可以很容易得到c的长度是3,容量是5 slice创建 内置函数make可以创建一个具有指定元素类型、长度和容量的slice,其中容量参数可以省略,这样默认slice的长度和容量就相等了 make([]type,len,cap) 现在说说关于: 其实make创建了一个无名数组并返回了它的一个slice;这个数组仅可以通过slice来访问。 关于copy 该函数主要是切片(slice)的拷贝,不支持数组 通过下面例子便于理解: s1 := []int{1, 2, 3, 7, 8} s2 := []int{4, 5, 6} copy(s2, s1) fmt.Printf("%#v\n", s2) 这样打印s2的结果就是:[]int{1, 2, 3} s1 := []int{1, 2, 3, 7, 8} s2 := []int{4, 5, 6} copy(s1, s2) fmt.Printf("%#v\n", s1) 这样打印s1的结果为:[]int{4, 5, 6, 7, 8} 关于append 内置的函数append可以把元素追加到slice的后面 通过下面例子理解,把“hello go”每个字符循环添加到一个slice中 var runnes []rune for _, v := range "hello,go" { runnes = append(runnes, v) } fmt.Printf("%q\n", runnes) 例子2直接在一个已经有元素的slice追加 s1 := []int{1, 2, 3} s1 = append(s1, 4, 5) fmt.Printf("%#v\n", s1) 如果想要把另外一个slice也直接append到现在的slice中: s1 := []int{1, 2, 3} s2 := []int{4, 5} s1 = append(s1, s2...) fmt.Printf("%#v\n", s1) 这里在s2后面通过...其实就是把s2中的元素给展开然后在append进s1中 其实append函数对于理解slice的工作原理是非常重要的,下面是一个为[]int数组slice定义的一个方法: func appendInt(x []int, y int) []int { var z []int zlen := len(x) + 1 if zlen <= cap(x) { //slice仍有增长空间扩展slice内容 z = x[:zlen] } else { //slice 已经没有空间,为他分配一个新的底层数组 //当然实际go底层扩展的时候的策略可能复杂的多,这里是通过扩展一倍为例子 zcap := zlen if zcap < 2*len(x) { zcap = 2 * len(x) } z = make([]int, zlen, zcap) copy(z, x) } z[len(x)] = y return z 从上面的这个方法可以看出: 关于切片的比较 和数组不同的是,切片是无法比较的,因此不能通过==来比较两个切片是否拥有相同的元素 下面是整理的练习切片使用的例子 如何修改一个字符串? package main import ( "fmt" ) func changeString(str1 string) { var runnes = []rune(str1) runnes[0] = 'h' res := string(runnes) fmt.Println(res) } func main() { changeString("Hello,Go") } 这里是把开头的大写的h换成了小写 再看一个例子: func reverseStr(str1 string) { var runes = []rune(str1) var res string for i := len(runes) - 1; i >= 0; i-- { res += string(runes[i]) } fmt.Println(res) } 上面这个方法就可以实现对字符串的反转,当然方法不止一种,下面也是一种方法 func reverseStr2(str1 string) { var runes = []rune(str1) for i, j := 0, len(runes)-1; i < j; i, j = i+1, j-1 { runes[i], runes[j] = runes[j], runes[i] } res := string(runes) fmt.Println(res) } 上面的方法中我一直在用到rune,这个东西是什么东西呢?接着看 GO当中的:string rune,byte 在Go当中的字符换string 底层是用byte数组存的,并且是不可改变的 我们通过下面的代码例子来理解一下: var a = "我爱你go" 上面已经说了,字符串的底层是byte字节数组,所以我们通过len来计算长度的时候,其实就是获取的该数组的长度,而一个中文字符是占3个字节,所以上面的结果是11 var a = "我爱你go" 时间和日期类型当前时间:now:= time.Now() time.Now().Day() time.Now().Minute() time.Now().Month() time.Now().Year() time.Duration用来表示纳秒 一些常用的时间常量 const ( 注意:如果想要格式化时间的时候,要特别特别注意,只能通过如下方式格式化:
切片处理补充关于切片删除 代码例子: package main import "fmt" func main() { index := 2 var s = []int{10,15,8,20} s = append(s[:index],s[index+1:]...) fmt.Println(s) }
|
请发表评论