问答

golang 切片 []*User 的理解

作者:admin 2021-04-17 我要评论

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

在说正事之前,我要推荐一个福利:你还在原价购买阿里云、腾讯云、华为云服务器吗?那太亏啦!来这里,新购、升级、续费都打折,能够为您省60%的钱呢!2核4G企业级云服务器低至69元/年,点击进去看看吧>>>)

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

###

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

###

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

版权声明:本文转载自网络,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本站转载出于传播更多优秀技术知识之目的,如有侵权请联系QQ/微信:153890879删除

相关文章
  • nginx响应速度很慢

    nginx响应速度很慢

  • 点击选中的多选框,会在已选那一栏显示

    点击选中的多选框,会在已选那一栏显示

  • PHP 多态的理解

    PHP 多态的理解

  • 关于C语言中static的问题

    关于C语言中static的问题

腾讯云代理商
海外云服务器