接着上一篇的知识点继续。。
2.3变量
任何编程语言都离不开变量,一提到变量,我们可以想到变量的类型,变量的声明,变量的初始化等。
变量的使用步骤: 1.声明2.赋值3.使用
在Go语言中,变量是强类型的,而不是弱类型的,这就意味着我们必须在声明变量的时候指明变量的类型。
使用var关键字声明变量。
var name = "Joker" // 字符串
var birthday = 717 // 数值
var isHappy = true // 布尔值
编译器可以根据右侧的值自动推断出变量的类型,因此,我们在变量声明时可以省略掉变量的类型。
如果我们需要强调变量的类型,也可以手动指明变量的类型。
Go语言中常量的声明与其他语言不太相同,需要使用const关键字替换var关键字。
package main
import "fmt"
func main(){
//1.变量的声明
var age int
//2.变量的赋值
age = 18
//3.变量的使用
fmt.Println("age = ",age);
//声明和赋值可以合成一句:
var age2 int = 19
fmt.Println("age2 = ",age2);
// var age int = 20;
// fmt.Println("age = ",age);
/*变量的重复定义会报错:
# command-line-arguments
.\main.go:16:6: age redeclared in this block previous declaration at.\main.go:6:6
*/
//不可以在赋值的时候给与不匹配的类型
var num int = 12.56
fmt.Println("num = ",num);
}
支持一次性声明多个变量(多变量声明)
package main
import "fmt"
//全局变量:定义在函数外的变量
var n7 = 100
var n8 = 9.7
//设计者认为上面的全局变量的写法太麻烦了,可以一次性声明:
var (
n9 = 500
n10 = "netty"
)
func main(){
//定义在{}中的变量叫:局部变量
//第一种:变量的使用方式:指定变量的类型,并且赋值,
var num int = 18
fmt.Println(num)
//第二种:指定变量的类型,但是不赋值,使用默认值
var num2 int
fmt.Println(num2)
//第三种:如果没有写变量的类型,那么根据=后面的值进行判定变量的类型 (自动类型推断)
var num3 = "tom"
fmt.Println(num3)
//第四种:省略var,注意 := 不能写为 =
sex := "男"
fmt.Println(sex)
//声明多个变量:
var n1,n2,n3 int
fmt.Println(n1)
fmt.Println(n2)
fmt.Println(n3)
var n4,name,n5 = 10,"jack",7.8
fmt.Println(n4)
fmt.Println(name)
fmt.Println(n5)
n6,height := 6.9,100.6
fmt.Println(n6)
fmt.Println(height)
fmt.Println(n7)
fmt.Println(n8)
fmt.Println(n9)
fmt.Println(n10)
}
2.4数据类型
2.4.1.基本数据类型
- 数值型
整数类型(int,int8,int16,int32,int64,uint,uint8,uint16,uint32,uint64,byte)
浮点类型(float32,float64) - 字符型(没有单独的字符型,使用byte来保存单个字母字符)
- 布尔型(bool)
- 字符串型(string)
2.4.2派生/复杂数据类型
- 指针
- 数组
- 结构体
- 管道
- 函数
- 切片
- 接口
- map
2.5指针
与C相同,Go语言让程序员决定何时使用指针。变量其实是一种使用方便的占位符,用于引用计算机内存地址。Go 语言中的的取地址符是&,放到一个变量前使用就会返回相应变量的内存地址。
指针变量其实就是用于存放某一个对象的内存地址。
2.5.1指针的声明和初始化
和基础类型数据相同,在使用指针变量之前我们首先需要申明指针,声明格式如下:
var var_name *var-type
其中的var-type 为指针类型,var_name 为指针变量名,* 号用于指定变量是作为一个指针。
指针的初始化就是取出相对应的变量地址对指针进行赋值,具体如下:
var a int= 20 /* 声明实际变量 */
var ip *int /* 声明指针变量 */
ip = &a /* 指针变量的存储地址 */`
2.5.2空指针
当一个指针被定义后没有分配到任何变量时,它的值为 nil,也称为空指针。它概念上和其它语言的null、NULL一样,都指代零值或空值。
2.6数组
和c语言相同,Go语言也提供了数组类型的数据结构,数组是具有相同唯一类型的一组已编号且长度固定的数据项序列,这种类型可以是任意的原始类型例如整型、字符串或者自定义类型。
2.6.1指针的声明和初始化
Go 语言数组声明需要指定元素类型及元素个数,语法格式如下:
var variable_name [SIZE] variable_type
数组的初始化方式有多种方式,如下:
- 直接进行初始化:var balance = [5]float32{1000.0, 2.0, 3.4, 7.0, 50.0}
- 通过字面量在声明数组的同时快速初始化数组:balance := [5]float32{1000.0, 2.0, 3.4, 7.0, 50.0}
- 数组长度不确定,编译器通过元素个数自行推断数组长度,在[ ]中填入...,举例如下:var balance = [...]float32{1000.0, 2.0, 3.4, 7.0, 50.0}和balance := [...]float32{1000.0, 2.0, 3.4, 7.0, 50.0}
- 数组长度确定,指定下标进行部分初始化:balanced := [5]float32(1:2.0, 3:7.0)
注意:
- 初始化数组中 { } 中的元素个数不能大于 [ ] 中的数字。
- 如果忽略 [ ] 中的数字不设置数组大小,Go 语言会根据元素的个数来设置数组的大小。
2.6.2数组指针
在c语言中我们知道数组名在本质上是数组中第一个元素的地址,而在go语言中,数组名仅仅表示整个数组,是一个完整的值,一个数组变量即是表示整个数组。
所以在go中一个数组变量被赋值或者被传递的时候实际上就会复制整个数组。如果数组比较大的话,这种复制往往会占有很大的开销。所以为了避免这种开销,往往需要传递一个指向数组的指针,这个数组指针并不是数组。
通过数组和指针的知识我们就可以定义一个数组指针,代码如下:
var a = [...]int{1, 2, 3} // a 是一个数组
var b = &a // b 是指向数组的指针
数组指针除了可以防止数组作为参数传递的时候浪费空间,还可以利用其和for range来遍历数组,具体代码如下:
for i, v := range b { // 通过数组指针迭代数组的元素
fmt.Println(i, v)
}
2.7结构体
通过上述数组的学习,我们就可以直接定义多个同类型的变量,但这往往也是一种限制,只能存储同一种类型的数据,而我们在结构体中就可以定义多个不同的数据类型。
2.7.1结构体的声明
在声明结构体之前我们首先需要定义一个结构体类型,这需要使用type和struct,type用于设定结构体的名称,struct用于定义一个新的数据类型。具体结构如下:
type struct_variable_type struct {
member definition
member definition
...
member definition
}
定义好了结构体类型,我们就可以使用该结构体声明这样一个结构体变量,语法如下:
variable_name := structure_variable_type {value1, value2...valuen}
variable_name := structure_variable_type { key1: value1, key2: value2..., keyn: valuen}
2.7.2访问结构体成员
如果要访问结构体成员,需要使用点号 . 操作符,格式为:结构体变量名.成员名。
剩下的知识点在下一篇中继续总结。。