【建站服务】怒江设计网页公司-域名申请
作者: 风兰 . 阅读量: 6 . 发表时间:2022-09-21 05:52:24
上往建站提供服务器空间服务商,百度快照排名,网站托管,百度推广运营,致力于设计外包服务与源代码定制开发,360推广,搜狗推广,增加网站的能见度及访问量提升网络营销的效果,主营:网站公司,百度推广公司电话,官网搭建服务,网站服务企业排名,服务器空间,英文域名等业务,专业团队服务,效果好。
怒江设计网页公司

tSlice(slice)
array[1] = 100
printSlice(slice)
}
func printSlice(x []int){
fmt.Printf("len=%d cap=%d slice=%v ", len(x), cap(x), x)
}
以上代码执行输出结果为:
len=5 cap=5 slice=[1 2 3 4 5]
len=4 cap=4 slice=[2 3 4 5]
len=4 cap=4 slice=[100 3 4 5]
Noah
Noah
lh_***9@126.com
3年前 (2019-05-05)
gibson1112
185***72536@163.com
48
切片内部结构:
struct Slice
{
byte* array; // actual data
uintgo len; // number of elements
uintgo cap; // allocated number of elements
};
第一个字段表示 array 的指针,是真实数据的指针第二个是表示 slice 的长度,第三个是表示 slice 的容量。
所以 unsafe.Sizeof(切片)永远都是 24。
当把 slice 作为参数,本身传递的是值,但其内容就 byte* array,实际传递的是引用,所以可以在函数内部修改,但如果对 slice 本身做 append,而且导致 slice 进行了扩容,实际扩容的是函数内复制的一份切片,对于函数外面的切片没有变化。
package main
import (
"fmt"
"unsafe"
)
func main() {
slice_test := []int{1, 2, 3, 4, 5}
fmt.Println(unsafe.Sizeof(slice_test))
fmt.Printf("main:%#v,%#v,%#v ", slice_test, len(slice_test), cap(slice_test))
slice_value(slice_test)
fmt.Printf("main:%#v,%#v,%#v ", slice_test, len(slice_test), cap(slice_test))
slice_ptr(&slice_test)
fmt.Printf("main:%#v,%#v,%#v ", slice_test, len(slice_test), cap(slice_test))
fmt.Println(unsafe.Sizeof(slice_test))
}
func slice_value(slice_test []int) {
slice_test[1] = 100 // 函数外的slice确实有被修改
slice_test = append(slice_test, 6) // 函数外的不变
fmt.Printf("slice_value:%#v,%#v,%#v ", slice_test, len(slice_test), cap(slice_test))
}
func slice_ptr(slice_test *[]int) { // 这样才能修改函数外的slice
*slice_test = append(*slice_test, 7)
fmt.Printf("slice_ptr:%#v,%#v,%#v ", *slice_test, len(*slice_test), cap(*slice_test))
}
结果如下:
24
main:[]int{1, 2, 3, 4, 5},5,5
slice_value:[]int{1, 100, 3, 4, 5, 6},6,10
main:[]int{1, 100, 3, 4, 5},5,5
slice_ptr:[]int{1, 100, 3, 4, 5, 7},6,10
main:[]int{1, 100, 3, 4, 5, 7},6,10
24
gibson1112
gibson1112
185***72536@163.com
3年前 (2019-05-21)
ragonli
rag***ig@gmail.com
13
slice 的底层是数组指针,所以 slice a 和 s 指向的是同一个底层数组,所以当修改 s[0] 时,a 也会被修改。
package main
import "fmt"
func main() {
s := []int{1, 2, 3} // len=3, cap=3
a := s
s[0] = 888
s = append(s, 4)
fmt.Println(a, len(a), cap(a)) // 输出:[888 2 3] 3 3
fmt.Println(s, len(s), cap(s)) // 输出:[888 2 3 4] 4 6
}
上往建站提供搭建网站,域名注册,官网备案服务,网店详情页设计,企业网店,专业网络店铺管理运营全托管公司咨询电话,服务器空间,微信公众号托管,网页美工排版,致力于域名申请,竞价托管,软文推广,全网营销,提供标准级专业技术保障,了却后顾之忧,主营:虚拟主机,网站推广,百度竞价托管,网站建设,上网建站推广服务,网络公司有哪些等业务,专业团队服务,效果好。
服务热线:400-111-6878 手机微信同号:18118153152(各城市商务人员可上门服务)
关键词:网站建设,企业网站,网站制作,网页设计,高端网站建设,企业网站制作,网页制作,制作网站,网站设计,高端网页设计,高端网站设计,做网站,自适应网站



func main(){ changeSliceTest()}func changeSliceTest() { arr1 := []int{1, 2, 3} arr2 := [3]int{1, 2, 3} arr3 := [3]int{1, 2, 3} fmt.Println("before change arr1, ", arr1) changeSlice(arr1) // slice 按引用传递 fmt.Println("after change arr1, ", arr1) fmt.Println("before change arr2, ", arr2) changeArray(arr2) // array 按值传递 fmt.Println("after change arr2, ", arr2) fmt.Println("before change arr3, ", arr3) changeArrayByPointer(&arr3) // 可以显式取array的 指针 fmt.Println("after change arr3, ", arr3)}func changeSlice(arr []int) { arr[0] = 9999}func changeArray(arr [3]int) { arr[0] = 6666}func changeArrayByPointer(arr *[3]int) { arr[0] = 6666}输出结果为:
lslxdx
lsl***@163.com
berakcup
104***3071@qq.com
append() 和 copy() 部分,貌似有没说明白的地方。
当 numbers = [0, 1] 时,append(numbers, 2, 3, 4) 为什么 cap 从 2 变成 6 ?
经过实践得知,append(list, [params]),先判断 list 的 cap 长度是否大于等于 len(list) + len([params]),如果大于那么 cap 不变,否则 cap 等于 max{cap(list), cap[params]},所以当 append(numbers, 2, 3, 4) cap 从 2 变成 6。
berakcup
104***3071@qq.com
andriyy
ano***ous@abc.com
使用 copy 函数要注意对于 copy(dst, src),要初始化 dst 的 size,否则无法复制。
错误示例:
dst := make([]int, 0)src := []int{1, 2, 3}copy(dst, src)printSlice(src)printSlice(dst)func printSlice(x []int){ fmt.Printf("len=%d cap=%d slice=%v ",len(x),cap(x),x)}输出结果:
正确示例:
dst := make([]int, 3) // 令size=3src := []int{1, 2, 3}copy(dst, src)printSlice(src)printSlice(dst)输出结果:
andriyy
ano***ous@abc.com
Noah
lh_***9@126.com
实例:
package mainimport "fmt"func main() { var array = []int{1, 2, 3, 4, 5} printSlice(array) slice := array[1:] printSlice(slice) array[1] = 100 printSlice(slice)}func printSlice(x []int){ fmt.Printf("len=%d cap=%d slice=%v ", len(x), cap(x), x)}以上代码执行输出结果为: