Go 变量

Go 中,变量有静态类型(编译期确定)。既可以显式写类型,也可以让编译器类型推断。本文介绍创建变量、变量命名、多个变量赋值、输出变量、局部变量、包级(全局)变量,以及如何在函数里修改包级变量。

1、定义变量

Go 没有单独的“声明关键字”,而是用 var 或短变量声明 :=

package main
import "fmt"
func main() {
    var x int = 5        // 显式类型
    y := "cjavapy"       // 类型推断(只能在函数内)
    fmt.Println(x)
    fmt.Println(y)
}

与 Python 不同:Go 变量的类型在声明时就固定,不能把 int 变量变成 string。要“改变类型”,请新建变量或做类型转换

x := 4          // x 是 int
// x = "text"   // ❌ 编译错误:不能把 string 赋给 int
text := "cjavapy is website" // ✅ 新变量
fmt.Println(x, text)

字符串字面量可用双引号反引号(原样字符串,不转义):

s1 := "Python"
s2 := `cjavapy`

2、变量名(命名规则)

1)只能使用字母、数字、下划线,且不能以数字开头
2)区分大小写(myVarmyvar 不同)
3)不要使用关键字(如 packagefuncvar 等)
4)包外可见(导出):首字母大写;包内私有:首字母小写
5)建议使用 camelCase,避免混淆的 lO
6)示例

// ✅ 合法
var myvar = "marry"
var my_var = "cjavapy"
var _myVar = "cjavapy"
var myVar = "cjavapy"
var MYVAR = "cjavapy"
var myvar2 = "cjavapy"
// ❌ 非法
// var 2myvar = "cjavapy"
// var my-var = "cjavapy"
// var my var = "cjavapy"

3、单行多个变量赋值

Go 支持并行赋值与多变量声明:

x, y, z := "c", "python", "java"
fmt.Println(x, y, z)
a := b := "Python" // ❌ 不合法(Go 没有链式 :=)
a, b, c := "Python", "Go", "Rust" // ✅

相同值赋给多个变量:

x, y, z := "Python", "Python", "Python"

需要“占位不用”的变量,可用 空标识符 _

left, _, right := 1, 2, 3

4、输出变量与字符串拼接

使用 fmt 包,Go 语言中的 fmt 是最常用的标准库之一,主要用于格式化输入与输出(formatted I/O),类似于 C 语言中的 printfscanf 等函数。

import (
    "fmt"
    "strconv"
)
func main() {
    x := "cjavapy"
    fmt.Println("Python " + x) // 字符串拼接
    s1 := "Python "
    s2 := "cjavapy"
    z := s1 + s2
    fmt.Println(z)
    // 数字相加
    n, m := 5, 10
    fmt.Println(n + m) // 15
    // 不能直接把数字与字符串相加(需转换)
    // fmt.Println(5 + "cjavapy") // ❌ 编译错误
    fmt.Println(strconv.Itoa(5) + " cjavapy")          // 转字符串
    fmt.Printf("%d %s\n", 5, "cjavapy")                // 格式化输出
}

5、局部变量(函数作用域)

函数内部定义的变量,只在该函数内可见,函数返回后被回收;不同函数里同名变量互不影响。

package main
import "fmt"
func demo1() {
num := 10
fmt.Println(num)
num = 20
fmt.Printf("修改后 %d\n", num)
}
func demo2() {
num := 100
fmt.Println(num)
}
func main() {
demo1()
demo2()
}

6、包级(全局)变量

函数外部定义的变量称为包级变量,同一包内的任意文件/函数都可使用;首字母大写可被其它包导入访问。

package main
import "fmt"
var x = "cjavapy" // 包级变量(全局)
func myfunc() {
    fmt.Println("Python " + x) // 读取包级变量
}
func main() {
    myfunc()
    fmt.Println("Python " + x)
}

若在函数内声明了与包级同名的变量,会遮蔽(shadow)包级变量:

var x = "awesome"
func myfunc() {
    x := "cjavapy" // 局部 x,遮蔽外部 x
    fmt.Println("Python is " + x) // cjavapy
}
func main() {
    myfunc()
    fmt.Println("Python " + x) // awesome(包级 x 未变)
}

7、如何在函数里改“全局变量”

Go 没有 global 关键字。要修改包级变量,直接赋值即可(前提:不要用 := 重新声明局部同名变量)。

package main
import "fmt"
var x = "js" // 包级变量
func myfunc() {
    // x := "cjavapy" // ❌ 这会新建局部变量,遮蔽包级 x
    x = "cjavapy"     // ✅ 正确:修改包级变量
}
func main() {
    myfunc()
    fmt.Println("c java python is " + x) // cjavapy
}
推荐阅读
cjavapy编程之路首页