Go语言语法知识|青训营笔记

69 阅读4分钟

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

Go语言特色

  • 简洁、快速、安全
  • 并行、有趣、开源
  • 内存管理、数组安全、编译迅速

Go 语言用途

Go 语言被设计成一门应用于搭载 Web 服务器,存储集群或类似用途的巨型中央服务器的系统编程语言。 对于高性能分布式系统领域而言,Go 语言无疑比大多数其它语言有着更高的开发效率。它提供了海量并行的支持,这对于游戏服务端的开发而言是再好不过了。

Go语言基本语法

变量的基本类型

1.bool类型

2.数值类型

  • int8int16int32int64int
  • uint8uint16uint32uint64uint
  • float32float64
  • complex64complex128
  • byte
  • rune

我们发现有一些变量后面跟了个数字,这其实就是表示这个变量的占用的位的大小,例如int8就表示占用8个bit。

3.string类型

变量的定义

1.第一种通过var关键字来定义

var a = "hello"
var b = 3
var c float64 = 3.14

注意这里如果不给变量初始化的话,则需要带上这个变量的类型:

var a string
var b int
var c float64

2.直接定义

a := "hello"
b := 3
c := 3.14

常量的定义

常量的定义其实就是将变量的var变成const关键字即可

const str = "Hello World!"

分支循环

if-else

package main

import (
	"fmt"
)

func main() {
	var a int
	fmt.Scanf("%d", &a)
	if a < 10 {
		fmt.Println("step1")
	} else if a < 20 {
		fmt.Println("step2")
	} else {
		fmt.Println("step3")
	}
}

switch case

package main

import (
	"fmt"
)

func main() {
	var a int
	fmt.Scanf("%d", &a)
	switch a {
	case 1:
		fmt.Println("This is 1")
	case 2:
		fmt.Println("This is 2")
	case 3:
		fmt.Println("This is 3")
	default:
		fmt.Println("This is error")
	}
}

在c++里面,switch case如果不在目标case下加break的话会然后会继续往下跑完所有的case,在go语言 里面的话是不需要加break的。 相比C或者C++,go语言里面的switch功能更强大。可以使用任意的变量类型,甚至可以用来取代任意的if else语句。你可以在switch后面不加任何的变量,然后在case里面写条件分支。这样代码相比你用多个if else代码逻辑会更为清晰。

for循环

package main

import (
	"fmt"
)

func main() {
	var a int
	fmt.Scanf("%d", &a)
	for i := 1; i < a; i++ {
		fmt.Println("index = ", i)
	}
}

数组

数组的定义只需要将申请的空间放在变量名和类型中间即可

//声明数组
var a[10]int
//声明并初始化操作
var d = [3]int{1,2,3}

函数

// 传入两个 int 类型的值,然后返回其和,且也是int类型
func add(a int, b int) int {
	return a + b
}

// 传入一个stirng参数,然后没有返回值
func printt(str string) {
	fmt.Println("Hello", str)
}

Go函数可以返回多个值,一般来说,第一个是函数的返回值,第二个是错误信息。

切片

切片(slice)与数组的区别是切片的长度不是固定的而是可变的,比数组的用途更加广泛。 切片声明需要通过 make 来进行,需要指定切片的类型以及长度,例如下面为创建一个长度为 3 的string类型的切片。

// 声明一个空切片
s1 := make([]string, 3)
// 声明并初始化
s2 :=[] int {1,2,3,4,5,6} 

指针

貌似和C/C++中的指针的操作是一样的,通过*访问,然后&是取地址符

不过Go中的指针不支持指针运算。

new创建指针

ptr := new(int) ,其中的int可以替换成其他数据类型

  • 关于指针的解引用是和C/C++类似的
  • 想函数中传入指针参数的时候,我们在函数的定义时,需要使用*来表示接受指针的。

结构体

结构体声明语法:

type StructName struct{
    FieldName type

不同成员之间直接换行写就行,不用,隔开。

成员函数

成员函数写在结构体外面,格式如下:

func (t StructName) func_name(str string) int {
	
	return 1
}

这里我们将当前的这个结构体传入,当然也可以使用结构体指针,这样就能对当前的这个结构体变量的进行一些修改操作

错误处理

Go 语言通过内置的错误接口提供了非常简单的错误处理机制。

error类型是一个接口类型,这是它的定义

type error interface {
    Error() string
}

如果是函数内部抛出异常,那么对于当前函数就应该多一个errors的接收变量。

数据结构

Go语言内置了一个数据结构,即map

Map 是一种无序的键(key)值(value)对的集合,也被称为映射、字典。

Map是无序的,支持类似数组和切片的操作。

m := make(map[string]int)

其中,string为键,int为值,对元素的访问也是按照下标进行访问,对于不存在的键值对,返回0,这里也有一个问题,假设一个键值对的key也是0,有的时候就可能存在误解,于是Go在键值对的查询结果时,返回了两个值,一个是结果,一个是,是否存在。