【Go语言基础【3】】变量、常量、值类型与引用类型

文章目录

    • 一、值(Value)与字面量(Literal)
      • 1. 值
      • 2. 字面量
    • 二、变量(Variable)
      • 1. 声明方式
      • 2. 赋值方式
      • 3. 变量默认值
      • 4. 类型与值的匹配
    • 三、常量(Constant)
      • 1. 声明方式
      • 2. 常量的特性
      • 3. 枚举与 `iota`
    • 四、值类型与引用类型
      • 1. 值类型(Value Type)
      • 2. 引用类型(Reference Type)
    • 五、内存结构与变量赋值
      • 1. 进程内存结构
      • 2. 赋值操作的本质

概念定义核心特点
数据的具体表示,如 10"hello"分为基础类型值和复合类型值,通过字面量书写。
变量命名的内存空间,存储值或指针。强类型、可修改,声明后有零值,支持类型推断和简短声明(:=)。
常量编译时确定且不可修改的值,用 const 声明。支持 iota 自动生成枚举值,表达式在编译期计算,可用于定义配置和枚举。
值类型直接存储值,赋值时复制数据(如 intstringstruct)。栈中存储,性能高,变量独立。
引用类型存储数据地址,赋值时复制指针(如 slicemapchan)。堆中存储,多个变量共享数据,修改会相互影响。

一、值(Value)与字面量(Literal)

先看个例子

var age = 18 // 这里的 `18` 是字面量,它代表的值是“年龄 18 岁”
age = 19     // 现在值变成了“年龄 19 岁”,但写法还是字面量 `19`

核心作用:

  • 字面量是代码中 “写死” 的数据,用于初始化变量或常量。
  • 值是程序运行时实际存储的数据,可能会变化(变量)或固定不变(常量)。
     

1. 值

值是程序中数据的具体表示,分为:

  • 基础类型值:如 123(整型)、3.14(浮点型)、true(布尔)、'a'(字符)、"hello"(字符串)。
  • 复合类型值:如数组 [3]int{1,2,3}、切片 []string{"a","b"}、结构体 struct{Name string}{"Tom"}

 

2. 字面量

字面量是值的直接书写形式,用于初始化变量或常量:

  • 基础字面量
    42          // 整型
    3.1415      // 浮点型
    true        // 布尔型
    '中'        // 字符型(rune)
    "Go语言"    // 字符串
    
  • 复合字面量:构造复合类型的值(如数组、切片、映射):
    [3]int{1, 2, 3}       // 数组
    []string{"a", "b"}    // 切片
    map[string]int{"a": 1} // 映射
    

 

二、变量(Variable)

变量是存储值的内存空间的命名引用,特点:

  • 强类型语言:变量必须先声明后使用,且类型固定。
  • 值可修改:运行时可重新赋值。

 

1. 声明方式

方式语法示例说明
单个声明var name string声明变量 name,类型为 string,初始值为 ""(零值)。
批量声明var a, b int声明多个同类型变量。
批量声明(块形式)var ( x int y string )适用于声明多个不同类型的变量,代码更整洁。

 

2. 赋值方式

  • 先声明后赋值
    var age int    // 声明变量,初始值为 0(整型零值)
    age = 18       // 赋值
    
  • 声明并初始化
    var name string = "Tom" // 显式指定类型
    var score = 95          // 类型推断(根据值 `95` 推断为 int)
    
  • 简短声明(仅用于函数内)
    count := 0 // 等价于 `var count int = 0`,仅用于函数内部,简洁高效。
    

 

3. 变量默认值

变量未显式赋值时,自动赋予对应类型的零值:

  • 数值类型(如 intfloat32):0
  • 布尔类型(bool):false
  • 字符串(string):""(空字符串)
  • 引用类型(如切片、映射、通道):nil

 

4. 类型与值的匹配

赋值时需保证类型一致,否则编译报错:

var num int = "100" // 错误:字符串无法赋值给整型

 

三、常量(Constant)

常量是编译时确定且运行时不可修改的值,用于定义程序中固定不变的数据(如配置项、枚举值)。

1. 声明方式

方式语法示例说明
显式类型声明const PI float64 = 3.14159明确指定类型和值。
隐式类型推断const E = 2.718类型由值自动推断(float64)。
批量声明const ( <br> A = 1 <br> B = 2 <br> )声明多个常量,可混合类型。

2. 常量的特性

  • 不可修改:声明后无法重新赋值,否则编译报错:
    const a = 10  
    a = 20 // 错误:cannot assign to a (constant 10)
    
  • 编译期计算:常量表达式在编译时求值,支持算术运算、类型转换等:
    const (KB = 1024MB = KB * 1024 // 编译时计算为 1048576
    )
    

 

3. 枚举与 iota

iota 是常量声明块中的自动递增计数器,用于生成枚举值:

const (Sunday = iota // 0(iota 初始为 0)Monday        // 1(iota 自增 1)Tuesday       // 2
)

其他语法

  • 跳过值:用 _ 跳过某个枚举值:
    const (A = iota // 0_        // 1(跳过)C        // 2
    )
    
  • 复杂表达式:结合运算符生成规律值(如位掩码):
    const (Read  = 1 << iota // 1 << 0 = 1(0b0001)Write             // 1 << 1 = 2(0b0010)Exec              // 1 << 2 = 4(0b0100)
    )
    

 

四、值类型与引用类型

1. 值类型(Value Type)

  • 存储方式:直接存储值本身,位于栈内存或堆内存中的数据区域。
  • 常见类型:整型、浮点型、布尔型、字符型、字符串、数组、结构体(非指针结构体)。
  • 特点:变量赋值时复制值,修改一个变量不影响另一个:
    a := 10  
    b := a    // b 复制 a 的值(10)
    b = 20    // a 仍为 10,b 变为 20
    

 

2. 引用类型(Reference Type)

  • 存储方式:存储值的内存地址(指针),指向堆内存中的数据。
  • 常见类型:切片(slice)、映射(map)、通道(chan)、指针(*T)、接口(interface)。
  • 特点:变量赋值时复制指针,多个变量指向同一数据,修改会互相影响:
    slice1 := []int{1, 2, 3}  
    slice2 := slice1 // slice2 与 slice1 指向同一底层数组
    slice2[0] = 100  // slice1[0] 也变为 100(因共享数据)
    

 

五、内存结构与变量赋值

1. 进程内存结构

  • 栈(Stack):存放值类型变量引用类型的指针,特点是自动分配和释放,速度快。
  • 堆(Heap):存放引用类型的数据(如切片、映射的底层数据),需手动管理(Go 通过 GC 自动回收)。

 

2. 赋值操作的本质

  • 值类型赋值:在栈中复制值,新旧变量互不影响。
    var x int = 5  
    var y int = x // y 复制 x 的值(5),x 和 y 是独立的栈变量。
    
  • 引用类型赋值:复制指针(地址),新旧变量指向堆中的同一数据。
    m := map[string]int{"a": 1}  
    n := m // n 复制 m 的指针,指向同一 map 数据。
    n["a"] = 100 // m["a"] 也变为 100(因共享数据)。
    

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/web/82615.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AWS 亚马逊 S3存储桶直传 前端demo 复制即可使用

自己踩过坑不想别人也踩坑了 亚马逊S3存储桶直传前端demo复制即可使用 <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0…

Python数据可视化科技图表绘制系列教程(四)

目录 带基线的棒棒糖图1 带基线的棒棒糖图2 带标记的棒棒糖图 哑铃图1 哑铃图2 包点图1 包点图2 雷达图1 雷达图2 交互式雷达图 【声明】&#xff1a;未经版权人书面许可&#xff0c;任何单位或个人不得以任何形式复制、发行、出租、改编、汇编、传播、展示或利用本博…

如何有效删除 iPhone 上的所有内容?

“在出售我的 iPhone 之前&#xff0c;我该如何清除它&#xff1f;我担心如果我卖掉它&#xff0c;有人可能会从我的 iPhone 中恢复我的信息。” 升级到新 iPhone 后&#xff0c;你如何处理旧 iPhone&#xff1f;你打算出售、以旧换新还是捐赠&#xff1f;无论你选择哪一款&am…

[yolov11改进系列]基于yolov11使用SwinTransformer替换backbone用于提高多尺度特征提取能力的python源码+训练源码

【SwinTransformer介绍】 摘要 ViT的缺点&#xff1a; Transformer在语言处理中的基本元素是word token&#xff0c;其特点是语义信息比较密集。而ViT中token的尺度&#xff08;scale&#xff09;是固定的&#xff0c;且视觉token携带的语义信息比语言文字序列差&#xff0c…

NoSQL 之 Redis 配置与优化

目录 一、Redis 介绍 1、关系型数据库与非关系型数据库 &#xff08;1&#xff09;关系型数据库 &#xff08;2&#xff09;非关系型数据库 &#xff08;3&#xff09;非关系型数据库产生背景 2、Redis 基础 &#xff08;1&#xff09;Redis 简介 &#xff08;2&#x…

算法复杂度,咕咕咕

1.数据结构与算法 数据结构是计算机存储&#xff0c;组织数据的方式&#xff0c;指相互之间存在一种或多种特定关系的数据元素的集合。可以理解为形状不同的容器。 算法是定义好的计算过程&#xff0c;取输入值&#xff0c;经过一系列计算方法变成输出值。 &#xff08;推荐…

【Linux】 Linux 进程控制

参考博客&#xff1a;https://blog.csdn.net/sjsjnsjnn/article/details/125581083 一、进程创建 1.1 fork()函数 在linux中fork函数是非常重要的函数&#xff0c;它从已存在进程中创建一个新进程。新进程为子进程&#xff0c;而原进程为父进程。进程调用fork&#xff0c;当…

【大模型】MCP是啥?它和点菜、做菜、端菜有啥关系?

什么是 Model Context Protocol (MCP)? Model Context Protocol(模型上下文协议),通俗来说,就是一套用来管理、传递和维护对话或交互中上下文信息的规则和格式标准。 换句话说,MCP定义了模型在处理用户输入和生成回答时,如何理解、保留和传递上下文信息的协议,确保对…

机器学习的数学基础:决策树

决策树 文章目录 决策树决策树的基本思想划分选择信息增益增益率基尼指数 减枝处理回归问题对连续值的处理对缺失值的处理 决策树的基本思想 决策树是基于树结构来进行决策的&#xff0c;通过对问题的判断与决策&#xff0c;得到最终决策。 一般的&#xff0c;决策树包括一个…

基于若依前后分离版-用户密码错误锁定

sys_config配置参数 user.password.maxRetryCount&#xff1a;最大错误次数 user.password.lockTime&#xff1a;锁定时长 //SysLoginController//登录 PostMapping("/login") public AjaxResult login(RequestBody LoginBody loginBody) {AjaxResult ajax AjaxR…

Java线程安全集合类

Java线程安全集合类全面解析 目录 并发集合概述List线程安全实现Set线程安全实现Map线程安全实现Queue线程安全实现总结 并发集合概述 Java提供了多种线程安全的集合类&#xff0c;主要分为两大类&#xff1a; 传统同步集合&#xff1a;通过synchronized关键字实现线程安全…

汇川变频器MD600S-4T-5R5为什么要搭配GRJ9000S-10-T滤波器?

一、变频器的工作原理与电磁干扰 汇川MD600S-4T-5R5变频器是一款紧凑型高性能变频器&#xff0c;适用于三相380V-480V电网&#xff0c;额定电流5.5A&#xff0c;支持矢量控制和多种编码器接口&#xff0c;适用于需要高精度速度和转矩控制的场景&#xff0c;如机器人、电梯、纺…

数学运算在 OpenCV 中的核心作用与视觉效果演示

在计算机视觉中&#xff0c;图像不仅仅是我们肉眼所见的内容&#xff0c;它其实是由数值矩阵组成的“数据”。而在 OpenCV&#xff08;Open Source Computer Vision Library&#xff09;中&#xff0c;正是数学运算赋予了图像处理无限的可能——从基本的滤波、增强到复杂的特征…

【快速预览经典深度学习模型:CNN、RNN、LSTM、Transformer、ViT全解析!】

&#x1f680;快速预览经典深度学习模型&#xff1a;CNN、RNN、LSTM、Transformer、ViT全解析&#xff01; &#x1f4cc;你是否还在被深度学习模型名词搞混&#xff1f;本文带你用最短时间掌握五大经典模型的核心概念和应用场景&#xff0c;助你打通NLP与CV的任督二脉&#xf…

springboot mysql/mariadb迁移成oceanbase

前言&#xff1a;项目架构为 springbootmybatis-plusmysql 1.部署oceanbase服务 2.springboot项目引入oceanbase依赖&#xff08;即ob驱动&#xff09; ps&#xff1a;删除原有的mysql/mariadb依赖 <dependency> <groupId>com.oceanbase</groupId> …

电网“逆流”怎么办?如何实现分布式光伏发电全部自发自用?

2024年10月9日&#xff0c;国家能源局综合司发布了《分布式光伏发电开发建设管理办法&#xff08;征求意见稿&#xff09;》&#xff0c;意见稿规定了户用分布式光伏、一般工商业分布式光伏以及大型工商业分布式光伏的发电上网模式&#xff0c;当选择全部自发自用模式时&#x…

C语言之编译器集合

C语言有多种不同的编译器&#xff0c;以下是常见的编译工具及其特点&#xff1a; 一、主流C语言编译器 GCC&#xff08;GNU Compiler Collection&#xff09; 特点&#xff1a;开源、跨平台&#xff0c;支持多种语言&#xff08;C、C、Fortran 等&#xff09;。 使用场景&…

负载均衡将https请求转发后端http服务报错:The plain HTTP request was sent to HTTPS port

https请求报错&#xff1a;The plain HTTP request was sent to HTTPS port 示例背景描述&#xff1a; www.test.com:11001服务需要对互联网使用https提供服务后端java服务不支持https请求&#xff0c;且后端程序无法修改&#xff0c;仅支持http请求 问题描述&#xff1a; 因…

(3)Playwright自动化-3-离线搭建playwright环境

1.简介 如果是在公司局域网办公&#xff0c;或者公司为了安全对网络管控比较严格这种情况下如何搭建环境&#xff0c;我们简单来看看 &#xff08;第一种情况及解决办法&#xff1a;带要搭建环境的电脑到有网的地方在线安装即可。 &#xff08;第二种情况及解决办法&#xf…

【Fiddler抓取手机数据包】

Fiddler抓取手机数据包的配置方法 确保电脑和手机在同一局域网 电脑和手机需连接同一Wi-Fi网络。可通过电脑命令行输入ipconfig查看电脑的本地IP地址&#xff08;IPv4地址&#xff09;&#xff0c;手机需能ping通该IP。 配置Fiddler允许远程连接 打开Fiddler&#xff0c;进入…