go语言初学

81 阅读5分钟

借助ai练中学go语言入门基础

1.高并发,高性能(有着和c++媲美的性能,有高并发的支持)

在go语言开发中,不需要寻找高性能的第三方库进行开发,只要使用标准库或者是基于标准库的第三方库即可开发高并发应用程序

2.语法简单

很快就能上手并开发

这个就是一个能承受高并发的支持静态访问的服务器的golang示例代码

3.有丰富的标准库

4.完善的工具链

5.静态链接

6.快速编译

7.跨平台

部署方便便捷

8.垃圾回收(类似java)

入门

1)

1.先安装golang

2.配置集成的开发环境 直接使用visual studio code即可

3.可以上csdn上查看如何配置go开发环境,视频中的比较粗略
链接:VScode下配置Go语言开发环境【2023最新】_vscode go-CSDN博客

2)

基础语法:编写最经典的Hello World

可以借助ai练中学直接编写并查看结果

package main

import (
	"fmt"
)

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

有关变量知识

常量是一个简单值的标识符,在程序运行时,不会被修改的量。

常量中的数据类型只可以是布尔型、数字型(整数型、浮点型和复数)和字符串型。

常量的定义格式:

const identifier [type] = value

在go中可以省略类型说明符 [type],因为编译器可以根据变量的值来推断其类型

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) // initial 1 2 true 0 0
	fmt.Println(g)                // initialapple

	const s string = "constant"
	const h = 500000000
	const i = 3e20 / h
	fmt.Println(s, h, i, math.Sin(h), math.Sin(i))
}

有关循环的语句的知识

直接通过代码看基本循环的语法即可,不解释

在go语言中,它支持下面几种的循环控制语句:

1.break,2.continue,3.goto语句

无限循环过程也是和其他语言一样,只要条件的语句永远不为false即可实现无限循环

func main() {
    for true  {
        fmt.Printf("这是无限循环。\n");
    }
}

有关if else的知识

****需要注意的是,go语言中不同的是java中if后可以直接跟上执行语句,但是go中if,else后执行语句必须跟上大括号

	if 7%2 == 0 {
		fmt.Println("7 is even")
	} else {
		fmt.Println("7 is odd")
	}

有关 switch 语句

switch var1 {
    case val1:
        ...
    case val2:
        ...
    default:
        ...
}

注意,switch语句并不同c++,java,在一个case语句后没有case并不会导致后面的case全部也跟着执行

有关数组的知识

Go 语言提供了数组类型的数据结构。

数组是具有相同唯一类型的一组已编号且长度固定的数据项序列,这种类型可以是任意的原始类型例如整型、字符串或者自定义类型。

相对于去声明 number0, number1, ..., number99 的变量,使用数组形式 numbers[0], numbers[1] ..., numbers[99] 更加方便且易于扩展。

ai练中学的代码如下


func main() {

	var a [5]int
	a[4] = 100
	fmt.Println("get:", a[2])
	fmt.Println("len:", len(a))

	b := [5]int{1, 2, 3, 4, 5}
	fmt.Println(b)

	var twoD [2][3]int
	for i := 0; i < 2; i++ {
		for j := 0; j < 3; j++ {
			twoD[i][j] = i + j
		}
	}
	fmt.Println("2d: ", twoD)
}

新知识:切片

切片的简介:

Go 语言切片(Slice)

Go 语言切片是对数组的抽象。

Go 数组的长度不可改变,在特定场景中这样的集合就不太适用,Go 中提供了一种灵活,功能强悍的内置类型切片("动态数组"),与数组相比切片的长度是不固定的,可以追加元素,在追加时可能使切片的容量增大。

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]
}

有关map基础语法

也就是c++,java中的map,是相同的东西,也是是一种无序的键值对的集合,最重要的一点是通过 key 来快速检索数据,key 类似于索引,指向数据的值。

而且它也是一种集合,所以我们可以像迭代数组和切片那样迭代它。不过,Map 是无序的,遍历 Map 时返回的键值对的顺序是不确定的。

新知识:range

可以理解为for循环,遍历数组,通道,slice,channel的元素


for key, value := range oldMap {
    newMap[key] = value
}

有关指针

Go 语言中指针是很容易学习的,Go 语言中使用指针可以更简单的执行一些任务。

接下来让我们来一步步学习 Go 语言指针。

Go语言的指针并不像c++中的指针有很多的复杂的操作难以理解

func add2(n int) {
	n += 2
}

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

func main() {
	n := 5
	add2(n)
	fmt.Println(n) // 5
	add2ptr(&n)
	fmt.Println(n) // 7
}

结构体以及结构体方法

go语言的结构体其实也和c++中的结构体struct有点相似

结构体是由一系列具有相同类型或不同类型的数据构成的数据集合。

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

在下面type开头的即为定义的结构体的代码


type user struct {
	name     string
	password string
}

如果要访问结构体成员,需要使用点号 . 操作符,结构体类型变量使用 struct 关键字定义,

同时可以像其他数据类型一样将结构体类型作为参数传递给函数。并以以上实例的方式访问结构体变量

有关go语言的错误处理

在go语言中,它内置的错误接口给了很简单的错误处理机制,定义如下

type error interface {
    Error() string
}

我们可以在编码中通过实现 error 接口类型来生成错误信息。

函数通常在最后的返回值中返回错误信息。使用 errors.New 可返回一个错误信息:

func main() {
	u, err := findUser([]user{{"wang", "1024"}}, "wang")
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(u.name) // wang

	if u, err := findUser([]user{{"wang", "1024"}}, "li"); err != nil {
		fmt.Println(err) // not found
		return
	} else {
		fmt.Println(u.name)
	}
}