Go语言学习之数组的用法详解

目录
  • 引言
  • 一、数组的定义
    • 1. 语法
    • 2. 示例
  • 二、数组的初始化
    • 1. 未初始化的数组
    • 2. 使用初始化列表
    • 3. 省略数组长度
    • 4. 指定索引值的方式来初始化
    • 5. 访问数组元素
    • 6. 根据数组长度遍历数组
  • 三. 访问数组元素
    • 1. 访问数组元素
    • 2. 根据数组长度遍历数组
  • 四、冒泡排序
  • 五、多维数组
    • 1. 二维数组
    • 2. 初始化二维数组
    • 3. 访问二维数组
  • 六、向函数传递数组
    • 1. 形参设定数组大小
    • 2. 形参未设定数组大小
    • 3. 示例
  • 总结

引言

数组是相同数据类型的一组数据的集合,数组一旦定义长度不能修改,数组可以通过下标(或者叫索引)来访问元素。

相对于去声明 number0, number1, ..., number99 的变量,使用数组形式 numbers[0], numbers[1] ..., numbers[99] 更加方便且易于扩展。
数组元素可以通过索引(位置)来读取(或者修改),索引从0 开始,第一个元素索引为 0,第二个索引为1,以此类推。

一、数组的定义

1. 语法

var  variable_name [SIZE] variable_type  

variable_name:数组的名称

SIZE:数组长度,必须是常量

variable_type:数组保存元素的类型

2. 示例

package main

import "fmt"

func main() {
    var a [3]int    //定义一个int类型的数组a,长度是3
    var b [2]string //定义一个字符串类型的数组b,长度是2

    fmt.Printf("a: %T\n", a) //使用%T来输出类型
    fmt.Printf("b: %T\n", b)
    fmt.Printf("a: %v\n", a)
    fmt.Printf("b: %v\n", b)
}

//输出结果如下,可以看到没初始化的值,int是0,而字符串则是空的字符串
a: [3]int
b: [2]string
a: [0 0 0]
b: [ ]

从上面运行的结果中可以看出来,数组和长度和元素类型共同组成了数组的类型

二、数组的初始化

初始化,就是给数组的元素赋值,没有初始化的数组,默认元素值都是零值,布尔类型是false,字符串是空字符串。

1. 未初始化的数组

package main

import "fmt"

func main() {
    var a [2]bool
    var b [2]int
    var c [3]string
    var d [3]float32

    fmt.Printf("a: %v\n", a)
    fmt.Printf("b: %v\n", b)
    fmt.Printf("c: %v\n", c)
    fmt.Printf("d: %v\n", d)

}

//输出结果如下
a: [false false]
b: [0 0]
c: [  ]
d: [0 0 0]

2. 使用初始化列表

package main

import "fmt"

func main() {
    var a = [3]int{1, 2, 3}
    var b = [2]string{"hello world"}
    var c = [2]bool{true, false}

    a1 := [2]int{1, 2} //类型推断
    fmt.Printf("a: %v\n", a)
    fmt.Printf("b: %v\n", b)
    fmt.Printf("c: %v\n", c)
    fmt.Printf("a1: %v\n", a1)
}

//输出结果如下
a: [1 2 3]
b: [hello world ]
c: [true false]
a1: [1 2]

使用初始化列表,就是将值写在大括号里面

3. 省略数组长度

如果数组长度不确定,可以使用 ...代替数组的长度,编译器会根据元素个数自行推断数组的长度

package main

import "fmt"

func main() {
    var a = [...]int{1, 2, 3, 4, 5}
    var b = [...]string{"hello", "world", "hello", "go"}
    var c = [...]bool{true, false}

    a1 := [...]int{1, 2} //类型推断

    fmt.Printf("a: %v\n", a)
    fmt.Printf("b: %v\n", b)
    fmt.Printf("c: %v\n", c)
    fmt.Printf("a1: %v\n", a1)
}

//输出结果如下
a: [1 2 3 4 5]
b: [hello world hello go]
c: [true false]
a1: [1 2]

4. 指定索引值的方式来初始化

可以通过指定所有方式来初始化,未指定的所有默认值为零值

package main

import "fmt"

func main() {
    var a = [...]int{0: 1, 2: 2}
    var b = [...]string{1: "hello", 2: "go"}
    var c = [...]bool{2: true, 5: false}

    a1 := [...]int{1, 2} //类型推断

    fmt.Printf("a: %v\n", a)
    fmt.Printf("b: %v\n", b)
    fmt.Printf("c: %v\n", c)
    fmt.Printf("a1: %v\n", a1)
}

//输出结果如下
a: [1 0 2]
b: [ hello go]
c: [false false true false false false]
a1: [1 2]

总结

初始化数组中{}中的元素个数不能大于[]中的数字。

如果忽略[]中的数字不设置数组大小,Go 语言会根据元素的个数来设置数组的大小:

5. 访问数组元素

数组元素可以通过索引(位置)来读取。

格式为数组名后加中括号,中括号中为索引的值。数组的最大下标为数组长度-1,大于这个下标会发生数组越界。

示例

package main

import "fmt"

func main() {
    var a [2]int
    a[0] = 100
    a[1] = 200
    fmt.Printf("a[0]: %v\n", a[0])
    fmt.Printf("a[1]: %v\n", a[1])

    //对数组进行修改
    a[0] = 1
    a[1] = 2
    fmt.Println("---------修改后--------")
    fmt.Printf("a[0]: %v\n", a[0])
    fmt.Printf("a[1]: %v\n", a[1])
}

//输出结果如下
a[0]: 100
a[1]: 200
---------修改后--------
a[0]: 1
a[1]: 2

6. 根据数组长度遍历数组

可以根据数组长度,通过for循环的方式来遍历数组,数组的长度可以使用len函数获得

使用len()函数获取数组的长度

package main

import "fmt"

func main() {
    var a1 = [3]int{1, 2, 3}
    fmt.Printf("len(a1): %v\n", len(a1))

    var a2 = [...]int{1, 2, 3, 4, 5, 6, 7, 8, 9}
    fmt.Printf("len(a2): %v\n", len(a2))
}

//输出结果如下
len(a1): 3
len(a2): 9

数组遍历,根据长度和下标

package main

import "fmt"

func main() {
    a := [...]int{1, 2, 3, 4, 5, 6, 7, 8, 9}
    for i := 0; i < len(a); i++ {
        fmt.Printf("a[%d]:%v\n", i, a[i])
    }
}

//输出结果如下
a[0]:1
a[1]:2
a[2]:3
a[3]:4
a[4]:5
a[5]:6
a[6]:7
a[7]:8
a[8]:9

使用for range

package main

import "fmt"

func main() {
    var a = [...]int{1, 2, 3, 4, 5, 6, 7, 8, 9}
    for i, v := range a {               //i也可以使用空白标识符代替,不接受索引的值
        fmt.Printf("a[%v]:%v\n", i, v)
    }
}

//输出结果如下
a[0]:1
a[1]:2
a[2]:3
a[3]:4
a[4]:5
a[5]:6
a[6]:7
a[7]:8
a[8]:9

三. 访问数组元素

1. 访问数组元素

  • 数组元素可以通过索引(位置)来读取。
  • 格式为数组名后加中括号,中括号中为索引的值。数组的最大下标为数组长度-1,大于这个下标会发生数组越界。

示例 ①

package main

import "fmt"

func main() {
    var a [2]int
    a[0] = 100
    a[1] = 200
    fmt.Printf("a[0]: %v\n", a[0])
    fmt.Printf("a[1]: %v\n", a[1])

    //对数组进行修改
    a[0] = 1
    a[1] = 2
    fmt.Println("---------修改后--------")
    fmt.Printf("a[0]: %v\n", a[0])
    fmt.Printf("a[1]: %v\n", a[1])
}

//输出结果如下
a[0]: 100
a[1]: 200
---------修改后--------
a[0]: 1
a[1]: 2

示例 ②

package main

import "fmt"

func main() {

    //声明数组的同时快速初始化数组
    balance := [5]float32{1000.0, 2.0, 3.4, 7.0, 50.0}

    //输出数组元素
    for i := 0; i < 5; i++ {
        fmt.Printf("balance[i]: %f\n", balance[i])
    }

    //输出每个数组元素的值
    balance2 := [...]float32{1000.0, 2.0, 3.4, 7.0, 50.0}
    for x := 0; x < 5; x++ {
        fmt.Printf("balance2[x]: %f\n", balance2[x])
    }

    //将索引为1和3的元素初始化
    balance3 := [5]float32{1: 2.0, 3: 7.0}
    for y := 0; y < 5; y++ {
        fmt.Printf("balance3: %f\n", balance3[y])
    }
}

//输出结果如下
balance[i]: 1000.000000
balance[i]: 2.000000
balance[i]: 3.400000
balance[i]: 7.000000
balance[i]: 50.000000
balance2[x]: 1000.000000
balance2[x]: 2.000000
balance2[x]: 3.400000
balance2[x]: 7.000000
balance2[x]: 50.000000
balance3: 0.000000
balance3: 2.000000
balance3: 0.000000
balance3: 7.000000
balance3: 0.000000

2. 根据数组长度遍历数组

可以根据数组长度,通过for循环的方式来遍历数组,数组的长度可以使用len函数获得

使用len()函数获取数组的长度

package main

import "fmt"

func main() {
    var a1 = [3]int{1, 2, 3}
    fmt.Printf("len(a1): %v\n", len(a1))

    var a2 = [...]int{1, 2, 3, 4, 5, 6, 7, 8, 9}
    fmt.Printf("len(a2): %v\n", len(a2))
}

//输出结果如下
len(a1): 3
len(a2): 9

数组遍历,根据长度和下标

package main

import "fmt"

func main() {
    a := [...]int{1, 2, 3, 4, 5, 6, 7, 8, 9}
    for i := 0; i < len(a); i++ {
        fmt.Printf("a[%d]:%v\n", i, a[i])
    }
}

//输出结果如下
a[0]:1
a[1]:2
a[2]:3
a[3]:4
a[4]:5
a[5]:6
a[6]:7
a[7]:8
a[8]:9

使用for range

package main

import "fmt"

func main() {
    var a = [...]int{1, 2, 3, 4, 5, 6, 7, 8, 9}
    for i, v := range a {               //i也可以使用空白标识符代替,不接受索引的值
        fmt.Printf("a[%v]:%v\n", i, v)
    }
}

//输出结果如下
a[0]:1
a[1]:2
a[2]:3
a[3]:4
a[4]:5
a[5]:6
a[6]:7
a[7]:8
a[8]:9

四、冒泡排序

1. 控制台输入十名学生的成绩,如果低于60自动修改为60,并最终展示成绩清单

package main

import "fmt"

func main() {
    var source [10]float32 //分数
    var s float32          //初始化成绩
    //遍历数组
    for i := 0; i < 10; i++ {
        fmt.Printf("请输入第%d学生的成绩:", i+1)
        fmt.Scan(&s)
        if s < 60 {
            //修改为60分
            source[i] = 60
        } else {
            //添加学生成绩
            source[i] = s
        }
    }
    fmt.Println("成绩录入成功!")
    fmt.Println("成绩清单如下")
    for j := 0; j < 10; j++ {
        fmt.Printf("第%d名学生的成绩", j+1)
        fmt.Println(source[j])

    }
}

//终端输入结果
PS D:\goproject\src\dev_code\day10\test\main> go run .\
请输入第1学生的成绩:50
请输入第2学生的成绩:55
请输入第3学生的成绩:80
请输入第4学生的成绩:70
请输入第5学生的成绩:90
请输入第6学生的成绩:50
请输入第7学生的成绩:30
请输入第8学生的成绩:44
请输入第9学生的成绩:55
请输入第10学生的成绩:66
成绩录入成功!
成绩清单如下
第1名学生的成绩60
第2名学生的成绩60
第3名学生的成绩80
第4名学生的成绩70
第5名学生的成绩90
第6名学生的成绩60
第7名学生的成绩60
第8名学生的成绩60
第9名学生的成绩60
第10名学生的成绩66

2. 随机输入5个数字,求出最大值

package main

import (
    "fmt"
)

func main() {
    var (
        tmp     int    //用来接收比较出来最大的那个数字
        num     int    //录入的数字
        numbers [5]int //5个数字
    )
    for i := 0; i < 5; i++ {
        fmt.Printf("请输入第%d个数字:", i+1)
        fmt.Scan(&num)
        //输入的数字添加到集合中
        numbers[i] = num
    }
    fmt.Println("录入成功!")
    tmp = numbers[0]
    for j := 0; j < 5; j++ {
        //比较最大的数,大的那个数用tmp来接收保存,循环的进行比较
        if numbers[j] > tmp {        //如果是求最小值,把>改为<即可
            tmp = numbers[j]
        }
    }
    fmt.Println("最大值:", tmp)
}

//终端输入结果如下
PS D:\goproject\src\dev_code\day10\test\main> go run .\
请输入第1个数字:888
请输入第2个数字:756
请输入第3个数字:358
请输入第4个数字:218
请输入第5个数字:8489
录入成功!
最大值: 8489

3. 冒泡排序

思路

  • 冒泡排序要对一个列表多次重复遍历。它要比较相邻的两项,并且交换顺序排错的项,每对列表进行一次遍历,就有一个最大项排在了正确的位置。
  • 列表的每一个数据项都会在其相应的位置 冒泡。如果列表有 n 项,第一次遍历就要比较 n-1 对数据。
  • 一旦列表中最大的数是所比较的数据对中的一个,它就会沿着列表一直后移,直到这次遍历结束

package main

import "fmt"

var arr = [...]int{34, 61, 22, 75, 42}

func main() {
    fmt.Println("初始值为:", arr)
    //外循环控制比较的轮数
    for j := 0; j < len(arr)-1; j++ {
        //内循环控制比较的次数
        for i := 0; i < len(arr)-j-1; i++ { //内层的每轮比较的次数都-1次
            if arr[i] > arr[i+1] {
                //两数比较以后进行位置交换
                arr[i], arr[i+1] = arr[i+1], arr[i]
            }
        }
    }
    fmt.Println("----排序结束----")
    fmt.Println(arr)
}

//输出结果如下
初始值为: [34 61 22 75 42]
----排序结束----
[22 34 42 61 75]

控制台随机输入几个数,进行冒泡排序

package main

import "fmt"

var (
    numbers int       //指定输入的数
    arr     = []int{} //空数组
)

func main() {
    for i := 0; i < 5; i++ {
        fmt.Printf("请输入第%d个数字:", i+1)
        fmt.Scan(&numbers)
        arr = append(arr, numbers)      //使用append进行添加数组元素
        fmt.Println("添加成功")
    }
    fmt.Println("初始值为:", arr)
    //外循环控制比较的轮数
    for j := 0; j < len(arr)-1; j++ {
        //内循环控制比较的次数
        for i := 0; i < len(arr)-j-1; i++ { //内层的每轮比较的次数都-1次
            if arr[i] > arr[i+1] {
                //两数比较以后进行位置交换
                arr[i], arr[i+1] = arr[i+1], arr[i]
            }
        }
    }
    fmt.Println("----排序结束----")
    fmt.Println(arr)

}

//输出结果如下
请输入第1个数字:88
添加成功
请输入第2个数字:99
添加成功
请输入第3个数字:50
添加成功
请输入第4个数字:146
添加成功
请输入第5个数字:48
添加成功
初始值为: [88 99 50 146 48]
----排序结束----
[48 50 88 99 146]

五、多维数组

Go 语言支持多维数组,如下

//常用的多维数组声明方式:
 var variable_name [SIZE1][SIZE2]...[SIZEN] variable_type
//三维的整型数组:
var threedim [5][10][4]int

1. 二维数组

二维数组是最简单的多维数组,二维数组本质上是由一维数组组成的。

二维数组定义方式如下

var arrayName [ x ][ y ] variable_type

variable_type 为 Go 语言的数据类型,arrayName 为数组名,二维数组可认为是一个表格,x 为行,y 为列

下图演示了一个二维数组 a 为三行四列:

二维数组中的元素可通过 a[i][j]来访问

package main

import "fmt"

func main() {
    //创建数组
    numbers := [][]int{}
    //使用 append() 函数向空的二维数组添加两行一维数组
    x := []int{1, 2, 3}
    y := []int{4, 5, 6}
    numbers = append(numbers, x)
    numbers = append(numbers, y)
    //显示两行数据,查看二维数组中的第一个数组和第二个数组
    fmt.Printf("二维数组中的第1个一维数组为: %v\n", numbers[0])
    fmt.Printf("二维数组中的第1个一维数组为: %v\n", numbers[1])

    fmt.Printf("二维数组中的第1个一维数组的第一个元素为: ")
    fmt.Println(numbers[0][0]) //numbers[0]里面的第一个元素[0],为1

}

//输出结果如下
二维数组中的第1个一维数组为: [1 2 3]
二维数组中的第1个一维数组为: [4 5 6]
二维数组中的第1个一维数组的第一个元素为: 1

2. 初始化二维数组

多维数组可通过大括号来初始值,以下为一个3行4列的二维数组

a := [3][4]int {
    {0,1,2,3},          //第1行索引为0
    {4,5,6,7},          //第2行索引为1
    {8,9,10,11},        //第3行索引为2
    }

注意,上面的代码中倒数第二行的 }必须有逗号,因为最后一行的 }不能单独一行,也可以写成下面这样

a := [3][4]int {
    {0,1,2,3},          //第1行索引为0
    {4,5,6,7},          //第2行索引为1
    {8,9,10,11}}        //第3行索引为2

示例,初始化一个2行2列的二维数组

package main

import "fmt"

func main() {
    //创建二维数组
    list := [2][2]string{}

    //向二维数组中添加元素
    list[0][0] = "你好" //第1个一维数组中的第1个元素
    list[0][1] = "欢迎" //第1个一维数组中的第2个元素
    list[1][0] = "来到" //第2个一维数组中的第1个元素
    list[1][1] = "南京" //第2个一维数组中的第2个元素

    //输出结果
    fmt.Println(list)
}

//输出结果如下
[[你好 欢迎] [来到 南京]]

3. 访问二维数组

二维数组通过指定坐标来访问。如数组中的行索引与列索引,例如:

//访问二维数组 val 第三行的第四个元素
val := a[2][3]
//或
var value int = a[2][3]

二维数组可以使用循环嵌套来输出元素

package main

import "fmt"

func main() {
    nums := [2][3]int{
        {1, 2, 3},
        {4, 5, 6},
    }
    //遍历二维数组中的每个元素
    //外层循环读取行
    for i := 0; i < 2; i++ {
        //内层循环读取列
        for j := 0; j < 3; j++ {
            fmt.Println(nums[i][j])
        }
    }
}

//输出结果如下
1
2
3
4
5
6

创建各个维度元素数量不一致的多维数组

package main

import "fmt"

func main() {
    // 创建空的二维数组
    list := [][]string{}

    // 创建三一维数组,各数组长度不同
    num1 := []string{"zhang", "wang", "zhao"}
    num2 := []string{"li"}
    num3 := []string{"sun", "jin"}

    // 使用 append() 函数将一维数组添加到二维数组中
    list = append(list, num1)
    list = append(list, num2)
    list = append(list, num3)

    // 循环输出
    for i := range list {
        fmt.Printf("list: %v\n", i)
        fmt.Println(list[i])
    }
}

//输出结果如下
list: 0
[zhang wang zhao]
list: 1
[li]
list: 2
[sun jin]

六、向函数传递数组

如果想向函数传递数组参数,需要在函数定义时,声明形参为数组,可通过如下两种方式来声明:

1. 形参设定数组大小

void myFunction(param [10]int)
{
.
.
.
}

2. 形参未设定数组大小

void myFunction(param []int)
{
.
.
.
}

3. 示例

函数接收整形数组参数,另一个参数指定了数组元素的个数,并求和

package main

import "fmt"
//定义数组,有5个元素
var numbers [5]int

func main() {
    numbers = [5]int{10, 20, 30, 40, 50}
    fmt.Println("元素和为:", sum(numbers))
}

func sum(arr [5]int) int {
    //定义求和的变量s
    s := 0
    //求和过程
    for i := range arr {
        s += arr[i]
    }
    return s
}

//输出结果如下
元素和为: 150

函数接收整形数组参数,另一个参数指定了数组元素的个数,并求出平均值

package main

import "fmt"

var (
    //数组长度为5
    nums = [5]int{10, 20, 40, 60, 80}
    avg  float32
    s    int
)

func main() {
    //数组作为参数传递给函数
    avg = sums(nums, len(nums))
    //输出返回的平均值
    fmt.Printf("平均值为: %f", avg)
}

//传入数组和他的长度,返回值的类型为float32
func sums(x [5]int, length int) float32 {
    for i := 0; i < length; i++ {
        s += x[i]
    }
    avg = float32(s) / float32(length)
    return avg
}

//输出结果如下
平均值为: 42.000000

总结

数组的元素可以通过下标的方式来访问,下标的最大长度为数组长度-1,如果大于这个下标则会越界

遍历数组的两种方法:

① 通过 for循环,长度可以使用len()获取

② 通过for range循环遍历数组,返回数组下标和对应的值;若不想要下标,可以使用空白标识符_来取代

以上就是Go语言学习之数组的用法详解的详细内容,更多关于Go语言数组的资料请关注我们其它相关文章!

(0)

相关推荐

  • GO语言基础之数组

    1.申明一个数组 var a[2] int 或者 a:=[2]int{1,2} 2.数组索引 数组就是索引的来建立如下图 我们再来一个测试 3.go语言可以自动计算数组的长度,譬如你知道数组有几个可以如下申明 复制代码 代码如下: a:=[...]int{1,2,3,45} 4.指针数组 复制代码 代码如下: a:=[3]int{1,2,3} var p * [3]int = &a //这种是指针数组 我们看到可以直接输出指向数组的指针 x , y :=1 ,3 a := [...]*int{&a

  • 轻松读懂Golang中的数组和切片

    目录 一.数组和切片的区别是什么? 1.数组 2.切片 二.数组和切片的初始化? 1.数组 2.切片 二.常见问题 1.切片的初始化与追加 2.slice拼接问题 3.new和make的区别 总结 一.数组和切片的区别是什么? 1.数组 数组是内置(build-in)类型,是一组同类型数据的集合,它是值类型,通过从0开始的下标索引访问元素值.在初始化后长度是固定的,无法修改其长度.当作为方法的参数传入时将复制一份数组而不是引用同一指针.数组的长度也是其类型的一部分,通过内置函数len(array

  • Go语言中数组的基本用法演示

    首先来看一下如何声明数组: 复制代码 代码如下: package main import "fmt" var arr [2]int //申明一个数组 func main() {  arr[0] = 1 //数组赋值  fmt.Println(arr)  arrtest := [3]int{1, 2, 3} //数组的另一种申明方式  fmt.Println(arrtest)  a := [...]int{1, 2} //[...]自动识别数组的长度  fmt.Println(a)  f

  • 简单聊一聊Go语言中的数组和切片

    目录 1. 数组 2. 切片(Slice) append 函数 总结 1. 数组 数组是一个由固定长度的特定类型元素组成的序列,一个数组可以由零个或多个元素组成.因为数组的长度是固定的,因此在 Go 语言中很少直接使用数组.和数组对应的类型是 Slice(切片),它是可以增长和收缩的动态序列,slice 功能也更灵活. 数组的每个元素可以通过索引下标来访问,索引下标的范围是从 0 开始到数组长度减 1 的位置.内置的 len 函数将返回数组中元素的个数. var a [3]int // arra

  • 详细介绍Go语言之数组与切片

    目录 一.数组 1.数组的定义 2.数组赋值 3.定义并初始化 4.数组的大小是类型的一部分 5.数组是值类型 6.数组长度 len() 数组长度在定义阶段已经固定 7.数组循环 8.多维数组 9.数组定义并指定位置初始化 二.切片基础 1.切片的定义 2.使用切片 3.修改切片,会影响数组 4.修改数组也会影响切片 5.切片只切数组的一部分 6.当多个切片共用相同的底层数组时,每个切片所做的更改将反应在数组中 7.切片的长度和容量 8.切片追加值 一.数组 数组是同一类型元素的集合,可以放多个

  • Go语言学习之数组的用法详解

    目录 引言 一.数组的定义 1. 语法 2. 示例 二.数组的初始化 1. 未初始化的数组 2. 使用初始化列表 3. 省略数组长度 4. 指定索引值的方式来初始化 5. 访问数组元素 6. 根据数组长度遍历数组 三. 访问数组元素 1. 访问数组元素 2. 根据数组长度遍历数组 四.冒泡排序 五.多维数组 1. 二维数组 2. 初始化二维数组 3. 访问二维数组 六.向函数传递数组 1. 形参设定数组大小 2. 形参未设定数组大小 3. 示例 总结 引言 数组是相同数据类型的一组数据的集合,数

  • Go语言学习之指针的用法详解

    目录 引言 一.定义结构体 1. 语法格式 2. 示例 二.访问结构体成员 三.结构体作为函数参数 四.结构体指针 总结 引言 Go 语言中数组可以存储同一类型的数据,但在结构体中我们可以为不同项定义不同的数据类型 结构体是由一系列具有相同类型或不同类型的数据构成的数据集合 结构体表示一项记录,比如保存图书馆的书籍记录,每本书有以下属性: Title :标题 Author : 作者 Subject:学科 ID:书籍ID 一.定义结构体 1. 语法格式 结构体定义需要使用 type 和 struc

  • Go语言学习之反射的用法详解

    目录 1. reflect 包 1.1 获取变量类型 1.2 断言处理类型转换 2. ValueOf 2.1 获取变量值 2.2 类型转换 3. Value.Set 3.1 设置变量值 3.2 示例 4. 结构体反射 4.1 查看结构体字段数量和方法数量 4.2 获取结构体属性 4.3 更改属性值 4.4 Tag原信息处理 5. 函数反射 6. 方法反射 6.1 使用 MethodByName 名称调用方法 6.2 使用 method 索引调用方法 反射指的是运行时动态的获取变量的相关信息 1.

  • Go语言学习笔记之反射用法详解

    本文实例讲述了Go学习笔记之反射用法.分享给大家供大家参考,具体如下: 一.类型(Type) 反射(reflect)让我们能在运行期探知对象的类型信息和内存结构,这从一定程度上弥(mi)补了静态语言在动态行为上的不足.同时,反射还是实现元编程的重要手段. 和 C 数据结构一样,Go 对象头部并没有类型指针,通过其自身是无法在运行期获知任何类型相关信息的.反射操作所需要的全部信息都源自接口变量.接口变量除存储自身类型外,还会保存实际对象的类型数据. func TypeOf(i interface{

  • Go语言基础学习之数组的使用详解

    目录 1. Array(数组) 2. 声明数组 3. 数组初始化 3.1 方式一 3.2 方式二 3.3 方式三 3.4 多维数组 4. 遍历数组&取值 5. 数组拷贝和传参 数组相必大家都很熟悉,各大语言也都有数组的身影.Go 语言也提供了数组类型的数据结构. 1. Array(数组) 数组是同一种数据类型的固定长度的元素集合.在 Go 语言中,数组声明后长度就不能改变了,可以修改数组的元素,用法: // eg: 定义一个长度为 10 的 int 数组 var a [10]int 2. 声明数

  • C语言 array数组的用法详解

    目录 一维数组的创建与初始化 程序一: 程序二: 程序三 程序四(二维数组 - 二维数组 的 列 绝对不能 省略 ) 二维数组在内存中的存储 程序一 数组作为函数参数,怎么作? 实例:冒泡排序 数组名: 一维数组的创建与初始化 数组是一种相同类型元素的集合 程序一: #include<stdio.h> #include<string.h> int main() { 创建一个数组 int arr1[10];// [常量] 初始化 int arr[10]={1,2,3};不完全初始化,

  • ES6学习教程之Promise用法详解

    前言 promise用了这么多年了,一直也没有系统整理过.今天整理整理promise的相关东西,感兴趣的可以一起看一看.我尽量用更容易理解的语言来剖析一下promise 我准备分两篇文章来说明一下promise 一篇来理解和使用promise(本篇) 另一篇来从promise使用功能的角度来剖析下promise的源码(下一篇) 1.什么是Promise 我的理解是:实现让我们用同步的方式去写异步代码的一种技术.是异步解决方案的一种. 他可以将多个异步操作进行队列化,让它们可以按照我们的想法去顺序

  • C语言学习之指针的使用详解

    目录 一.指针概念 1.指针变量 2.指针类型 3.二级指针 二.野指针 1.野指针成因 2.规避野指针 三.指针运算 1.指针±整数 2.指针-指针 3.指针关系运算 四.指针数组 1.指针和数组 2.指针数组的概念 五.字符指针 六.数组指针 七.数组传参和指针传参 1.一维数组传参 2.二维数组传参 3.一级指针传参 4.二级指针传参 八.函数指针 九.函数指针数组 十.回调函数 一.指针概念 在学习指针之前我们先要了解一下内存,内存是存储区域,我们可以把内存划分成一个一个的内存单元,最小

  • C语言树状数组的实例详解

    C语言树状数组的实例详解 最近学了树状数组,给我的感觉就是 这个数据结构好神奇啊^_^ 首先她的常数比线段树小,其次她的实现复杂度也远低于线段树 (并没有黑线段树的意思=-=) 所以熟练掌握她是非常有必要的.. 关于树状数组的基础知识与原理网上一搜一大堆,我就不赘述了,就谈一些树状数组的应用好了 1,单点修改,求区间和 #define lowbit(x) (x&-x) // 设 x 的末尾零的个数为 y , 则 lowbit(x) == 2^y void Update(int i,int v)

  • Go语言学习之链表的使用详解

    目录 1. 什么是链表 2. 单项链表的基本操作 3. 使用 struct 定义单链表 4. 尾部添加节点 5. 头部插入节点 6. 指定节点后添加新节点 7. 删除节点 1. 什么是链表 链表是一种物理存储单元上非连续.非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的. 链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成.每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域. 使用链表结构可以避免在使用数组时需要预先知

随机推荐