- 如果在函数中声明,则仅在函数内有效;
- 如果在函数外声明且小写开头,则在包内可见,即,在当前文件内可见,以及在同一个包内的其它源文件内可见;
- 如果在函数外声明且大写开头,则设为export,对于包外可见和可用。
publicprivate
命名风格
可见性越大,则命名可以越长越详细,可见性越小,命名越简单。
userNameuser_name
htmlEscapeHTMLEscapeescapeHTMLescapeHtml
变量声明
语法:
var name type = expression
falsenil
var i int // 初始化为0
var i = 0 // 推断为int类型
var i, j, k int // 三个int,初始化为0
var i, j, k = true, 2.3, "hello" // 推断为bool类型、float64类型和string类型
短变量声明
var
name := expression
使用短变量声明的形式,通常说明它本身不重要,属于临时变量。
:==
::
变量的生命周期
生命周期就是值变量存在的时间段。
包级别的变量的生命周期是永久,有点类似java的静态属性。
局部变量的生命周期是从创建到不可被访问。当它不可达时,就等着被GC。GC的理念跟java差不多,GCRoot是包级别的变量+当前执行函数的局部变量,从GCRoot找不到的东西就会被回收。
变量可能会创建在堆上或栈上,依据是根据编译器的逃逸分析,如果生命周期很短,则在栈上分配,出栈时可以直接清空内存,如果生命周期很长,比如包级别的变量,或者成功逃逸的变量(将内存地址赋值给了包级别的变量),则在对上分配内存。