变量

概念:变量是编程语言的最基本的组成元素,是一种占位符,用于引用计算机内存地址,可以存储计算结果或能表示结果,在程序运行期间内容改变的量。

变量类型

Go语言变量可以分为值类型和引用类型两种类型。
值类型:包含 int、float、bool、string ,变量直接存储值,内存通常在栈中分配,栈在函数调用完会被释放。
引用类型:有slice、map、chan、struct、interface、指针和函数,变量存储的是地址,这个地址对应的空间才是真正的存储数据,内存分配一般在堆上,通过GC回收。

变量声明

var声明
用关键字var 后面变量名称 变量类型,如:
//指定变量名和值,类型由推导器推导
var age = 20
//指定变量名和类型
var age int
//指定变量名、类型和值
var age int = 20
一次定义多个变量
var a,b string
var c,d int
var (
    e int
    f string
    )
var a, b, c = 5, "hello", 3.45
短声明
短声明是根据值推导具体的类型,省略var,左边使用 :=,注意:=不能分开必须写在一起,如下:
age:=20 //age为int型
money:=100.00 //float64
name:="名称" //string
通过这个特性可以赋值交换
i,j=j,i
:=声明变量时不需要每个变量都是新的,但至少需要一个是新的
err:=errors.New("我是错误")
f,err:=os.Open("a.text")
只能用于局部变量,不能用于全局变量
package main

a := "全局变量" //syntax error: non-declaration statement outside function body
func main(){
    b := "局部变量"
}
注意不能和结构体成员一起使用
package main
import "fmt"
type User struct {
    Name string
}
func main() {
    var user User
    user.Name, a := "aad", 1515 //non-name user.Name on left side of :=
    fmt.Println(user, a)
}

变量作用域

  • 定义函数外的变量称为全局变量
  • 定义函数内的变量称为局部变量
全局变量
全局变量也可以叫做包变量,定义在函数体外的变量,他的生命周期是常驻内存直到程序结束,由系统GC回收,下面的name、age是全局变量:
package main

import (
    "fmt"
)
//定义在函数体外
var name = "小明"
var age = 25 
func main() {
    fmt.Println(name, age)
}
局部变量
局部变量是定义在函数体内的变量,他们的作用域都在函数体内,函数的参数、返回值、以及{}里面的参数都属于局部变量,他们的生命周期是没执行一次就新创建一个实例,直到无不可访问(函数结束)。下面的name、age都是局部变量:
package main
import (
    "fmt"
)
func main() {
    //定义在函数体内
    name := "小明"
    var age = 25
    fmt.Println(name, age)
}
定义在函数括号后面的参数叫做形式参数,只有在函数调用在起作用,函数结束会被销毁,不占用实际的存储单元,也没有实际值。下面的name是形式参数:
package main

import (
    "fmt"
)

func main() {
    var str = "小明"
    getName(str)
}

func getName(name string) {
    fmt.Println(name)
}
如果变量是在一个代码块,比如 for / if 中,那么这个变量的的作用域就在该代码块,如下面name变量地址在每次循环都是不一样的
package main

import (
    "fmt"
)

func main() {
    for i := 0; i < 3; i++ {
        var name = "小明"
        fmt.Printf("name 变量地址 = %p\n", &name)
    }
}

name 变量地址 = 0xc0000361d0
name 变量地址 = 0xc0000361e0
name 变量地址 = 0xc0000361f0

常量

常量使用关键字const 声明,定义格式 const t_name [type] = value,例如:
const PI = 3.14
const NAME string = "哈皮"
常量定义时必须赋值:
const NAME  //missing value in const declaration
虽然在定义是数据类型只能是数字型(整数型、浮点型和复数)、布尔型(bool)、字符串型(string),但常量是属于无类型。
const NAME string //const declaration cannot have type without expression
const ARR = []int{1,2} //const initializer []int literal is not a constant
常量一旦声明就无法改变
package main
​
import "fmt"
​
const NAME = "老王"
​
func main() {
 NAME ="老李" //cannot assign to NAME
 fmt.Println(NAME)
}
值在编译期间确定,当做操作符来运算,不能取地址操作
package main
​
import "fmt"
​
const NAME = "老王"
​
func main() {
 fmt.Printf("%p",&NAME) //cannot take the address of NAME
}

命名规范

Go是一门区分大小写的语言。
必须以字符(可以使用任何 UTF-8 编码的字符或 _)开头,然后紧跟着 0 个或多个字符或 Unicode 数字,如:X56、group1、_x23、i、өԑ12
以下无效标识符:
  • 1ab(以数字开头)
  • case(Go 语言的关键字)
  • a+b(运算符是不允许的)
包名称
包名不要求和目录保持一致,但同一目录下的包名必须一样,通常都是保持和一致,尽量采取有意义的包名,简短,有意义,尽量和标准库不要冲突
文件命名
尽量采取有意义的文件名,简短,有意义,应该为小写单词,使用下划线分隔各个单词,其中测试文件以_test.go结尾,除测试文件外,如:
user.go
user_test.go
变量命名
变量命名一般采用驼峰式,当遇到特有名词(缩写或简称,如DNS)的时候,特有名词根据是否私有全部大写或小写,如:
UserName
passWord
结构体命名
采用驼峰命名法,首字母大、小写可以控制访问权限、大写对外暴露、包外可访问、小写只能包内访问

Go 关键字

键字不能够作标识符使用
break    default      func    interface    select
case     defer               map          struct
chan     else         goto    package      switch
const    fallthrough  if      range        type
continue for          import  return       var

一夕烟云
1 声望1 粉丝