golang函数返回slice和返回 slice的指针有什么区别
按照你的定义,slice是切片,而p是指针。切片是一个结构体头部+数组区域,其头部结构定义如下:
struct Slice
{ // must not move anything
byte* array; // actual data
uintgo len; // number of elements
uintgo cap; // allocated number of elements
};
因此,slice的返回其实是头部值返回,函数内外的地址是不同的,这也导致主程序中,ss与pp不同。因为ss是新分配的,pp则是与子程序testInterface中的&slice相同。简单修改你的代码,通过输出对比,会非常清晰:
package main
import (
"fmt"
)
func testInterface() (slice interface{}, p interface{}) {
slice = make([]int, 10)
p = &slice
fmt.Println("debug:testInterface")
fmt.Println(&slice)//两个地址应该相同
fmt.Println(p) //两个地址应该相同
return slice, p
}
func main() {
fmt.Println("debug:main")
ss, pp := testInterface()
fmt.Println(&ss)
fmt.Println(pp) //应该与子程序的输出一致
}
另外,第一个问题就不用多解释,依然是值和指针不同了。
你是不是也很烦,记不住 slice() 和 splice() 的用法,隔一段时间,再用时就得翻文档。比如说:
本文将会介绍这些内容,如果没时间或直接看结论的,请滑动鼠标至文末。
语法如下:
begin 和 end 都是可选的。返回一个新的数组,是由 begin 和 end 决定的原数组的浅拷贝(包括 begin ,不包括 end )。 通俗地讲,就是截取原数组的一部分,并返回截取部分,且“不改变”原数组 。
总结一下:
请看示例:
字符串也有一个类似的方法: String.prototype.slice() ,它用来提取字符串的某一部分,并返回一个新的字符串,且不会改变原字符串。语法如下:
应用场景:
讲真的,它跟 slice() 长得像不说,还容易混淆,隔一段时间不用,都得翻一下文档确认一下。
语法如下:
所有参数都是可选的。从 MDN 上的表述看,参数 start 应该不能缺省的,但实际并不会报错,因此可认为是全可选的。 splice() 返回被删除的元素所组成的一个新数组,若没有删除,则返回空数组( [] )
简单总结一下:
请看示例:
顺道提一下,其实 split() 这个就很简单了,常用于字符串转为数组、解析 URL 参数等场景。
在字符串与数字切换,常用到 String.prototype.split() 、 Array.prototype.join() 、 Array.prototype.reverse() 方法。
语法如下:
参数 separator 和 limit 都是可选的。若缺省 separator 时,返回的数组包含一个由整个字符串组成的元素。而 limit 的作用是返回分割片段的数量。
separator 可以是字符串,也可以为正则表达式,它适合提取一些不太规则的字符串。
假设有以下两个字符串,我们要把月份提取出来,并返回数组:
本文,主要是讲解 slice() 和 splice() 方法及其区别。好吧,面试官也喜欢问这俩货。
鹏仔微信 15129739599 鹏仔QQ344225443 鹏仔前端 pjxi.com 共享博客 sharedbk.com
图片声明:本站部分配图来自网络。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!