当前位置: 首页 > news >正文

Go 语言 里 `var`、`make`、`new`、`:=` 的区别

Go 语言varmakenew:= 的区别彻底梳理一下。


1️⃣ var

作用:声明变量(可以带初始值,也可以不带)。

  • 语法

    var a int        // 声明整型变量,默认值为 0
    var b string     // 默认值 ""
    var c = 10       // 类型推断为 int
    var d int = 20   // 显式类型
    
  • 特点

    • 不赋值时,自动初始化为零值(0、“”、nil 等)。
    • 适用于包级变量或需要显式声明类型的地方。
    • 不能在函数体外用 :=,但 var 可以。

2️⃣ :=(短变量声明)

作用:声明并初始化变量(只能在函数内用)。

  • 语法

    x := 100          // 类型推断为 int
    y := "hello"      // 类型推断为 string
    
  • 特点

    • 必须同时声明并赋值

    • 只能在函数内部使用。

    • 适合局部变量,简洁方便。

    • 如果左边变量部分已声明:= 会更新未声明的部分:

      a := 1
      a, b := 2, 3 // a 已存在,更新值;b 新声明
      

3️⃣ new

作用:为某种类型分配内存,返回该类型的指针(零值)。

  • 语法

    p := new(int)     // *int 类型,指向的值是 0
    *p = 100          // 修改指针指向的值
    fmt.Println(*p)   // 100
    
  • 特点

    • 只分配内存,不初始化(除了零值)。

    • 返回的是指针类型*T)。

    • 多用于需要指针的场景,比如:

      type Person struct { Name string }
      p := new(Person) // *Person
      

4️⃣ make

作用只用于创建 slice、map、channel,并完成初始化。

  • 语法

    s := make([]int, 5, 10)   // 长度5,容量10的切片
    m := make(map[string]int) // 空map
    ch := make(chan int, 3)   // 缓冲区大小为3的channel
    
  • 特点

    • make分配内存初始化底层数据结构
    • 返回的是引用类型本身(不是指针)。
    • new 不同:new 返回指针,make 返回初始化完成的对象。

5️⃣ 区别总结表

关键字作用返回类型用途初始化
var声明变量(可选初始值)值类型(或引用类型)全局变量/局部变量默认零值
:=声明并赋值(只能函数内)值类型(或引用类型)局部变量需要立即赋值
new分配内存指针类型(*T任意类型仅零值
make创建并初始化 slice、map、chan引用类型本身slice/map/chan已初始化

6️⃣ 直观示例对比

package mainimport "fmt"func main() {// varvar a int          // 0var b = 42         // 42fmt.Println(a, b)// :=c := "hello"fmt.Println(c)// newp := new(int)      // *intfmt.Println(*p)    // 0*p = 99fmt.Println(*p)    // 99// makem := make(map[string]int)m["go"] = 2025fmt.Println(m)
}

http://www.xdnf.cn/news/1286155.html

相关文章:

  • 深入解析ArrayList与LinkedList的区别:如何正确选择?
  • 游戏中角色持枪:玩家操控角色,角色转向时枪也要转向
  • Java集合学习之forEach()遍历方法的底层原理
  • 【Unity3D实例-功能-下蹲】角色下蹲(二)穿越隧道
  • 人工智能+虚拟仿真,助推医学检查技术理论与实践结合
  • Linux环境gitlab多种部署方式及具体使用
  • [论文阅读] (41)JISA24 物联网环境下基于少样本学习的攻击流量分类
  • 完整多端口 Nginx Docker部署 + GitLab Runner注册及标签使用指南
  • 使用 NetBird 创建安全的私有网络,简化远程连接!
  • 【论文阅读】从表面肌电信号中提取神经信息用于上肢假肢控制:新兴途径与挑战
  • 终端安全检测和防御技术总结
  • Java数据结构之ArrayList
  • [激光原理与应用-256]:理论 - 几何光学 - CMOS与CCD传感器成像原理比较
  • 卫生间装修防水怎么做合适?
  • 激光干涉法在碳化硅衬底 TTV 厚度测量中的精度提升策略
  • 高性能web服务器Tomcat
  • Vue 3 + Elementui + TypeScript 实现左侧菜单定位右侧内容
  • 石英加速度计如何实现高精度测量?
  • 深度贴:前端网络基础及进阶(3)
  • 鲲鹏arm服务器安装neo4j社区版,实现图书库自然语言检索基础
  • 地图可视化实践录:显示地理区域图
  • 自然语言处理关键库解析和使用方法- FuzzyWuzzy
  • 虚拟机一站式部署Claude Code 可视化UI界面
  • 豆包 + 蘑兔 AI:你的创作搭子
  • 运维学习Day22——Anisible自动化与基本使用
  • Kafka的一条消息的写入和读取过程原理介绍
  • kafka 消费者组的概念是什么?它是如何实现消息的点对点和发布/订阅模式?
  • PO、BO、VO、DTO、POJO、DAO、DO基本概念
  • 开源!!! htop移植到OpenHarmony
  • 【网络运维】Linux和自动化: Ansible基础实践