Go语言基本语法|青训营笔记

50 阅读4分钟

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

以下是我上完掘金课第一堂语法课后的笔记,由于都是一些语法,怕记不住就整理出笔记方便以后忘了可以查。 Go语言基础语法

1.Go语言对变量的声明很简单:

  • var(表示声明变量) 变量名 类型(可以不要)=初始值(也可以不要)

  • 或者直接:变量名 :=初始值

  • Go会根据情况自动识别类型

2.常量声明:

  • 跟变量声明一样,var改成const

3.for循环

  • for{}:死循环

  • for i:=0;i<n;i++{}:常用循环,跟c++不同的是不需要括号

  • for里也可以continue,break

4.if

  • if 跟 c++ 一样,只是不需要加括号
  • if 里可以声明变量再去写条件。 如
    if num:=9;num<0{}
  
    else if num<10{}
   
    else{}

5.switch

  • switch后也不写括号
  • switch里不需要写break
  • switch的case可以合并。如:case 4,5:
  • switch后面可以没东西,在case后面写像if里的条件 如:
    switch{
	case a<12: ...
	default: ...
	}

6.数组

  • 声明:var 数组名 [大小]类型
  • 也可以 数组名 := [大小]类型{...}

7.动态数组

初始化:变量名 := make([]类型,初始大小)

函数:
append(变量名,...) ...为插入的元素,可以插入多个,用,隔开
copy(a,b) 把动态数组 b copy给a
变量名[a,b]:输出动态数组中 25 的元素,0下标开始
[,5],[5,]:默认0~55~结尾
   

8.map

  • 声明:变量名 :=make(map[key类型]+value类型)
  • map的赋值跟c++一样
  • delete(变量名,a)//从map中删除key值为a的map对
  • map可以像Java中那样直接fmt.Println(变量名)//它就会把map中元素罗列出来
  • map的另一种初始化:变量名 :=map[key类型]+value类型{...}
  • 其中...格式:”key:value“

9.range

  • range用于遍历数组,map等,类似于c++的for(auto d:mm)
  • 语法:for 元素下标(可以不要),值 := range 数组名{}
  • 例子:for k,v:=range m{fmt.Println(k,v)}

10.func(函数)

  • 格式:func 函数名(...)返回类型{}
  • 如: func add(a int,b int)int {}
    
  • 与C++不同的是,Go的函数可以返回多个值
  •   如:func exists(m map[string]string, k string) (v string, ok bool) {
        v, ok = m[k]
        return v, ok
      }
    
  • 对于返回的值我们这样存: a,b,c... := 函数(...) 这样函数的返回值就以此赋予a,b,c...

11.指针

  • 是C++的低配版指针,它主要用于传参给函数,使得能在函数里修改传进去的值,传入的时候要像 C++ 一样在变量前加个&

12.结构体

  • 声明:type 结构体名 struct{}
  • 实例化:a:=结构体名{依次赋值}
  • 结构体也可以直接Println出来

13.类函数

  • 声明:fuct (变量名 结构体名) 函数名(参数) 返回值{}
  • 调用:实例变量.函数名(传参)

14.error

  • 在标准库"errors"里
  • 一般在函数里会定义一个err在返回值里,如果发生异常函数里就 return nil,errors.New("...")
  • 调用函数时用一个变量去接收error,if(这个变量!=nil) 则发生了异常{}

15.string

有很多方法,直接查表就好了

16.fmt

  • fmt的输出很灵活:用%v直接不需要知道具体是什么类型
                s := "hello"
		n := 123
		p := point{1, 2}
		fmt.Println(s, n) // hello 123
		fmt.Println(p)    // {1 2}

		fmt.Printf("s=%v\n", s)  // s=hello
		fmt.Printf("n=%v\n", n)  // n=123
		fmt.Printf("p=%v\n", p)  // p={1 2}
		fmt.Printf("p=%+v\n", p) // p={x:1 y:2}
		fmt.Printf("p=%#v\n", p) // p=main.point{x:1, y:2}

		f := 3.141592653
		fmt.Println(f)          // 3.141592653
		fmt.Printf("%.2f\n", f) // 3.14

17.json

  • 在标准库"encoding/json"中
  • json有很多很好用的函数 1.buf,err:=json.Marshal(结构体变量):用变量buf去把所有结构体里的信息转化为字符串的字符串,err判断是否发生异常。注意Println的时候要类型转换 string(buf)。注意这么做的前提是结构体里的变量名都要大写字母开头。最后输出出来的效果就是类似于:{"Name":"wang","age":18} 如果想将变量名用另一个名字呈现可以在结构体对应变量位置后面加上 json:"要改的名字"

18.time

  • 时间类
  • now=time.Now(): now就存了下载的时间,算是一个字符串
  • 创建一个时间:t :=time.Date(年,月,日,小时,分钟,秒,0,time.UTC)
  • 可以直接Println
  • 时间直接可以用==判断是否相等

19.strconv

  • 将字符串转成对应的类型: 如:
f,_ := strconv.PraseFloat("1.234",64) //64是位数不用管,_表示不需要error变量
  • 还有把int类型转化为字符串: 如:
    n2, err := strconv.Atoi("AAA") 
Println出来会n2=0,err的信息打印出来,因为AAA不是int类型,发生异常了。