Go 语言入门指南 (2)| 青训营

73 阅读6分钟

接着上一篇的知识点继续。。

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.基本数据类型

  1. 数值型
    整数类型(int,int8,int16,int32,int64,uint,uint8,uint16,uint32,uint64,byte)
    浮点类型(float32,float64)
  2. 字符型(没有单独的字符型,使用byte来保存单个字母字符)
  3. 布尔型(bool)
  4. 字符串型(string)

2.4.2派生/复杂数据类型

  1. 指针
  2. 数组
  3. 结构体
  4. 管道
  5. 函数
  6. 切片
  7. 接口
  8. 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

数组的初始化方式有多种方式,如下:

  1. 直接进行初始化:var balance = [5]float32{1000.0, 2.0, 3.4, 7.0, 50.0}
  2. 通过字面量在声明数组的同时快速初始化数组:balance := [5]float32{1000.0, 2.0, 3.4, 7.0, 50.0}
  3. 数组长度不确定,编译器通过元素个数自行推断数组长度,在[ ]中填入...,举例如下: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}
  4. 数组长度确定,指定下标进行部分初始化: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访问结构体成员

如果要访问结构体成员,需要使用点号 . 操作符,格式为:结构体变量名.成员名

剩下的知识点在下一篇中继续总结。。