我们将在本文中学习到:
符号名
配对的存储地址(内存地址标识)go语言是静态类型的语言,需要在运行前明确变量的数据类型以及大小。如下图是静态语言与动态语言的区别。动态语言可以在运行时扩展变量的大小。
变量的声明使用var
来标识,变量声明的通用格式如下:
var name type = expression
var i int
// 外部连续声明
var U, V, W float64
// 赋值不带类型,自动推断
var k = 0
// 外部连续声明+赋值
var x, y float32 = -1, -2
// 外部var括号内部
var (
g int
u, v, s = 2.0, 3.0, "bar"
)
func main() {
//函数内部的变量声明 声明的变量类型必须使用 否则报错
var x string
// 只限函数内部 自动推断类型
y := "jonson"
全局作用域 > 包级别作用域 > 文件级别作用域 > 函数作用域 > 内部作用域
universe block > package block > file block > function block > inner block
內建类型: int int8 int16 int32 int64
uint uint8 uint16 uint32 uint64 uintptr
float32 float64 complex128 complex64
bool byte rune string error
內建常量: true false iota nil
內建函數: make len cap new append copy close delete
complex real imag
panic recover
println
就是包级别作用域package main
import "fmt"
var x int=5
func main(){
fmt.Println("mainx:",x)
}
// f1.go
package main
var x int
//-------------------------------------
// f2.go
package main
func f() {
fmt.Println(x)
}
//testdemo/destdemo.go
package testdemo
import "fmt"
var Birth uint = 23
func Haha(){
fmt.Println("lalalal")
}
//-------------------------------------
package main // main/scope.go
import (
"testdemo"
"fmt"
)
func main(){
testdemo.Haha()
fmt.Println(testdemo.Birth)
}
// f1.go
package main
import "fmt"
//-------------------------------------
// f2.go 无效
package main
func f() {
fmt.Println("Hello World")
}
func add(a int,b int)(c int) {
fmt.Println("Hello World")
x := 5
fmt.Println(x)
}
//下面的代码无效:
func main() {
fmt.Println("Hello World")
fmt.Println(x)
x := 5
}
//下面的代码无效2:
func main() {
fmt.Println("Hello World")
x := 5
fmt.Println(x)
}
//
func test(){
fmt.Println(x)
}
package main
import "fmt"
var x int=5
func test(){
var x int = 99;
x = 100;
// 下面的代码输出结果为: 100
fmt.Println("testx",x)
}
func main() {
fmt.Println("Hello World") // scope1
{ // scope2
x := 5 // scope3
fmt.Println(x) // scope4
} // scope5
}
我们在前文go语言是如何运行的-内存概述 与 go语言是如何运行的-内存分配 中,详细介绍了在虚拟内存角度其不同的段
及其功能
.data
和.bss
段。我们可以用下面的实例来验证// main.go
package main
var aaa int64 = 8
var ddd int64
func main() {
}
$ go tool compile -S main.go
...
"".aaa SNOPTRDATA size=8
0x0000 08 00 00 00 00 00 00 00
"".ddd SNOPTRBSS size=8
...
aaa
位于 .data
段中, 变量ddd
位于.bss
段.data
段中,例如长度大于4
的数组字面量、字符串
等,如下所示func main() {
var vvv = [5]int{1,2,3,4,5}
var bbb string = "hello"
}
.data
段中$ go tool compile -S main.go
...
go.string."hello" SRODATA dupok size=5
0x0000 68 65 6c 6c 6f hello
type.[5]int SRODATA dupok size=72
"".ddd SNOPTRBSS size=8
...