Go语言基础(1)| 青训营笔记

179 阅读6分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第 2 篇笔记
本文为个人创作将会在本人掘金以及CSDN等平台发布

在青训营第一节课中,我开始了Go语言的初步学习,在讲师的讲解下,我对于Go语言基础有了许多初步的了解,接下来我将分为2次笔记记录下我在其中的收获!

1.变量

在Go语言中,一般变量名都是由由字母、数字、下划线组成。

需要注意的是:其中首个字符不能为数字

Go语言中定义变量的格式为 var identifier type

值得我们注意的是,相较于其他高级编程语言,Go语言在声明变量时需将变量类型放在名称后面!

局部变量声明有两种声明方式:

  • var a = 1
  • a := 1

在此处我们需要注意的是,这种声明方式智能在函数体内,不可用于全局变量声明与赋值当中。 使用:=可以快速创建一个函数内部的变量,它包括初始化声明与赋值两大部分,使用这种方式声明需要注意以下几点注意事项:

  • 同一代码块内不可进行多次声明同一变量
  • 函数体内如果在变量定义之前就调用该变量,会出现编译错误
  • 全局定义的变量不限定位置,但最好放在函数代码前方便查看 下面是示例代码,仅供参考:
package main
import (
	"fmt"
	"math"
)
func main() {
	var a = "initial"
	var b, c int = 1, 2
	var d = true
	var e float64
	f := float32(e)
	g := a + "foo"
	fmt.Println(a, b, c, d, e, f) 
	fmt.Println(g)               
	const s string = "constant"
	const h = 500000000
	const i = 3e20 / h
	fmt.Println(s, h, i, math.Sin(h), math.Sin(i))
}

2.数组

Go语言中数组定义为 var 数组变量名【元素数量】 Type

数组的每个元素都可以通过索引下标来访问,索引下标的范围是从0开始到数组长度减1的位置。

数组是值类型,赋值和传参会复制整个数组。因此改变副本的值,不会改变本身的值。

值得注意的是:

  • 数组支持“==”、“!=”操作符,因此内存总是被初始化过的
  • [n]* T表示指针数组,* [n]T表示数组指针

当然还有许多关于Go中数组的知识点,就不在这里一一列举啦~

3.切片

Go语言中切片定义为 var 切片变量名 []类型

在Go语言中,数组的长度是不可以被更改的,因此在一些特定的场合就就不太适用,当然Go也为我们提供了一种强大的内置类型,也就是我们讲的切片——“动态数组”。

与数组相比,切片的长度没有固定值,可以自行增加元素,在增加元素是会使得切片的容量自行增大

值得说明的是,切片(slice)不是数组也不是数组指针,它是通过内部指针与相关属性引用数组片段,从而能够完成增长操作

  • 切片是数组的一个引用
  • 切片的长度可以改变,且切片遍历方式和数组一样
  • cap可以求出slice最大扩张容量,但不能超过数组限制。 0 <= len(slice) <= len(array)
  • 如果slice == nil,那么len,cap结果都为0. 下面是示例代码,仅供参考:
package main
import "fmt"
func main() {
	s := make([]string, 3)
	s[0] = "a"
	s[1] = "b"
	s[2] = "c"
	fmt.Println("get:", s[2])   // c
	fmt.Println("len:", len(s)) // 3
	s = append(s, "d")
	s = append(s, "e", "f")
	fmt.Println(s) // [a b c d e f]
	c := make([]string, len(s))
	copy(c, s)
	fmt.Println(c) // [a b c d e f]
	fmt.Println(s[2:5]) // [c d e]
	fmt.Println(s[:5])  // [a b c d e]
	fmt.Println(s[2:])  // [c d e f]
	good := []string{"g", "o", "o", "d"}
	fmt.Println(good) // [g o o d]
}

4.map(Go中提供的映射关系容器)

Go语言中map定义为 map[KeyType] ValueType,其中Key为键类型,ValueType为键对应值的类型。

在Go中,map是一种无序的基于key-value的数据结构,是引用类型,其必须初始化才可以被使用

map类型的变量默认初始值为nil,需用make()函数来分配内存 var(make[KeyType] ValueType,[cap]),其中cap为map的容量。

4.1.map的使用

4.1.1.map的基本使用

func main(){
    scoreMap := make(map[string]int,8)
    scoreMap["xiaoqiang"] = 10
    scoreMap["xiaoming"] = 20
    fmt.Println(scoreMap)
    fmt.Println(scoreMap["xiaoming"])

//输出
map[xiaoming:20 xiaoqiang:10]
20
}

4.1.2.判断某个键是否存在

Go语言中存在一种判断map中键是否存在的特殊写法:格式如下: value,ok := map[key]

func main(){
    scoreMap := make(map[string]int,8)
    scoreMap["xiaoqiang"] = 10
    scoreMap["xiaoming"] = 20
    //若key存在ok为true,v为对应值;反之v为值类型的零值
    v,ok := score["xiaoqiang"]
    if ok{
        fmt.Println(v)
    } else {
        fmt.Println(“无此人!”)
    }
}

4.1.3.map的遍历

Go中使用for range遍历map

func main(){
    scoreMap := make(map[string]int,8)
    scoreMap["xiaoqiang"] = 10
    scoreMap["xiaoming"] = 20
    scoreMap["xiaolong"] = 30
    for k,v := range scoreMap{
        fmt.Println(k,v)
    }
}

值得注意的是:遍历map时的元素顺序与添加键值对的顺序无关。

4.1.4.使用delete()函数删除键值对

Go中,使用delete()内建函数从map中删除一组键值对,delete()函数的格式如下: delete(map,key) 相关举例就不展示啦~

5.range

在Go语言中,range用于for循环迭代于数组(array)、切片(slice)、通道(channel)、集合(map)的元素。

  • 在map中遍历顺序是随机的,多次遍历的结果可能不同
  • 在数组中是从下标0开始递增遍历的,多次遍历的结果相同

下面是示例代码,仅供参考:

package main

import "fmt"

func main() {
	nums := []int{2, 3, 4}
	sum := 0
	for i, num := range nums {
		sum += num
		if num == 2 {
			fmt.Println("index:", i, "num:", num) // index: 0 num: 2
		}
	}
	fmt.Println(sum) // 9

	m := map[string]string{"a": "A", "b": "B"}
	for k, v := range m {
		fmt.Println(k, v) // b 8; a A
	}
	for k := range m {
		fmt.Println("key", k) // key a; key b
	}
}

6.函数

在Go语言中,函数定义格式如下:

func FuncName(type1,type2){
    //函数体
    return v1,v2
}

函数定义说明:

1. func:函数由关键字 func 开始声明

2. FuncName:函数名称,根据约定,函数名首字母小写即为private,大写即为public

3. 参数列表:函数可以有0个或多个参数,参数格式为:变量名类型,如果有多个参数通过逗号分隔,不支持默认参数

4. 返回类型:

① 上面返回值声明了两个变量名o1和o2(命名返回参数),这个不是必须,可以只有类型没有变量名

② 如果只有一个返回值且不声明返回值变量,那么你可以省略,包括返回值的括号

③ 如果没有返回值,那么就直接省略最后的返回信息

④ 如果有返回值,那么必须在函数的内部添加return语句

在此说明,函数定义说明中的内容节选来源于网络教程,非本人创作。

因为函数模块内容很多,本人就不在这里一一列出啦,后期有时间会详细编写再发布~

本次笔记总结就到这里啦~