当前位置: 首页 > 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.dtcms.com/a/327169.html

相关文章:

  • Python 标准库模块shutil
  • 当多模态大语言模型遇上视觉难题!AI视觉探索之旅
  • 基于Hadoop的全国农产品批发价格数据分析与可视化与价格预测研究
  • grpc浅入门
  • jdk升级
  • 【Redis在在线表单提交防重复机制中的应用策略】
  • 【开发环境下浏览器前后端Cookie跨域问题】
  • 实现文字在块元素中水平/垂直居中详解
  • 深度贴:前端网络基础及进阶(3)
  • Linux 常用命令大全:覆盖日常 99% 操作需求
  • 【SpringBoot】05 容器功能 - SpringBoot底层注解的应用与实战 - @Configuration + @Bean
  • WebAssembly的原理与使用
  • Day24|学习前端CSS
  • 虚拟机高级玩法-网页也能运行虚拟机——WebAssembly
  • GitHub的简单使用方法----(4)
  • Seata深度剖析:微服务分布式事务解决方案
  • 如何应对CAN总线冲突和数据丢包
  • GitHub Browser-Use 的部署失败记录:失败了,失败了。。。。
  • 在 Windows 上升级 Python 到 3.8 的步骤
  • 【微服务过度拆分的问题】
  • IEEE 2025 | 重磅开源!SLAM框架用“法向量+LRU缓存”,将三维重建效率飙升72%!
  • 学习嵌入式的第十七天——Linux编程——shell编程
  • 【图像算法 - 13】基于 YOLO12 与 OpenCV 的实时目标点击跟踪系统(系统介绍 + 源码详细)
  • centos 怎么部署 vscode 网页版
  • 如何提升需求分析能力
  • 数据分析—双十一
  • Linux磁盘空间逻辑卷扩容
  • 服务器service托管java服务
  • 【无标题】centos 配置阿里云的yum源
  • 如何区分类的关系是关联和聚合?