Go 语言基础语法 | 豆包MarsCode AI刷题

36 阅读4分钟

go语言

特点:

  1. 高性能、高并发;
  2. 语法简单、学习曲线平缓;
  3. 丰富的标准库;
  4. 完善的工具链;
  5. 静态链接;
  6. 快速编译;
  7. 跨平台;
  8. 垃圾回收;

基础语法:

1.输出“hellloworld”
package main

import (
	"fmt"
)

func main() {
	fmt.Println("hello world")
}

由上面的代码,我们不难看出在go程序中一行代表一个语句的结束,与python相像

2.字符串的连接

Go 语言的字符串连接可以通过 + 实现:

package main
import "fmt"
func main() {
    fmt.Println("Hello" + "World")
}

并且允许使用等于来比较两个字符串

变量

变量的声明(两种)-----可以同时声明多个变量:

方法一:使用var来声明变量: var 变量名,...= 值var 变量名,... 类型 = 值,... ;其中第一种方式会自动确定类型

var a="HelloWorld"

var b,c int = 1,2

方法二:使用:=声明变量 变量名,... := 值,...,同样这种方式也是能够自动确定类型

a,b,c := 1,"hello",true 

常量

常量的定义方式就是将变量定义方法中的var改为const即可,常量会根据上下文自动确定类型:

  • 显式类型定义: const a string = "abc"

  • 隐式类型定义: const a = "abc"

   const a int = 10  
   const a  = 5    
   const a, b, c = 1false"str" //多重赋值

条件语句:if else

go语言的if语句中if后是没有括号的,这点与c++和java不同;

package main
import "fmt"

if a>b {
    fmt.Println("a>b")
}else{
    fmt.Println("a<b")
    
    if num := 9; num < 0 {
        fmt.Println(num, "is negative")
    } else if num < 10 {
        fmt.Println(num, "has 1 digit")
    } else {
        fmt.Println(num, "has multiple digits")
}

循环语句

在go语言中只有for循环,没有while等循环;go语言支持break、continue和goto三种循环控制语句;

for j := 7; j < 9; j++ {
    fmt.Println(j)
}

for n := 0; n < 5; n++ {
    if n%2 == 0 {
        continue
    }
    fmt.Println(n)
}

数组

不同于变量和常量的声明方法,在go语言中数组的声明需要指定元素类型和元素个数:

var 数组名 [数组大小]数据类型数组名 := [大小]数据类型 同时我们可以使用初始化列表来初始化数组的元素 例:

var numbers [5]int
var numbers = [5]int{1, 2, 3, 4, 5}

numbers := [5]int{1, 2, 3, 4, 5}

切片;

我们也可以理解为动态数组,长度是不固定的,可以追加元素; 我们可以使用make()函数来创建切片,利用copy()函数拷贝切片;用append()函数来追加新元素; go语言中有与python相同的切片如s[2:5]选中的是2到5的元素,包含2但不包含5

例如:

s := make([]string, 3)
s[0] = "a"
s[1] = "b"
s[2] = "c"

c := make([]string, len(s))
copy(c, s)   //将s切片中的元素拷贝到c中
fmt.Println(c)// a,b,c,d,e,f
fmt.Println(c[2:5])// c,d,e,f;打印从2(包含)到5(不包含)的元素

s = append(s, "d")//追加d
s = append(s, "e", "f")//追加e和f

MAP(集合)

与切片你相同我们使用内建函数 make 或使用 map 关键字来定义 Map:

// 创建一个空的 Map
m := make(map[string]int)

// 创建一个初始容量为 10 的 Map
m := make(map[string]int, 10)

// 获取键值对
v1 := m["apple"]
v2, ok := m["pear"]  // 如果键不存在,ok 的值为 false,v2 的值为该类型的零值

//方法1:
m := make(map[string]int)
	m["one"] = 1
	m["two"] = 2
        
//方法2:
m2 := map[string]int{"one": 1, "two": 2}

//方法3:
var m3 = map[string]int{"one": 1, "two": 2}

Range关键字

用于 for 循环中迭代数组、切片、通道或集合的元素,下面的代码是使用rang关键字来遍历一个map集合:

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
	}
	for _,v :=range m{
		fmt.Println(v) //A;B
	}

从上方的代码中我们可以看出在遍历集合时“k”和“v”都是可以省略的可以使用下划线来代替k,v可以不使用;如果只有一个变量那只会显示键不显示键值;

函数

函数的使用与python等语言相差不大,都是定义函数后调用,没什么好说的;

指针

func add2ptr(n *int) {
	*n += 2
}

n := 10
add2ptr(&n)
fmt.Println(n)

结构体

结构体定义需要使用 type 和 struct 语句。struct 语句定义一个新的数据类型,结构体中有一个或多个成员。type 语句设定了结构体的名称。如下:

type user struct {
	name     string
	password string
}

如果不进行初始化,字符串就是空值,数字类型是0; 我们使用".+字段名"的方式来读取或修改值; 结构体能作为函数的参数(指针/非指针)使用;若使用指针能避免一些大结构体的开箱,同时能实现对结构体的修改;

结构体方法: 与作为函数参数时一样,可以是用指针或非指针的方式来实现;同样的使用指针能实现对结构体的修改;下面是两个方法示例:

func (u user) checkPassword(password string) bool {
	return u.password == password
}

func (u *user) resetPassword(password string) {
	u.password = password
}

错误处理(error)

go语言错误处理机制十分的简单,可以在函数的返回值中加入error,在主函数调用时需要定义两个变量,