go语言len函数 go语言reflect( 三 )


切片是否发生了逃逸,最终在堆上初始化 。如果切片小的话会先在栈或静态区进行创建 。
切片有一个数组的指针,len是指切片的长度, cap指的是切片的容量 。
cap是在初始化切片是生成的容量 。
发现切片的结构体是数组的地址指针array unsafe.Pointer,而Go中数组的地址代表数组结构体的地址 。
slice 中得到一块内存地址,array[0]或者unsafe.Pointer(array[0]) 。
也可以通过地址构造切片
nil切片:指的unsafe.Pointer 为nil
空切片:
创建的指针不为空,len和cap为空
当一个切片的容量满了,就需要扩容了 。怎么扩,策略是什么go语言len函数?
如果原来数组切片的容量已经达到了最大值,再想扩容,Go 默认会先开一片内存区域,把原来的值拷贝过来 , 然后再执行 append() 操作 。这种情况对现数组的地址和原数组地址不相同 。
从上面结果我们可以看到 , 如果用 range 的方式去遍历一个切片,拿到的 Value 其实是切片里面的值拷贝,即浅拷贝 。所以每次打印 Value 的地址都不变 。
由于 Value 是值拷贝的,并非引用传递 , 所以直接改 Value 是达不到更改原切片值的目的的,需要通过 slice[index] 获取真实的地址 。
MySQL中VARCHAR的单位 VARCHAR是MySQL中常用的数据类型 , 但其单位究竟是字符还是字节呢?
经过查阅,MySQL的官方文档给出了答案:
4.1及之后的版本,VARCHAR的单位是字符;4.1之前的版本 , VARCHAR的单位是字节 。(As of version4.1 , MySQL interprets length specifications in character column definitions incharacter units . (Before MySQL 4.1, column lengths were interpreted inbytes .) This applies to CHAR,VARCHARand the TEXT types.)
同时官方文档也提到,4.1及之后的版本以UTF-8作为预定义字符集 。(VARCHAR is shorthand for CHARACTER VARYING. NATIONAL VARCHAR is the standard SQL way to define that a VARCHAR column should use some predefined character set. MySQL 4.1 and up usesUTF8as thispredefined character set .)
在 Go 语言中,是不能用len函数来统计字符串中的字符个数的,这是因为在 Go 中 , 字符串是以 UTF-8 为格式进行存储的,在字符串上调用 len 函数,取得的是字符串包含的 byte 的个数 。
那么如何在Go语言中获取字符串中的字符个数呢?有下面几种方法:
测试发现速度最快的是utf8.RuneCountInString()
go语言数组,切片和字典的区别和联系、数组
与其他大多数语言类似go语言len函数,Go语言的数组也是一个元素类型相同的定长的序列 。
(1)数组的创建 。
数组有3种创建方式go语言len函数:[length]Type 、[N]Type{value1, value2, ... , valueN}、[...]Type{value1, value2, ... , valueN} 如下:
复制代码代码如下:
func test5() {
var iarray1 [5]int32
var iarray2 [5]int32 = [5]int32{1, 2, 3, 4, 5}
iarray3 := [5]int32{1, 2, 3, 4, 5}
iarray4 := [5]int32{6, 7, 8, 9, 10}
iarray5 := [...]int32{11, 12, 13, 14, 15}
iarray6 := [4][4]int32{{1}, {1, 2}, {1, 2, 3}}
fmt.Println(iarray1)
fmt.Println(iarray2)
fmt.Println(iarray3)
fmt.Println(iarray4)
fmt.Println(iarray5)
fmt.Println(iarray6)
}
结果:
[0 0 0 0 0]
[1 2 3 4 5]
[1 2 3 4 5]
[6 7 8 9 10]
[11 12 13 14 15]
[[1 0 0 0] [1 2 0 0] [1 2 3 0] [0 0 0 0]]
我们看数组 iarray1,只声明 , 并未赋值 , Go语言帮我们自动赋值为0 。再看 iarray2 和 iarray3,我们可以看到,Go语言的声明,可以表明类型,也可以不表明类型,var iarray3 = [5]int32{1, 2, 3, 4, 5} 也是完全没问题的 。
(2)数组的容量和长度是一样的 。cap() 函数和 len() 函数均输出数组的容量(即长度) 。如:

推荐阅读