golang 里面切片已经是引用类型了,为什么作为参数,或者返回值的时候
要这样用 []*User
楼上各位已经讲明白。我想通过语法类比的方式来说明一下。
本质上这是一个数组定义的问题。对比c语言的数组定义如下:
//格式如下
type arrayName [ arraySize ];
----- -------- - -------
| | | |---> 数组长度
\|/ \|/ | 表示是数组
元素的类型 变量名
//例如
double balance[10];
通过上面的定义我们知道,对于一个数组的定义需要包括
数组长度,这个可以不写。
对于于golang,定义一个数组也需要包括这些信息。下面是golang中的定义:
变量申明关键字
|
\|/
var a [ 4 ] int --> 元素的类型
-- ---
| |
\|/\|/
变量名 表示是数组
//用楼主的例子
var users []*User --> 元素的类型是 *User
楼主的例子中 元素的类型是 指向User对象的指针,也就是楼主所说的User对象的一个引用。
在需要修改slice中元素的值的时候,就需要使用传入元素类型为指针的入参。如下代码:
package main
import (
"fmt"
)
type User struct {
Name string
}
func main() {
var u = &User{Name:"jerry"}
fmt.Printf("user name %s \n", u.Name)
var users = []*User{u}
var us = []User{*u}
changeUserName2(us)
fmt.Printf("user name %s \n", u.Name)
changeUserName(users)
fmt.Printf("user name %s \n", u.Name)
}
//入参为slice
func changeUserName2(u []User){
u[0].Name = "Tome" //不会对 main中的u对象产生影响。
}
//slice中的元素是一个指针。
func changeUserName(u []*User){
u[0].Name = "Tome" //会对 main中的u对象产生影响。
}
最后得到的输出为:
user name jerry
user name jerry
user name Tome
7 回答5.3k 阅读
6 回答6.9k 阅读✓ 已解决
4 回答2.3k 阅读
1 回答2k 阅读✓ 已解决
1 回答3.4k 阅读
2 回答2.2k 阅读
1 回答2.1k 阅读
var users []*User 是引用类型, users[0] 也是引用类型
var users []User 是引用类型, users[0] 不是引用类型