Day1 Go语言基础 | 青训营笔记

95 阅读5分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 1 天

一、本堂课重点内容

Go语言基础语法以及实战案例

二、详细知识点介绍

1)变量声明

1.普通类型

首字母大写的变量可以被别的包使用

var a int = 10
a := 10

2.数组

var a [5]int //声明但是不初始化
var a = [5]int{1,2,3,4,5}
a := [5]int{1,2,3,4,5}
a := [...]int{1,2,3,4,5}//自动推断个数,为[5]int
a := [...]int{1,2,4:15}//指定位置赋值,数组内容为[1,2,0,0,15]

3.指针

var p *int = &a //a为int类型
p := &a

4.切片

①切片的声明

切片是引用类型,需要引用一个数组,其元素的地址就是引用数组中对应元素的地址,如果改变切片中元素的值,那么原数组对应元素的值也会改变

b := make([]int,10)
b := []int{1,2,3,4,5}
b := a[0:3]//a为已有的数组
②切片的长度与容量
  • len()函数可以获取切片的长度,即切片中元素的个数;

  • cap()函数获取切片的容量,容量是可变的,在以上第一二种声明方式中容量初始值与长度一样,第三种方式的初始值为切片的第一个元素对应的底层数组元素到底层数组末尾的元素个数个数

③切片的追加

使用append()内置函数进行切片的追加,本质上为将原切片的元素复制一份到新的数组,再在新数组上追加内容,最后将新切片引用向这个新数组

c := a[1:3]
b = append(b,12,15,16) //直接追加数据,追加的元素可以任意多个
b = append(b,c...)//追加切片,...是必须的,表示追加的是切片

5.map类型

①map的声明
m := make(map[int]string)
m := map[int]string{
    1:"lilio"
    2:"haha"
    3:"www"
}
②map的增删改
m[15] = "mike" //增加
m[1] = "lilY" //更改,key值已存在为改,不存在为增
delete(m,1) //删除key为1的kv对

2)常量

const N = 100
const (
    X = 120
    Y = 130
)

3)语句

1.分支语句

①if分支

与C++基本一样,但是条件不需要加括号,而花括号是必须要的

if i == 0 {
    //内容...
}
else {
    //内容...
}
②switch分支

执行完case之后会自动跳出switch,除非使用fallthrough关键词,则会穿透到下一个case

switch i {
    case 0//内容...
    case 1,2 :
        //内容...
        fallthrough //继续执行case 3 的内容
    case 3 :
        //...
    default :
        /...
}
③goto label控制
label1:
//...
goto label1 //又回到label1处开始的代码

2.循环语句

①普通循环
for i:= 0 ; i < 5 ; i++ {
    //...
}
for i < 5 {
    //..
}

也有continue和break的用法,但是多了label,用于跳出或跳过多重循环

label1:
for i:= 0 ; i < 5 ; i++ {
    for j := 0 ; j < 5 ;j++ {
        if j == 4 {
            break label1 //直接跳出外层循环也就是label1处的循环,continue同理
        }
    }
}
②for-range循环,常用于遍历切片,string,数组,map等
for index,value := range a { //a可为以上提到的类型
    //...
}

4)函数

1.普通函数

首字母大写的函数可以被别的包使用

func test(x int, y int)(int,int){
    return x+y,x-y
}

2.匿名函数

func (x int,y int)(int) {
    return x+y
}(10,20) //匿名函数在定义时就直接调用

3.特别的

可以自己实现一个init()函数,该函数会在main()函数之前调用

func init(){
    //...
}

5)结构/类

1.定义

type myclass struct{
    name string
    age int
}

2.继承

可以继承多个父类,可以调用父类的所有方法以及字段

type myclass2 struct{
    myclass//继承了myclass
    ID int64
}

3.声明及初始化

person1 := new(myclass) // 只声明不初始化
person2 := myclass{"lilio",18}
person3 := myclass2{myclass{"haha",26},8866}

4.方法

func (c myclass2) print(){
    fmt.Println(c.age)
}

需要注意的是:调用方法时是按值传递,也就是说在方法内改变值,并不会使得调用对象的值改变;如果有需求,可以传递指针,如:

func (c *myclass2) change(){
    //...
}

以上两种函数调用时直接 类名.方法名() 就可以直接调用了 (第二种调用时可加可不加地址解析符&)

6)Json处理

1.结构数据序列化

调用json包的Marshal函数可以将结构序列化,返回序列化后的[]byte和错误

type stu struct{
    name string
    ID int
}
s := stu{"lilio",1814}
buf,err := json.Marshal(s)

2.josn数据反序列化

调用Unmarshal函数,需要用具有相同字段的结构接收

var b stu
json.Unmarshal(buf,&b)

7)数字处理

1.数字转字符串

str := fmt.Sprintf("%d",18000)
str2,err := strconv.Itoa(888)

2.字符串转数字

  • strconv.ParseInt()函数的三个参数分别为:(要转换的字符串,进制,要转成的int位数32/64)

  • strconv.ParseFloat()为转换为浮点数,不过没有 进制 这个参数

a,err := strconv.ParseInt("0x99",16,32)
a1,err := strconv.Atoi("999")

8)时间处理

1. time.Now()快速获取当前时间

2. time.Date(year,month,day,hour,min,sec,nsec,时区/一般为time.UTC)获取一个指定的时间对象

3. 时间对象下的方法

①获取对应值

Year() Month() Day() Hour() Minute()

②时间相加减

Sub() 将调用对象的时间减去参数对象的时间,得到的是time.Duration对象,可用Hours()/Minutes()/Seconds()方法返回以时/分/秒为单位的数字

③时间的格式化与解析
  • time对象.Formate(layout)

其中完整的layout为"2006-01-02 15:04:05",可以为这其中的任意组合,也可以将月份改为英文

  • time.Parse(layout,要解析的字符串)

其中的layout格式要与要解析的字符串格式保持一致。

④与 Unix 时间戳的转换

相关函数或方法:

  • time.Unix(sec, nsec int64) 通过 Unix 时间戳生成 time.Time 实例;
  • time.Time.Unix() 得到 Unix 时间戳;
  • time.Time.UnixNano() 得到 Unix 时间戳的纳秒表示;