Go语言基础-基础语法

news2025/5/12 22:40:56

前言: \textcolor{Green}{前言:} 前言:

💞这个专栏就专门来记录一下寒假参加的第五期字节跳动训练营
💞从这个专栏里面可以迅速获得Go的知识

本文主要是根据今天所学(链接放在了最后)总结记录的笔记。主要内容包括学习准备(环境安装等)以及 go 语言的基础语法总结,其中有一些自己的想法,如果大家想与我交流共同进步欢迎大家来和我交流。

准备工作

准备工作极其的重要,因为接下来的学习都是基于这次的准备工作,通过准备工作也可以让自身熟悉本次学习,对于接下来的学习有重大帮助。

安装GO语言

  • 访问 go.dev/ ,点击 Download ,下载对应平台安装包,安装即可

  • 如果无法访问上述网址,可以改为访问 studygolang.com/dl 下载安装

  • 如果访问 github 速度比较慢,建议配置 go mod proxy,参考 goproxy.cn/ 里面的描述配置,下载第三方依赖包的速度可以大大加快

配置 Go 语言开发环境

可以选择安装 VS Code , 或者 Goland ,对于 VS Code,需要安装 Go 插件

下载示例代码

  1. Windows 平台建议安装 git,其它系统自带,安装教程
  2. 打开 github.com/wangkechun/… 克隆课程示例项目
  3. 进入课程示例项目代码目录,运行 go run example/01-hello/main.go 如果正确输出 hello world,则说明环境配置正确

上述部分来源于掘金【后端专场 学习资料一】第五届字节跳动青训营。

如果上述部分有问题,欢迎来私聊。

Go语言–基础语法

image.png

image.png

1 简介

1.1 什么是Go语言

image.png

Go(又称 Golang)是 Google 的 Robert Griesemer,Rob Pike 及 Ken Thompson 开发的一种静态强类型、编译型语言。Go 语言语法与 C 相近,但功能上有:内存安全,GC(垃圾回收),结构形态及 CSP-style 并发计算。

我们来看下 go 的简单介绍

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

1.2 应用公司

ByteDance、Google、Tencent、facebook、美团、七牛云、滴滴等等

1.3 为什么会使用Go语言

  1. 最初使用的 python,由于性能问题换成了 Go
  2. C++ 不太适合在线 web 业务
  3. 早期团队非 Java 背景
  4. 性能比较好
  5. 部署简单,学习成本低
  6. 内部 RPC 和HTTP 框架的推广

2 入门

入门会讲解go的安装以及基础语法。学习一门新的语言我们必须要了解它的安装以及语法的学习,这样我们在编写代码的时候很熟练的进行使用。

2.1 开发环境 - 安装 Golang

在浏览器可以直接输入 https://go.dev/ ,打开Golang官网,点击download安装提示进行下载。

打不开可以使用中国的镜像也就是 https://studygolang.com/dl

如果访问github较慢则可以配置go mod proxy,打开 https://goproxy.cn/ 按照提示进行操作,就可以加快下载第三方包的速度了。

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

可以查看 https://gitpod.io/#github.com/wangkechun/go-by-example

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

2.2 基础语法 - Hello World

package main

import (
	"fmt"
)

func main() {
	fmt.Println("hello world")
}
go run example/01-hello/main.go

image.png

2.2 基础语法 - 变量

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语言是一门强类型语言,每一个变量都有自己的变量类型。常见的变量类型包括:字符串、整数、浮点型、布尔型等。

GO语言的字符串是内置类型,可以直接通过加号拼接,也能够直接用等于号去比较两个字符串。

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

  1. 通过var name string = "" 这种方式,声明变量的时候一般会自动去推导变量的类型,如果有需要也可以显示写出变量类型。
  2. 使用变量 冒号 :=等于值
    常量就是把var改成const , 在go语言里面的常量,没有确定的类型,会根据使用的上下文来自动确定类型。

2.3 基础语法 - if else

package main

import "fmt"

func main() {

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

	if 8%4 == 0 {
		fmt.Println("8 is divisible by 4")
	}

	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")
	}
}

和以往不同的是

  1. go 中 if 后面没有括号,即使你写括号的话,那么在保存的时候编辑器会自动把你的括号去掉。
  2. go 中的 if 后面必须接大括号,不能像其他语言将其写在if语句的同一行。

2.4 基础语法 - 循环

package main

import "fmt"

func main() {

	i := 1
	for {
		fmt.Println("loop")
		break
	}
	for j := 7; j < 9; j++ {
		fmt.Println(j)
	}

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

go的循环没有 while、do while循环,只有唯一的 for 循环,最简单的 for 循环是 for 后面什么都不写,是一个死循环。循环途中可以使用 break 跳出,也可以使用经典的三段循环,这三段,任何一段都可以省略。

同样可以使用 break 和 continue 来跳出或继续循环。

这个和之前的语言差不多,稍加记住格式就可以。

2.5 基础语法 - switch

package main

import (
	"fmt"
	"time"
)

func main() {

	a := 2
	switch a {
	case 1:
		fmt.Println("one")
	case 2:
		fmt.Println("two")
	case 3:
		fmt.Println("three")
	case 4, 5:
		fmt.Println("four or five")
	default:
		fmt.Println("other")
	}

	t := time.Now()
	switch {
	case t.Hour() < 12:
		fmt.Println("It's before noon")
	default:
		fmt.Println("It's after noon")
	}
}

和之前 for 循环类似,但在 switch 后面的那个变量名,是不需要括号的。

和之前语言不同的是:在C++里面,switch case如果不显示加 break 的话会继续向下运行,但是在go语言中不需要添加break;

相比其他语言,go的 switch 功能强大,可以使用任意的变量类型,甚至可以用来取代任意的 if else 语句,可以在 switch 后面不增加任何变量,然后在 case 里面写条件分支,这样代码相对比多个 if else 代码逻辑会更加清晰。

2.6 基础语法 - 数组

package main

import "fmt"

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 中的数组有一个有意思的地方,这个在下面会介绍到。

数组就是一个具有编号且长度固定的元素序列。

对于一个数组,可以很方便地取特定索引的值或者往特定索引取存储值,可以直接打印一个数组。不过在真实的业务代码里面,很少直接使用数组,因为它的长度是固定的,我们用的更多的是切片

2.7 基础语法 - 切片

package main

import "fmt"

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

切片不同于数组,它可以任意的更改长度,同时也具有更多丰富的操作。

例如:可以使用 make 来创建一个切片,可以像数组一样去取值,使用 append 来追加元素。

注意 append 的用户,需要把 append 的结果赋值为原数组。

slice 的原理实际上是它存储了一个长度和一个容量,加一个指向一个数组的指针,在你执行 append 操作的时候,如果容量不够的话,会扩容并且返回新的 slice 。

slice 初始化的时候可以指定长度

slice 拥有像 python 一样的切片操作,例如 [2:5] 这个代表去除第二个到第五个位置的元素,不包括第五个元素,不过不同于python,这里不支持负数索引。

2.8 基础语法 - map

package main

import "fmt"

func main() {
	m := make(map[string]int)
	m["one"] = 1
	m["two"] = 2
	fmt.Println(m)           // map[one:1 two:2]
	fmt.Println(len(m))      // 2
	fmt.Println(m["one"])    // 1
	fmt.Println(m["unknow"]) // 0

	r, ok := m["unknow"]
	fmt.Println(r, ok) // 0 false

	delete(m, "one")

	m2 := map[string]int{"one": 1, "two": 2}
	var m3 = map[string]int{"one": 1, "two": 2}
	fmt.Println(m2, m3)
}

map 是实际使用过程中最频繁的数据结构。

可以使用 make 来创建一个空的 map ,这里会需要两个类型,第一个是 key 的类型,另一个是 value 的类型。可以从里面去存储或取出键值对,可以用delete从里面删除键值对。

需要注意 golang 中的 map 是完全无序的,遍历的时候不会按照字母进行排序,也不会按照插入顺序输入,而是随机顺序

因为我经常用的是 java,在 java 中map是常用的,这里相对于 go 的用法来说还是有不同的,需要多多查看。

2.9 基础语法 - range

package main

import "fmt"

func main() {
	nums := []int{2, 3, 4}
	sum := 0
	for i, num := range nums {
		sum += num
		if num == 2 {
			fmt.Println("index:", i, "num:", num) // index: 0 num: 2
		}
	}
	fmt.Println(sum) // 9

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

对于一个 slice 或 map ,我们可以通过 range 来快速遍历, 这样可以使代码更加简洁。range 遍历的时候,对于数组会返回两个值(第一个是索引,第二个是对应位置的值)。如果我们不需要索引的话,可以使用下划线来忽略。

此处的快速遍历在之前的语言中我没有遇到过,这下也是感受到了 go 功能的强大。

2.10 基础语法 - 函数

package main

import "fmt"

func add(a int, b int) int {
	return a + b
}

func add2(a, b int) int {
	return a + b
}

func exists(m map[string]string, k string) (v string, ok bool) {
	v, ok = m[k]
	return v, ok
}

func main() {
	res := add(1, 2)
	fmt.Println(res) // 3

	v, ok := exists(map[string]string{"a": "A"}, "a")
	fmt.Println(v, ok) // A True
}

golang 函数中和其他语言不同的是,变量类型是后置的

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

2.11 基础语法 - 指针

package main

import "fmt"

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
}

golang中的指针,支持操作很有限,指针的一个重要用途就是对于传入参数进行修改

可以看一下例子,add2函数中试图把一个变量+2,但是单纯像该函数中的写法是无效的,因为传入函数的参数实际上是一个拷贝,+2也只是对拷贝的+2,对实际的值没有起作用。如果要使其起作用,就要将该类型写成指针类,例如add2ptr函数中,同时为了类型匹配,调用的时候会增加一个 & 符号。

2.12 基础语法 - 结构体

package main

import "fmt"

type user struct {
	name     string
	password string
}

func main() {
	a := user{name: "wang", password: "1024"}
	b := user{"wang", "1024"}
	c := user{name: "wang"}
	c.password = "1024"
	var d user
	d.name = "wang"
	d.password = "1024"

	fmt.Println(a, b, c, d)                 // {wang 1024} {wang 1024} {wang 1024} {wang 1024}
	fmt.Println(checkPassword(a, "haha"))   // false
	fmt.Println(checkPassword2(&a, "haha")) // false
}

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

func checkPassword2(u *user, password string) bool {
	return u.password == password
}

结构体是带类型的字段的集合

例如此处的 user 结构包含了两个字段,name 和 password。我们可以用结构体的名称去初始化一个结构变量,构造的时候需要传入每个字段的初始值。也可以用这种键值对的方式去指定初始值,这样可以只对一部分字段进行初始化。同样的结构体我们也能支持指针,这样能够实现对于结构体的修改,也可以在某些情况下避免一些大结构的拷贝开销。

这个结构体就和 C++ 中的一样了,如果有基础看这个就非常的容易。

2.13 基础语法 - 结构体方法

package main

import "fmt"

type user struct {
	name     string
	password string
}

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

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

func main() {
	a := user{name: "wang", password: "1024"}
	a.resetPassword("2048")
	fmt.Println(a.checkPassword("2048")) // true
}

在golang中可以为结构体定义方法,类似于其他语言里面的类成员函数。

从上面代码中可以看到:checkPassword 的实现,从一个普通函数改成了结构体的方法,这样用户可以使用 a.checkPassword() 这样调用,具体的代码修改:把第一个参数加上括号,写到函数名称前面。

实现结构体的方法

  • 带指针
  • 不带指针

区别:如果带指针,那么你就可以对这个结构体去做修改,否则你实现的操作仅仅是一个拷贝,无法对结构体进行修改。

2.14 基础语法 - 错误处理

package main

import (
	"errors"
	"fmt"
)

type user struct {
	name     string
	password string
}

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")
}

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

错误处理在go语言里面符合语言习惯的做法就是使用一个单独的返回值来传递错误信息。

不同于java中使用的异常处理。go语言的处理方式,能够清晰的知道哪个函数返回了错误,并且能够用简单的if else 来处理错误。

在函数里面,我们可以在函数的返回值类型里面,增加一个error,代表这个函数可能返回错误。

在函数实现的时候,return需要同时return两个值。如果出现错误的话,就可以return nil 和一个 error 。如果没有的话,那么就返回原本的结果和 nil。

2.15 基础语法 - 字符串操作

package main

import (
	"fmt"
	"strings"
)

func main() {
	a := "hello"
	fmt.Println(strings.Contains(a, "ll"))                // true
	fmt.Println(strings.Count(a, "l"))                    // 2
	fmt.Println(strings.HasPrefix(a, "he"))               // true
	fmt.Println(strings.HasSuffix(a, "llo"))              // true
	fmt.Println(strings.Index(a, "ll"))                   // 2
	fmt.Println(strings.Join([]string{"he", "llo"}, "-")) // he-llo
	fmt.Println(strings.Repeat(a, 2))                     // hellohello
	fmt.Println(strings.Replace(a, "e", "E", -1))         // hEllo
	fmt.Println(strings.Split("a-b-c", "-"))              // [a b c]
	fmt.Println(strings.ToLower(a))                       // hello
	fmt.Println(strings.ToUpper(a))                       // HELLO
	fmt.Println(len(a))                                   // 5
	b := "你好"
	fmt.Println(len(b)) // 6
}

在标准库 strings 包里面有很多常用的字符串工具函数。

例如: contains 判断一个字符串中是否包含另一个字符串, count 可以对字符串进行计数, index 可以查找某个字符串的位置, join 可以连接多个字符串, repeat 可以重复多个字符串, replace可以替换字符串。

2.16 基础语法 - 字符串格式化

package main

import "fmt"

type point struct {
	x, y int
}

func main() {
	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
}

在标准库的 FMT 包里面有很多的字符串相关的方法。

例如 printf 类似于C中的printf函数,不同的是,在go语言中,可以使用 %v 来打印任意类型的变量,不需要区分数字字符串等其他类型。 可以使用 %+v来打印详细的结果,%#v则更加详细。

2.17 基础语法 - JSON 处理

package main

import (
	"encoding/json"
	"fmt"
)

type userInfo struct {
	Name  string
	Age   int `json:"age"`
	Hobby []string
}

func main() {
	a := userInfo{Name: "wang", Age: 18, Hobby: []string{"Golang", "TypeScript"}}
	buf, err := json.Marshal(a)
	if err != nil {
		panic(err)
	}
	fmt.Println(buf)         // [123 34 78 97...]
	fmt.Println(string(buf)) // {"Name":"wang","age":18,"Hobby":["Golang","TypeScript"]}

	buf, err = json.MarshalIndent(a, "", "\t")
	if err != nil {
		panic(err)
	}
	fmt.Println(string(buf))

	var b userInfo
	err = json.Unmarshal(buf, &b)
	if err != nil {
		panic(err)
	}
	fmt.Printf("%#v\n", b) // main.userInfo{Name:"wang", Age:18, Hobby:[]string{"Golang", "TypeScript"}}
}

go中的 JSON 操作非常简单,对于一个已有的结构体,我们可以什么都不做,只要保证每个字段的第一个字母是大写,也就是公开字段。

那么这个结构体就能用 JSON.marshaler 去序列化;变成一个 JSON 的字符串。

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

这样默认序列化出来的字符串,它的风格是大写字母开头,而不是下划线,可以在后面用 json.tag 等语法来修改输出 JSON 结果里面的字段名。

2.18 基础语法 - 时间处理

package main

import (
	"fmt"
	"time"
)

func main() {
	now := time.Now()
	fmt.Println(now) // 2022-03-27 18:04:59.433297 +0800 CST m=+0.000087933
	t := time.Date(2022, 3, 27, 1, 25, 36, 0, time.UTC)
	t2 := time.Date(2022, 3, 27, 2, 30, 36, 0, time.UTC)
	fmt.Println(t)                                                  // 2022-03-27 01:25:36 +0000 UTC
	fmt.Println(t.Year(), t.Month(), t.Day(), t.Hour(), t.Minute()) // 2022 March 27 1 25
	fmt.Println(t.Format("2006-01-02 15:04:05"))                    // 2022-03-27 01:25:36
	diff := t2.Sub(t)
	fmt.Println(diff)                           // 1h5m0s
	fmt.Println(diff.Minutes(), diff.Seconds()) // 65 3900
	t3, err := time.Parse("2006-01-02 15:04:05", "2022-03-27 01:25:36")
	if err != nil {
		panic(err)
	}
	fmt.Println(t3 == t)    // true
	fmt.Println(now.Unix()) // 1648738080
}

在 go 中常用的是 time.now() 来获取当前的时间,也可以用 time.date 去构造一个带时区的时间,构造完的时间。
有很多方法来获取这个时间点的年月日小时分钟秒,也可以用 .sub 去对两个时间进行减法,得到一个时间段,时间段又可以去得到它有多少小时、多少分钟、多少秒。

在和某些系统交互的时候,我们经常会用到时间戳,此时可以使用 .UNIX 来获取时间戳。
像 time.format time.parse,也会经常使用到

2.19 基础语法 - 数字解析

package main

import (
	"fmt"
	"strconv"
)

func main() {
	f, _ := strconv.ParseFloat("1.234", 64)
	fmt.Println(f) // 1.234

	n, _ := strconv.ParseInt("111", 10, 64)
	fmt.Println(n) // 111

	n, _ = strconv.ParseInt("0x1000", 0, 64)
	fmt.Println(n) // 4096

	n2, _ := strconv.Atoi("123")
	fmt.Println(n2) // 123

	n2, err := strconv.Atoi("AAA")
	fmt.Println(n2, err) // 0 strconv.Atoi: parsing "AAA": invalid syntax
}

字符串和数字之间的转换是如何进行的。

在 go 语言当中,关于字符串和数字类型之间的转换都在 STR.conv 这个包下,这个包是 string.convert 这两个单词的缩写。

可以使用 parseInt 或者 parseFloat 来解析一个字符串

可以使用 Atoi 把一个十进制字符串转换成数字,可以用 itoA 把数字转换成字符串

如果输入不合法,那么这些函数都会返回 error。

2.20 基础语法 - 进程信息

package main

import (
	"fmt"
	"os"
	"os/exec"
)

func main() {
	// go run example/20-env/main.go a b c d
	fmt.Println(os.Args)           // [/var/folders/8p/n34xxfnx38dg8bv_x8l62t_m0000gn/T/go-build3406981276/b001/exe/main a b c d]
	fmt.Println(os.Getenv("PATH")) // /usr/local/go/bin...
	fmt.Println(os.Setenv("AA", "BB"))

	buf, err := exec.Command("grep", "127.0.0.1", "/etc/hosts").CombinedOutput()
	if err != nil {
		panic(err)
	}
	fmt.Println(string(buf)) // 127.0.0.1       localhost
}

在 go 中,我们能够用 os.argv 来得到程序执行的时候的指定命令行参数。

例如我们编译的一个二进制文件 command。 后面接 abcd 来启动,输入就是 os.argv 会是一个长度为 5 的一个 slice,第一个成员代表二进制自身的名字,我们可以用 so.gentenv 来读取环境变量。

总结

以上就是我今天关于学习 go 基础知识以及语法的学习。总的来说因为有以往经验的铺垫感觉语法非常的简单,但是细细想来,语法内容的深奥我还没有领会,有很多的工具可以直接使用,不像之前还需要进行很长的编写。内容的学习仍在继续,青训营也在时刻伴随着。希望之后的学习可以越来越顺利,向最终的目标的前进。

同时实战课也在努力的跟随,到了实战课才知道原来如此的奥妙,接下来我会将这部分内容继续挖深,先把实战课内容搞明白,再来课后习题,也欢迎大家来找我,我们一起交流共同努力。

参考文章

【后端专场 学习资料一】第五届字节跳动青训营

走进 Go 语言基础语言

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/679315.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

please specify ‘programme‘ in launch.json

故障现象&#xff1a; 在windows下点击F5&#xff0c;以运行vscode代码&#xff0c;在屏幕右下角出现这个错误提醒&#xff1b; 故障原因&#xff1a; 在配置文件&#xff08;settings.json或者launch.json&#xff09;中&#xff0c;缺少“program”这个参数配置&#xff1b…

SpringBoot 如何使用 Actuator 进行应用程序监控

SpringBoot 如何使用 Actuator 进行应用程序监控 在现代的应用程序开发中&#xff0c;应用程序监控是非常重要的&#xff0c;因为它可以帮助我们快速发现和解决问题。Spring Boot Actuator 是 Spring Boot 提供的一个强大的监控和管理工具&#xff0c;它可以帮助我们监控和管理…

0003Java程序设计-SSM+JSP现代家庭教育网站

摘 要 本毕业设计的内容是设计并且实现一个基于java技术的现代家庭教育网站。它是在Windows下&#xff0c;以MYSQL为数据库开发平台&#xff0c;java技术和Tomcat网络信息服务作为应用服务器。现代家庭教育网站的功能已基本实现&#xff0c;主要包括主页、个人中心、会员管理、…

Maven如何创建Maven web项目

1、创建一个新的模块: 1.1 使用骨架点一下&#xff0c;这里 1.2 找到maven-archetype-webapp项目&#xff0c;选中点击&#xff0c;一路next就行。 1.3 删除不必要的maven配置&#xff1a;&#xff08;这里我不需要&#xff0c;针对自己情况而定&#xff09; 可以从name这里开…

figma设计软件专业版教育优惠学生使用edu邮箱免费教程

产品介绍 今天一个买家发了一个链接问是否可以用&#xff0c;本站也是第一次见到&#xff0c;就测试了下可以使用教育优惠后准备分享给大家。本站的大多数教育优惠线报其实都是很多网友买家提供的。 Figma是一款用于数字项目的基于云的设计和原型的设计工具软件。 这样做的目…

Python应用实例(一)外星人入侵(二)

1.添加飞船图像 下面将飞船加入游戏中。为了在屏幕上绘制玩家的飞船&#xff0c;我们将加载一幅图像&#xff0c;再使用Pygame方法blit()绘制它。 为游戏选择素材时&#xff0c;务必要注意许可。最安全、最不费钱的方式是使用Pixabay等网站提供的免费图形&#xff0c;无须授权…

强者游戏-敢来挑战否-Amazon DeepRacer League

Amazon DeepRacer中国峰会总决赛 Amazon DeepRacer 自动驾驶赛车名校邀请赛会在6月27日-28日举办的Amazon DeepRacer中国峰会总决赛时同步启动。勇哥的目标是拿个比较好的名词。大家如果有参加这次活动的可以过来一起搞哦。下面我来具体介绍一下这次峰会&#xff0c;以及比赛的…

PyTorch C++ 前端是 PyTorch 机器学习框架的纯 C++ 接口

使用 PyTorch C 前端 PyTorch C 前端是 PyTorch 机器学习框架的纯 C 接口。 虽然 PyTorch 的主要接口自然是 Python&#xff0c;但此 Python API 位于强大的 C 代码库之上&#xff0c;提供基本的数据结构和功能&#xff0c;例如张量和自动微分。 C 前端公开了纯 C 11 API&…

常见面试题之线程基础知识

1. 线程和进程的区别&#xff1f; 程序由指令和数据组成&#xff0c;但这些指令要运行&#xff0c;数据要读写&#xff0c;就必须将指令加载至CPU&#xff0c;数据加载至内存。在指令运行过程中还需要用到磁盘、网络等设备。进程就是用来加载指令、管理内存、管理IO的。 当一…

DataStructure01|ArrayList和顺序表

ArrayList与顺序表 1.线性表 ​ 线性表&#xff08;linear list&#xff09;是n个具有相同特性的数据元素的有限序列。线性表是一种在实际中广泛使用的数据结构&#xff0c;常见的线性表&#xff1a;顺序表、链表、栈、队列… ​ 线性表在逻辑上是线性结构&#xff0c;也就说…

产品设计.从用户体验五要素出发,谈如何设计产品

用户调研--产品定位---产品方案---视觉设计 作者 | 渐渐见减减简https://www.zcool.com.cn/article/ZMTEyNDA2NA.html 用户体验五要素是一种产品分析与设计的方法论&#xff0c;帮助我们以正确方式从0到1设计一款产品。 1 战略层 企业做一个产品前&#xff0c;都要明确几个问题…

多目标樽海鞘算法MATLAB实战(附源码)

今天给大家分享多目标樽海鞘算法&#xff0c;主要从算法原理和代码实战展开。需要了解智能算法、机器学习、深度学习和信号处理相关理论的可以后台私信哦&#xff0c;下一期分享的内容就是你想了解的内容。 一、算法原理 上一篇分享的SSA算法能够驱动salps向食物来源靠近&…

【Flutter】包管理(6)Flutter 状态管理 Provider 深入使用指南

文章目录 一、 前言二、 ProxyProvider 的使用三、 处理异步数据四、 性能优化五、 版本信息六、 总结一、 前言 在我们的上一篇文章中,我们介绍了 Flutter 中 Provider 包的基本使用。 在这篇文章中,我们将深入探讨 Provider 的高级使用方法,包括如何使用 ProxyProvider,…

Green板 和Red板和Nv EVM板比较

001 电源开关、 复位、烧写按钮 G&#xff1a;绿板 K3: Reset press RN K1: Brush RECOVERY button K2: Start button Power ON R: 红板 K3: POWER_KEY K2: FORCE_RECOVERY K1: RESET_KEY 002 USB设计 烧写连接器 G: 绿板 J6&#xff1a;TYPE C 烧写连接器 USB0_DP …

streamlit——搭建作业、文件上传网站(代码编写、服务器部署)

使用streamlit搭建简单的作业提交网站 文章目录 使用streamlit搭建简单的作业提交网站一、引言二、streamlit代码三、搭建到服务器中1、放行安全组2、将代码放到服务器中3、配置依赖4、运行代码 一、引言 由于我平时需要收集各种类型的作业文件。但传统的微信收文件方式很让我…

PyQt5中文手册

PyQt5中文手册 一、介绍 本教程的目的是带领你入门PyQt5。教程内所有代码都在Linux上测试通过。PyQt4 教程是PyQt4的教程&#xff0c;PyQt4是一个Python&#xff08;同时支持2和3&#xff09;版的Qt库。 关于 PyQt5 PyQt5 是Digia的一套Qt5应用框架与python的结合&#xff…

实训五:数据库安全控制 - 授权及回收权限

授权及回收权限 第1关&#xff1a;授权任务描述相关知识MySql系统库中的权限表访问控制的两个阶段&#xff1a;授予的权限等级&#xff1a;MySQL 权限类型grant 语句的基本语法格式revoke 语句的基本语法格式查看权限限制权限 编程要求测试说明参考代码 第2关&#xff1a;授权-…

论文悦读(5)——NVM文件系统之CtFS(FAST‘22)文件系统

CtFS&#xff08;FAST22&#xff09; 1. 背景&#xff08;Background&#xff09;1.1 NVM1.2 NVM文件系统1.3 快速索引方案 2. 观察与动机&#xff08;Observation & Motivation&#xff09;3. CtFS设计与实现&#xff08;Design & Implementation&#xff09;3.1 系统…

ASP.NET Dotnet 3.5实验室LIMS系统源码

LIMS系统功能包括&#xff1a;检测管理&#xff08;合同管理、样品管理、样品收发管理、工作任务分配、检测结果登记、复核及审核、留样管理等&#xff09;、报告管理&#xff08;报告编制、审核、签发、打印等&#xff09;、原始记录管理、仪器设备管理、消耗品管理、文件管理…

Oralce系列十九:Oralce的体系结构

Oralce的体系结构 1. 物理结构2. 内存结构2.1 SGA2.2 后台进程 3. 逻辑结构 1. 物理结构 Oracle数据库的物理结构由参数文件、控制文件、数据文件和日志文件组成&#xff0c;用于存储和管理数据库的数据和元数据&#xff0c;每个文件都扮演着不可或缺的角色。 参数文件用于配…