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

64 阅读5分钟

指针

定义

对于一个int类型变量,它在内存中会有一个空间,里面存储的是值,而这个值还有一个十六进制的地址。而对于指针变量,它在内存中同样有一个空间,里面存放的是一个地址,地址相当于是它的值,而这个地址所指向的空间里的值,才是指针真正的值。如下图

classDiagram
变量a <|-- 变量a所对应的地址
变量a :   值
class 变量a所对应的地址{
指针变量
}

使用

var num1 *int = &num2,则表示定义和赋值一个指针变量。值得注意的是当给指针变量赋值时,我们赋的应该是一个地址,所以我们要在变量前加“&”符号。而当我们想获得指针变量所指向的值,我们应该如下使用Println(*num1)

函数

定义

为完成某一功能的语句的集合,我们将其称为函数。假如有这样一个问题:我们输入两个数,再输入一个运算符号(加减乘除或求余),最后求出结果。我们当然可用switch语句来完成。但我们会发现,光这个语句都至少需要13行代码,大大增加了代码数量,使得代码冗余。并且,当我们想修改条件时,使得维护成本增加。由此我们引出了函数。

基本语法

func 函数名(形参名 类型)(返回值 类型){
    执行语句...
    return 返回值
}

函数中形参和返回值可以取多个,用“,”来隔开。

细节

  1. 函数命名时,首字母大写则只能本包文件使用,只有大写时,才能被其它包文件使用
  2. 函数中的变量是局部的。这意味着函数内的变量和函数外的变量。即使名字相同,也并不会出问题。
  3. 基本数据类型和数组和结构体都是值传递类型。意味着当我们在函数内修改以上类型的变量,并不会影响原来的值。
  4. 如果变量是传递值类型,又想通过函数修改变量的值,可以通过以下代码的方式实现。
  5. Go语言中不支持函数重载,所以不同函数的函数名不能相同。

数组

定义

当我们需要存放十个值时,我们可以定义十个变量。但当数据增多时,意味着变量也要增多。所以我们需要引出数组的概念。数组可以存放多个同一类型的数据,数组也是一种数据类型

基本语法

语法:var 数组名 [数组大小]数据类型,如var a [5]int。 值得注意的是“[ ]”内空间大小数不能省略不写,否则这是一个切片

细节

  1. 数组一旦定义,其长度是固定的,并不会动态变化
  2. 数组的下标是从0开始。如a[3]它表示:a[0]a[1]a[2]
  3. 数组必须在下标范围内使用。如上方案例中,再给a[3]赋值则会报错

切片

定义

当我们需要一个数组存放一组数据,但数据个数是不确定的,只是我们就可以使用切片。因为切片的长度是可以变化的,所以切片是一个可以动态变化的数组。

基本语法

基本语法:var 切片名 []类型。当我们定义完切片后,还需要通过make来创建切片后才能使用,使用方法:var 切片名 []类型 = make(var 切片名 []类型,长度,容量)

map

定义

map是一种含有key-value的数据结构,类似于其它编程语言的集合

基本语法

语法:var 变量名 map[keytype]valuetype。如var a map[string]int。以上为map声明,但和切片一样,我们需要初始化后才能使用,这仍然要用到make语句。如下:

    var a map[string]string
    a = make(map[string]string,10)

map的增加、删除、修改、查询

map的增加和修改

如果我们的key值相同,而value却不相同。那么最后的那个value会覆盖之前的value,进行修改。如下方代码,则会输出数字2。

    num["num1"] = 1
    num["num1"] = 2
    fmt.Println(num)

map的删除

    num["num1"] = 1
    num["num2"] = 2
    delete(num,"num2")
    fmt.Println(num)

在上方我们用到了delete语句,输出的结果会将“num2”所对应的key-value删除。值得注意的是,即使我指定的key并不存在,delete删除不会操作,也不会报错,会返回一个nil。

map的查找

当我们直接找一个map取值时,会返回两个值,第一个是value,第二个是结果。如果有想找的key,则会返回true,否则返回false,如以下代码

    num["num1"] = 1
    num["num2"] = 2
    vb := num["num1"]
    if b {
        fmt.Println("有这个key,值为",v)
    }else{
        fmt.Println("没有这个key")
    }

struct(结构体)

定义

如人的特性可以有姓名、性别、年龄等等。那么,将这些属性(字段)提取出来,形成新的数据类型,就称为结构体。

基本语法

在此我们用定义中的例子来展示基本语法:

    type Human(结构名) struct {
        Name(数据名) string(数据类型)
        Sex string
        Age int        
}

而当我们想为某一属性赋值时,需如下使用(假设已定义一个变量a),如:a.Age = 18

细节

当两个结构体需要转换时,它们需要有完全相同的属性。包括名字,个数和类型,三者缺一不可。