ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

golang 值类型与引用类型

2022-08-21 16:32:33  阅读:227  来源: 互联网

标签:slice 变量 E5% golang 引用 类型 指针


转自:https://www.zhihu.com/search?type=content&q=golang%20%20%E5%80%BC%E7%B1%BB%E5%9E%8B%E3%80%81%E5%BC%95%E7%94%A8%E7%B1%BB%E5%9E%8B%E3%80%81%E6%8C%87%E9%92%88%E7%B1%BB%E5%9E%8B

值类型和引用类型

值类型包括:所有integer,所有float,bool,string,数组structure

引用类型包括:指针,slice,map,chan,interface

通过使用方法来区分值类型和引用类型

初始化

变量初始化分为声明和赋值两部分

var b int  // b = 0
b = 1

var p *int  // p = nil
p = &b

 

对于值类型,声明了但是未赋值时,其值是类型零值,可以看出值类型变量存的就是变量的值

对于引用类型,声明了但是未赋值时,其值是nil, 可以看出引用类型变量存的是变量的指针

事实上,和指针不同,slicemapchannel 都是结构体,指针零值是nil代表它还没有存储任何一个内存地址 ,而slice等的零值是成员变量为相应变量类型零值slice结构体, 为了更方便初始化slicemapchannel结构体,golang设计者设计了一个make函数,专门用来初始化slicemapchannel
但是为什么slicemapchannel也叫引用类型? 回到那句话,区分引用类型和值类型是在使用的时候区分,这三种类型的成员变量都包含一个指向我们存储的值指针 ,操作我们存储的值的时候必须通过这个指针来操作,所以它们是引用类型

函数传参

无论是值类型还是引用类型,传递的都是这个变量存储值的一个副本

func f(i int, p *int){
    // i是原始变量值的一个副本,i存储的值与原始变量值相等
    // 操作i=1并不会使原始变量值变成1

    // p是原始变量值的一个副本,它们存储了相同的指针,指向同一个地址
    // 操作 *p = 1 会使原始变量指向的值变成1
    // 操作 p = &i 会使p指向i,但是对原始变量没有影响
}

 

标签:slice,变量,E5%,golang,引用,类型,指针
来源: https://www.cnblogs.com/fulaien/p/16610207.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有