Golang中如何获取指针指向的切片的长度?
解决Go中获取指针指向切片长度的问题
你遇到的报错核心原因是:直接对切片指针调用len()函数是不被Go允许的——len()只能作用在切片、数组、字符串这类原生集合类型上,不能直接处理指针,得先拿到指针指向的实际切片才行。
问题拆解
看你的appendVertex函数,参数v是*[]Vertex类型(也就是切片的指针),当你写len(v)时,相当于试图获取指针本身的"长度",这完全不符合你的实际需求,编译器自然会报错。你真正要取的是指针背后那个切片的长度,所以必须先对指针做解引用操作。
修正后的完整代码
把appendVertex里的len(v)改成len(*v)即可解决问题,运行后就能正常输出切片长度了:
type Vertex struct { X int Y int } func main() { var v []Vertex fmt.Println(len(v)) // 输出:0 appendVertex(&v) fmt.Println(len(v)) // 输出:1 } func appendVertex(v *[]Vertex) { *v = append(*v, Vertex{1, 1}) fmt.Println(len(*v)) // 输出:1 }
额外补充说明
- 为什么要传切片指针给
appendVertex?
因为append在切片容量不足时会创建新的底层数组,返回一个全新的切片对象。如果不传指针,函数里操作的只是原切片的副本,修改后的结果不会同步到main函数里的原切片,所以必须通过指针来修改原切片的引用。 - 除了传指针,还有另一种常见写法:
让appendVertex返回新的切片,在main函数里重新赋值,这样不需要用到指针:
两种写法都能达到目的,选你习惯的风格就行。func appendVertex(v []Vertex) []Vertex { v = append(v, Vertex{1, 1}) fmt.Println(len(v)) return v } // main里调用方式:v = appendVertex(v)
内容的提问来源于stack exchange,提问作者YuanZheng Hu
相关产品推荐
相关产品推荐

