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

news2025/6/7 1:16:13

文章目录

    • 一、值(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 = 1024
        MB = 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.coloradmin.cn/o/2402321.html

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

相关文章

8天Python从入门到精通【itheima】-69~70(字符串的常见定义和操作+案例练习)

目录 69节-字符串的定义和操作 1.学习目标 2.数据容器视角下的字符串 3.字符串的下标索引 4.字符串是一个无法修改的数据容器 5.字符串的常用操作 【1】index方法 【2】replace方法&#xff1a;进过替换&#xff0c;得到一个新的字符串 【3】split方法&#xff1a;将字…

GC1809:高性能音频接收与转换芯片

GC1809 是一款高性能音频接收与转换芯片&#xff0c;适用于多种音频设备&#xff0c;如 A/V 接收器、多媒体音响设备、机顶盒等。本文将简要介绍该芯片的主要特性、性能参数及应用。 主要特性 多协议兼容&#xff1a;兼容 IEC60958、S/PDIF、EIAJ CP1201 和 AES3 协议。 多种…

项目实战——C语言扫雷游戏

这是一款9*9的扫雷游戏 扫雷游戏 1.需求分析2.程序框架设计3.分函数实现打印游戏菜单界面游戏主逻辑函数程序主入口初始化游戏棋盘随机布置地雷显示当前棋盘状态计算指定位置周围的地雷数量玩家排雷主逻辑 4.分文件实现&#xff08;1&#xff09;test.c&#xff08;2&#xff0…

【Java】CopyOnWriteArrayList

一&#xff0c;概述 CopyOnWriteArrayList作为List接口的实现之一&#xff0c;它区分于ArrayList在于它是线程安全的。如它名字一样&#xff0c;所有的写操作均复制了原数组的值&#xff0c;虽说代价较大&#xff0c;但读多写少的环境下&#xff0c;是可接受的。笔者在此简单看…

C#入门学习笔记 #8(委托)

欢迎进入这篇文章,文章内容为学习C#过程中做的笔记,可能有些内容的逻辑衔接不是很连贯,但还是决定分享出来,由衷的希望可以帮助到你。 笔记内容会持续更新~~ 本章介绍C#中的委托,本章难度较大... 委托 C#中的委托是C语言、C++中函数指针的升级版。接下来介绍一个概念—…

CSS 3D 变换中z-index失效问题

CSS 3D 变换中 z-index 失效问题 1. z-index 失效了 在 CSS 中&#xff0c;z-index 通常用于控制元素的层叠顺序&#xff0c;数值越大&#xff0c;元素越靠前显示。在 3D 变换&#xff08;如 rotateX、translateZ&#xff09; 中使用 z-index 时&#xff0c;可能会发现z-inde…

Tailwind CSS 实战:基于 Kooboo 构建 AI 对话框页面(七):消息框交互功能添加

Tailwind CSS 实战&#xff0c;基于Kooboo构建AI对话框页面&#xff08;一&#xff09; Tailwind CSS 实战&#xff0c;基于Kooboo构建AI对话框页面&#xff08;二&#xff09;&#xff1a;实现交互功能 Tailwind CSS 实战&#xff0c;基于 Kooboo 构建 AI 对话框页面&#x…

【计算机网络】网络层IP协议与子网划分详解:从主机通信到网络设计的底层逻辑

&#x1f525;个人主页&#x1f525;&#xff1a;孤寂大仙V &#x1f308;收录专栏&#x1f308;&#xff1a;计算机网络 &#x1f339;往期回顾&#x1f339;&#xff1a; 【计算机网络】传输层TCP协议——协议段格式、三次握手四次挥手、超时重传、滑动窗口、流量控制、 &…

基于WSL搭建Ubnutu 20.04.6 LTS(二)-部署Docker环境

Docker是一组平台即服务&#xff08;PaaS&#xff09;的产品。它基于操作系统层级的虚拟化技术&#xff0c;将软件与其依赖项打包为容器。托管容器的软件称为Docker引擎。Docker能够帮助开发者在轻量级容器中自动部署应用程序&#xff0c;并使得不同容器中的应用程序彼此隔离&a…

【图像处理入门】6. 频域图像处理:傅里叶变换与滤波的奥秘

摘要 频域图像处理通过傅里叶变换将图像从空间域转换到频率域,为图像增强、去噪、压缩等任务提供全新视角。本文将深入解析傅里叶变换原理,介绍低通、高通滤波的实现方式,结合OpenCV和Python代码展示频域滤波在去除噪声、增强边缘中的应用,帮助读者掌握图像频域处理的核心…

基于开源AI智能名片链动2+1模式S2B2C商城小程序的生态农庄留存运营策略研究

摘要&#xff1a;本文聚焦于生态农庄运营中的游客留存问题&#xff0c;以村长与乡亲们吸引游客进村为背景&#xff0c;深入探讨如何借助开源AI智能名片链动2 1模式S2B2C商城小程序实现游客的有效留存。通过分析该小程序在信息传递、服务整合、营销激励等方面的优势&#xff0c…

Jenkins实现自动化部署Springboot项目到Docker容器(Jenkinsfile)

Jenkins实现自动化部署Springboot项目到Docker容器 引言:为什么需要自动化部署? 在软件开发中,频繁的手动部署既耗时又容易出错。通过 Docker + Jenkins + Git 的组合,您可以实现: ✅ 一键部署:代码推送后自动构建和部署🐳 环境一致性:Docker 确保开发、测试、生产环…

【Linux】Git原理与使用

编程不仅是解决问题的艺术&#xff0c;更是对复杂性进行优雅管理的哲学。 前言 这是我自己学习Linux系统编程的第三篇笔记。后期我会继续把Linux系统编程笔记开源至博客上。 上一期笔记是关于Vim文本编辑器知识&#xff1a; 【Linux】Vim文本编辑器-CSDN博客https://blog.csdn…

A*算法实现原理以及实现步骤(C++)

算法原理&#xff1a; A*算法是一种启发式搜索算法&#xff0c;用于在图中寻找最短路径。它结合了Dijkstra算法的确保最短路径的优点和贪心最佳优先搜索的高效性。其核心在于使用一个评估函数&#xff1a; f(n) g(n) h(n) 其中&#xff1a; - g(n) 表示从起点到节点n的实际代…

Devops自动化运维---py基础篇一

python基础篇 1、基本数据类型 2、算术运算符 3、变量 变量&#xff1a;编程语言中能储存结果或能表示值的抽象概念 用途&#xff1a;用一段数据赋予一个简短、易于记忆的名字&#xff0c;方便重复使用3.1 格式转化变量 操作符号描述%s字符串%d整数%f浮点数 实例&#xff1…

平安养老险蚌埠中心支公司开展金融宣教活动

近日&#xff0c;平安养老保险股份有限公司&#xff08;以下简称“平安养老险”&#xff09;蚌埠中心支公司&#xff0c;走进某合作企业开展金融教育宣传活动。 活动现场&#xff0c;平安养老险蚌埠中心支公司工作人员通过发放宣传手册和小礼品等方式&#xff0c;向企业员工普…

Redisson简明教程—你家的锁芯该换了

1.简介 各位攻城狮们&#xff0c;你还在使用原生命令来上锁么&#xff1f;看来你还是不够懒&#xff0c;饺子都给你包好了&#xff0c;你非要吃大饼配炒韭菜&#xff0c;快点改善一下“伙食”吧&#xff0c;写代码也要来点幸福感。今天咱们就来聊聊Redisson提供的各种锁&#…

48V带极性反接保护-差共模浪涌防护方案

在工业自动化&#xff08;电动机驱动 / 工业机器人&#xff09;、交通基础设施&#xff08;充电桩 / 车载电子&#xff09;、安防系统&#xff08;监控摄像头 / 门禁&#xff09;、储能设备&#xff08;BMS / 离网控制器&#xff09;等领域&#xff0c;DC48V 电源因安全特低电压…

Python----目标检测(使用YOLO 模型进行线程安全推理和流媒体源)

一、线程安全推理 在多线程环境中运行YOLO 模型需要仔细考虑&#xff0c;以确保线程安全。Pythons threading 模块允许您同时运行多个线程&#xff0c;但在这些线程中使用YOLO 模型时&#xff0c;需要注意一些重要的安全问题。本页将指导您创建线程安全的YOLO 模型推理。 1.1、…

jvm学习第1day jvm简介,栈溢出、堆溢出

jvm学习第1day jvm简介&#xff0c;栈溢出、堆溢出 jvm简介栈线程安全栈溢出线程运行诊断堆堆溢出 方法区方法区内存溢出常量池和运行时常量池 jvm简介 jvm 是编译后的字节码文件运行的环境&#xff0c; 因此各个平台有了jvm可以运行java.class文件&#xff0c;这是Java跨平台…