golang 切片 []*User 的理解

golang 里面切片已经是引用类型了,为什么作为参数,或者返回值的时候
要这样用 []*User

阅读 2.8k
4 个回答

var users []*User 是引用类型, users[0] 也是引用类型
var users []User 是引用类型, users[0] 不是引用类型

切片里的值不是切片类型啊

新手上路,请多包涵

切片里面存值和存指针的区别

楼上各位已经讲明白。我想通过语法类比的方式来说明一下。
本质上这是一个数组定义的问题。对比c语言的数组定义如下:

//格式如下
type arrayName [ arraySize ];
----- -------- -  -------
  |      |     |     |---> 数组长度
 \|/    \|/    | 表示是数组
元素的类型 变量名
//例如
double balance[10];

通过上面的定义我们知道,对于一个数组的定义需要包括

  1. 存放在数组中 的数据的 类型
  2. 变量名称
  3. 表示是数组的 “[]”
  4. 数组长度,这个可以不写。
    对于于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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题