Go之变量

Go之变量

API

Go语言提供了大量的标准库

标准库

这个网站容易被和谐掉,所以一直使用的是

中文网在线标准库文档

API文档只提供了包下有那些方法,方法的源码在GoSDK包的src目录下

golang编译器可以直接的直接通过ctrl+点击包看到源码

Go之变量--->Go是强类型语言,一个变量对应一个类型

变量名

字母、数字、下划线组成,首个字符不能为数字

声明变量的关键字

var

变量的声明形式

  • 指定变量类型,不初始化变量--->使用关键字var

  • 根据值自行判断变量类型--->类似python里面的形式,一开始直接赋值

  • 使用符号:=,需要注意两点:

    • 左侧如果没有声明新变量则编译错误

    • 使用符号:=声明的变量无需先使用关键字var显示声明

  • 多变量声明

    • 显式声明类型

    • 隐式声明类型--->像python一样自动判断类型

    • 声明全局变量的方法


指定变量类型,不初始化变量,变量默认为零值

    var arr [][]int
var number int
var name string
var key bool

不初始化会有一个默认的值:

  • 数值类型(包括complex64/128)为 0

  • 布尔类型为 false

  • 字符串为 ""(空字符串)

  • 布尔量默认为false

以下几种类型为:nil

var a *int //go语言的定义指针变量
var a []int //声明一个数组,类型是int类型
var a map[string] int
var a chan int
var a func(string) int
var a error // error 是接口

根据值自行判断变量类型--->类似python里面的形式,一开始直接赋值

    var name = "Lucifer"
fmt.Println(name)
var arr = 1
fmt.Println(arr)
var bool = false
fmt.Println(bool)
var deci = 3.1415926535
fmt.Println(deci)
var arrs = []int{1, 2, 3, 4, 5, 6}
fmt.Println(arrs)

特点:

  • 这种方式既可以声明基本类型也可以声明引用类型

使用符号:=

特点:左侧必须声明新的变量,否则编译不通过

格式:

v_name := value

:=var是两种声明变量的形式

    var intVal int
intVal := 1
//如果这样去声明变量编译会不通过,因为编译器认为intVal变量已经声明过了
/*
所以var关键字和:=符号都是声明变量的符号
*/

可以理解为:

var intValue int
//等价于
intValue := 1

:=符号声明变量的实例:

    myName := "Lucifer"
fmt.Println(myName)
//这是一个快速声明变量的方法,编译器会自动的匹配myName的类型

多变量声明

显式声明用于声明相同类型的多个变量
    var intValueNo1, intValueNo2, intValueNo3, intValueNo4 int
intValueNo1, intValueNo2, intValueNo3, intValueNo4 = 1, 2, 3, 4
fmt.Println(intValueNo1, intValueNo2, intValueNo3, intValueNo4)
隐式类型用于声明类型不同的多个变量
    var intVal, stringValue, boolVlaue = 1, "你好", true
fmt.Println(intVal, stringValue, boolVlaue)
//编译器会根据右边赋值的值类型判断左边的变量类型
/*
需要使用`var`关键字声明变量名称
*/
使用:=快速声明的话左边的变量不应该是已经被声明过的
    intValue, stringValueNo1, boolValueNo1 := 1, "Junking", true
fmt.Println(intValue, stringValueNo1, boolValueNo1)
声明全局变量的方法
package main

import "fmt"

var x, y int
var (
a int
b bool
c string
d float64
)

var e, f = 1, "JunkingBoy"

func main() {
g, h := "Hello", "World"
fmt.Println(a,b,c,d,e,f,x,y,g,h)
}

使用var关键字后接一个块{用"()"包裹起来,不再需要在变量前面声明var关键字,只需要声明类型即可}

这样的声明方式必须显示的声明出变量的类型

值类型(基本类型)和引用类型

值类型(基本类型)

  • int、float、bool这些基本类型属于值类型

特点:

  • 变量直接指向内存中的值

  • 变量使用=赋值符号会拷贝一份右边的变量

  • 变量存储在栈当中*(这点和Java是一致的)

  • 可以使用&+变量获取到变量的内存地址

引用类型

数组、Map等这些是引用类型

以数组举例:

    arrays := []int{1,2,3,4,5,6}
fmt.Println(arrays)
//:=符号是重新声明一个变量

分析:

  • var arrays是一个引用类型(数组)的变量

  • arrays指向的是一个实际的数组对象的地址变量

  • 将数组赋值给多个变量的时候也是将地址传递给变量而非数组对象本身

特点:

  • 从图中可以看到address1也是一个变量,该变量指向引用类型对象本身

  • 因此go可以创建指针变量,可以通过修改指针变量的值来达到修改引用变量指向的引用类型对象的效果

  • 使用r2 = r1只有指针的地址被复制,对象本身不会被复制--->r1 的值被改变了,那么这个值的所有引用都会指向被修改后的内容

  • 同一个引用类型的指针指向的多个字可以是在连续的内存地址中(内存布局是连续的),也可以将这些字分散存放在内存中,每个字都指示了下一个字所在的内存地址。--->很像链表

声明指针变量的格式

    var ptr *int
//这样就声明好了一个指针变量,此时他还未指向任何一个引用对象

在go中,只有全局变量是允许声明但不使用

特点:

  • go和C++类似,允许指针指向指针。所以可以声明一个指针变量,让其指向另一个指针

声明格式:

var ptr **int
//使用两个**符号
//要使用引用符号&将变量的值引用给指向指针的变量

使用实例:

package main

import "fmt"

var x, y int
var (
a int
ptr *int
ptrPointer **int
)

func main() {
ptr = &a
ptrPointer = &ptr //注意这里不能直接用赋值符号,应该使用的是引用符号。既引用*ptr指针的地址
fmt.Println("指向指针的指针变量值为:", **ptrPointer) //这个打印会打印出指针指向的对象的值
fmt.Println("它的地址为:", ptrPointer)
}

 

原文地址:https://www.cnblogs.com/JunkingBoy/p/15141436.html