[ 后端与 Go语言基础学习 | 青训营笔记]

93 阅读6分钟

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

本节课是Go 语言快速上手- 基础语言

包括10分钟的简介

入门:30分钟

1.基础语法 2.开发环境 3.标准库

实战: 60分钟

1.猜谜游戏 2.命令行词典 3.SOCKS5 代理

Go

2.1开发环境

安装Go

https://go.dev/

https://studygolang.com/dl

https://goproxy.cn/

2.1编译器

可选择VS CODE 或者Goland(个人选择了Goland)

2.1 开发环境 - 基于云的开发环境

https://gitpod.io/#github.com/wangkechun/go-by-example

短链接: https://hi-hi.cn/gitpod

2.2基础语法

hello word

package main

import "fmt"

func main() {

	fmt.Println("hello word")

}

变量

go语言是一门强类型语言,每一个变量都有它自己的变量类型常见的变量类型包括 字符串 整数 浮点型、布尔型等go 语言的字符串是内置类型,也能够直接用等于号去比较两个字符串。,可以直接通过加号拼接

在qo语言里面变量的声明有两种方式

一种是通过 var name string = ””这种方式来声明变量,声明变量的时候,一般会自动去推导变量的类型

var a int = 3

另一种声明变量的方式是: 使用变量 冒号: 等于值。

b := true

改成const就是常量

if else

if else 没有括号,不同于Java,然后后面必须跟大括号

if 7#2 == 0{
	fmt.Println()
}

循环

在go里面没有 while 循环、do while 循环,只有唯一的一种 for 循环,最简单的 for 循环就是在 for 后面什么都不写,代表一个死循环。循环途中你可以用 break 跳出

语法和java差不多

for  {
	这是一个死循环
} 

for i :=0;i<2;i++{

}

switch

和java差不多

a := 2
switch a {
case 1:
	fmt.Println( "one" )
default:
	fmt,Printin("other")

数组

长度固定,后期很少用,主要用切片。

	var a [5] int

切片

切片可以任意更改长度,比如说我们可以用 make 来创建一个切片,可以像数组一样去取值,使用 append 来追加元素

s := make([]string,3)
s := make([]string3)
s[0]=“a"
s = append(s,"d")
会自动生成一个新的切片然后覆盖旧的,s[1],s[2]
都会空着
初始化
good := []string("g","o")

map

就是哈希map,采用key value格式

s := make(map[string][int])

s := make([]string, 3)
s[0] = "a"
s = append(s, "d")


初始化
m2 := map[string]int{"ont": 1}
var m3 = map[string]int{"one": 1, "two": 2}

golang的map是完全无序的,遍历的时候不会按照字母顺序,也不会按照插入顺序输出,而是随机顺序 ###range

for i:= range nums {

}

函数

Golang 和其他很多语言不一样的是,变量类型是后置的。

Golang 里面的函数原生支持返回多个值,在实际的业务逻辑代码里面几乎所有的函数都返回两个值,第一个是真正的返回结果,第二个值是一个错误信息,

普通函数,后面的int是返回类型
func add(a int, b int) int {
	return a + b
}

返回的是string,第二个信息是错误信息
func exists(m map[string]string,k string) (v string,ok bool) {
	v,ok = m[k]
	return v,ok
}

指针

用法和C语言差不多 需要把那个类型写成指针类型,那么为了类型匹配,调用的时候会加一个 & 符号。 理解就是:调用的时候要传入地址n := 5

addptr(&n)
func addptr(n *int) {
	*n += 2
}

结构体

Go 语言通过用自定义的方式形成新的类型,结构体是类型中带有成员的复合类型。

Go 语言中的类型可以被实例化,使用new或&构造的类型实例的类型是类型的指针。

结构体成员是由一系列的成员变量构成,这些成员变量也被称为“字段”。字段有以下特性: 字段拥有自己的类型和值。 字段名必须唯一。 字段的类型也可以是结构体,甚至是字段所在结构体的类型。

type user struct {
	name     string
	password string
}

a := user{name: "wang", password: "1024"}
去掉name和password也可以
var d user
d.name = "chen"
d.password="1024"

结构体方法

在Golang可以有结构体方法,会有一点类似其他语言里面的类成员函数,我们把这个例子的 checkpassword 的实现从普通函数,改成了结构体方法,这样用户可以像a.checkPassword“xx”这样去调用。具体的代码修改,就是把第一个参数,加上括号,写到函数名称前面。

func (u user) checkPassword(password string) bool {
	return u.password == password
}
也可以用指针,user前加一个*

错误处理

错误处理 在 go 语言里面符合语言习惯的做法就是使用一个单独的返回值来传递错误信息。不同于 Java 自家家使用的异常。go语言的处理方式,能够很清晰地知道哪个函数返回了错误,并且能用简单的 if else 来处理错误在函数里面,我们可以在那个函数的返回值类型里面,后面加一个 error,就代表这个函数可能会返回错误。那么在函数实现的时候,return 需要同时 return 两个值,要么就是如果出现措误的话,那么可以 return nil和一个 error,如果没有的话,那么返回原本的结果和 nil

func findUser( users []user,name string) (v *user,err error) {
	for _,u:= range users{
		if u.name == name{
			return &u,nil
		}
	}
	return nil,errors.New("not found")
}

字符串操作

用到的时候再去搜索吧

JSON处理

Go语言里面的JSON非常简单,对已有的结构体,可以只要每字段的第一个字母是大写,也就是是开字段,那么这结的体就的用 JS0Nmarshaler 专门去序列化,变成一个JSON 的字符串。

序列化之后的字符串也能够用JSON.unmarshaler 去反序列化到一个空的变量里面。

a := userInfoName: “wang",
Age: 18,Hobby: []string{"Golang","TypeScript"}}
buf, err := json.Marshal(a)

时间处理

在go语言里面最常用的就是 time.now0 来获取当前时间,然后你也可以用 time.date 去构造一个带时区的时间,构造完的时间。

课后总结

本节课了解了Go语言的一些基础知识,了解了一些基础语法,并且有去试写。感觉后面的知识点例如结构体方法,JSON处理,时间处理等知识不容易掌握,主要是和前面的知识点有结合,知识太多,有些许混乱。还有最后的小项目,有些看不懂,因为有些api没有见过,不了解其中的功能,希望自己能跟上课程的节奏。

引用参考

主要都是根据课程资料然后自己总结。

GoLand 快速入门教程_恋喵大鲤鱼的博客-CSDN博客_goland

Go语言多个变量同时赋值 (biancheng.net)