使用:=和var 有什么区别,差异在哪里?

开发 前端
在 Go 语言中,:= 和 var 都用于声明变量,但它们的用法、作用范围以及适用场景有所不同。

在 Go 语言中,:= 和 var 都用于声明变量,但它们的用法、作用范围以及适用场景有所不同。下面我们来详细比较它们的区别:

1. 基本语法和用法

  • := 是短变量声明,只能在函数内部使用。
  • var 是显式变量声明,可以在函数内外使用。
package main

import "fmt"

func main() {
    // 使用短变量声明
    x := 10
    fmt.Println(x)

    // 使用 var 声明
    var y int = 20
    fmt.Println(y)
}

2. 是否需要显式指定类型

  • := 自动推断类型,不能显式指定类型。
  • var 可以显式指定类型,也可以通过赋值自动推断类型。
func main() {
    // 短变量声明会自动推断类型
    x := 10           // 推断为 int
    name := "Alice"    // 推断为 string

    // 使用 var 时可以显式指定类型
    var y int = 20
    var age int
    age = 25

    fmt.Println(x, name, y, age)
}

3. 作用域

  • := 只能用于函数内部,适用于局部变量的声明和赋值。
  • var 可以在函数外部使用,适合声明全局变量。
package main

import "fmt"

// 全局变量声明必须使用 var,不能使用 :=
var globalVar = "I'm global"

func main() {
    fmt.Println(globalVar)
}

4. 用于重新赋值

  • := 在相同作用域内使用时,如果变量已声明,会报错。可以在多变量声明中,部分变量是新变量的情况下使用。
  • var 声明的变量可以直接重新赋值,无需重复声明。
func main() {
    // := 用于多变量声明时可以部分覆盖
    x, y := 10, 20
    x, z := 30, 40 // x 重新赋值,z 是新变量

    fmt.Println(x, y, z)
}

5. 初始化零值

  • := 必须有初始值。
  • var 声明的变量如果不赋初始值,会默认使用类型的“零值”。
func main() {
    var y int // 默认零值,int 的零值是 0
    fmt.Println(y) // 输出:0
}

6. 使用场景总结

  • := 适合在函数内部快速声明和初始化变量,代码更加简洁。
  • var 适合在需要显式声明变量类型、全局变量或希望获得零值的情况下使用。

总结一下

特性

:=

var

用法范围

只能在函数内部

函数内外都可以

类型指定

自动推断类型

可以指定类型或自动推断类型

是否必须初始化

必须有初始值

可以不初始化,使用类型的零值

多变量声明和赋值

支持部分变量重新声明

不支持重新声明

适用场景

局部变量的快速声明和赋值

全局变量、需要指定类型或零值的变量

:= 和 var 的选择主要取决于代码的上下文和声明的需求。

责任编辑:武晓燕 来源: Go语言圈
相关推荐

2022-01-16 07:46:53

SpringDataASSM

2020-03-09 20:56:19

LoRaLoRaWAN无线技术

2022-09-07 18:32:57

并发编程线程

2022-09-08 18:38:26

LinuxWindowsmacOS

2022-06-06 14:53:02

LoRaLoRaWAN

2020-11-09 14:07:53

PyQtQt编程

2022-08-02 08:23:37

SessionCookies

2024-03-05 18:59:59

前端开发localhost

2024-09-09 13:10:14

2024-05-27 00:40:00

2021-12-17 14:40:02

while(1)for(;;)语言

2022-02-27 15:33:22

安全CASBSASE

2021-05-16 14:26:08

RPAIPACIO

2022-08-31 08:33:54

Bash操作系统Linux

2023-12-15 09:21:17

ObjectJavaString

2022-08-22 07:06:32

MyBatisSQL占位符

2021-09-06 10:45:18

XDRMDR

2022-08-03 07:04:56

GETHTTPPOST

2020-06-28 15:11:07

LoRaWAN网络专用网络

2021-03-27 10:56:17

promisethenfinally
点赞
收藏

51CTO技术栈公众号