为何广州市越秀区建设局网站上的WordPress文章在数据库中找不到?
摘要:广州市越秀区建设局网站,wordpress文章为啥数据库中找不到,什么静态网站容易做,微信二维码生成器Slice slice 翻译成中文就是切片,它和数组(array&am
广州市越秀区建设局网站,wordpress文章为啥数据库中找不到,什么静态网站容易做,微信二维码生成器Slice
slice 翻译成中文就是切片#xff0c;它和数组#xff08;array#xff09;很类似#xff0c;可以用下标的方式进行访问#xff0c;如果越界#xff0c;就会产生 panic。但是它比数组更灵活#xff0c;可以自动地进行扩容。
了解 slice 的本质, 最简单的方法就是…Slice
slice 翻译成中文就是切片它和数组array很类似可以用下标的方式进行访问如果越界就会产生 panic。但是它比数组更灵活可以自动地进行扩容。
了解 slice 的本质, 最简单的方法就是看它的源码:
// runtime/slice.go
type slice struct {array unsafe.Pointer // 元素指针len int // 长度 cap int // 容量
}
slice 共有三个属性:
指针 指向底层数组长度 表示切片可用元素的个数也就是说使用下标对 slice 的元素进行访问时下标不能超过 slice 的长度容量 底层数组的元素个数容量 长度。在底层数组不进行扩容的情况下容量也是 slice 可以扩张的最大限度。 注意: 底层数组是可以被多个 slice 同时指向的因此对一个 slice 的元素进行操作是有可能影响到其他 slice 的。
slice 创建
方式代码示例直接声明var slice []intnewslice : *new([]int)字面量slice : []int{1,2,3,4}makeslice : make(int[], 5, 10)从切片或者数组截取slice : array[1:5] 或 slice : sourceSlice[1:5]
直接声明
第一种创建出来的 slice 其实是一个 nil slice。它的长度和容量都为0。和nil比较的结果为true。
这里比较混淆的是empty slice它的长度和容量也都为0但是所有的空切片的数据指针都指向同一个地址 0xc42003bda0。空切片和 nil 比较的结果为false。
创建方式nil切片空切片方式一var s1 []intvar s2 []int{}方式二var s4 *new([]int)var s3 make([]int, 0)len00cap00和 nil 比较truefalse
nil 切片和空切片很相似长度和容量都是0官方建议尽量使用 nil 切片。
关于nil slice和empty slice的探索可以参考 - 深度解析 Go 语言中「切片」的三种特殊状态
字面量
比较简单直接用初始化表达式创建。
package mainimport fmtfunc main() {s1 : []int{0, 1, 2, 3, 8: 100}fmt.Println(s1, len(s1), cap(s1))
}运行结果 [0 1 2 3 0 0 0 0 100] 9 9
唯一值得注意的是上面的代码例子中使用了索引号直接赋值这样其他未注明的元素则默认 0 值
make
make 函数需要传入三个参数切片类型长度容量。当然容量可以不传默认和长度相等。
使用 make 关键字创建 slice:
packge main
import fmtfunc main(){// 长度为 5, 容量为 10slice : make(int[], 5, 10)// 索引为 2 的元素赋值为 2slice[2] 2 fmt.Println(slice)
}
截取
截取也是比较常见的一种创建 slice 的方法可以从数组或者 slice 直接截取当然需要指定起止索引位置。
基于已有 slice 创建新 slice 对象被称为 reslice。新 slice 和老 slice 共用底层数组新老 slice 对底层数组的更改都会影响到彼此。
基于数组创建的新 slice 对象也是同样的效果对数组或 slice 元素作的更改都会影响到彼此。
值得注意的是新老 slice 或者新 slice 老数组互相影响的前提是两者共用底层数组如果因为执行 append 操作使得新 slice 底层数组扩容移动到了新的位置两者就不会相互影响了。所以问题的关键在于两者是否会共用底层数组。
