Go语言的‘包’和‘文件’操作规则

2 篇文章 0 订阅
订阅专栏

Go语言的‘包’和‘文件’操作规则

  1. Go语言工作空间:编译工具对源码目录有严格要求,每个工作空间 (workspace) 必须由bin、pkg、src三个目录组成。

  2. src ---- 项目源码目录,里面每一个子目录,就是一个包,包内是Go语言的源码文件。
    pkg ---- Go语言编译的.a 中间文件存放目录,可自动生成。
    bin ---- Go语言编译可执行文件存放目录,可自动生成。

  3. ”包“用于支持模块化、封装、编译隔离和重用,相当于类库。一个包的源代码保存在一个或者多个以.go结尾的文件中,它所在目录名的尾部就是包的导入路径。

  4. 一个文件夹下面直接包含的文件只能归属一个包同一个包的文件不能在多个文件夹下;同一文件夹下的第一个文件包名是bbb,那其他的也得是bbb。行话来说:同级别源文件的包的声明必须一致。

    包名为main的包是应用程序的入口包,这种包编译后会得到一个可执行文件(.exe),而编译不包含main包的源代码则不会得到可执行文件。

  5. 包的声明和所在的文件夹最好同名(也可以不一样)

  6. main函数要放在mian包下,否则根本没法执行,和第4条呼应

Go语言“包”的访问规则

包可以让我们通过控制哪些名字是外部可见的来隐藏内部实现信息。标识符必须是对外可见的,即(public)。在Go语言中是通过标识符的首字母大/小写来控制标识符的对外可见(public)/不可见(private)的。在一个包内部只有首字母大写的标识符才是对外可见的。

// 演示如何在一个包中声明,由另一个包来调用

// 主函数
package main
import (
	"fmt"
	"test2/crm/first"
)
func main() {
	fmt.Println("main函数的执行")
	first.GetConn()
}
// 被调用
package first
import "fmt"
func GetConn() {
	fmt.Println("开始执行", 111)
}
// 执行结果
[Running] go run "d:\gostudy\src\test2\crm\main\mian.go"
main函数的执行
开始执行 111
  1. 引用包时,包名是从 G O P A T H / s r c 后开始计算,使用 / 进行路径分隔, GOPATH/src后开始计算,使用/进行路径分隔, GOPATH/src后开始计算,使用/进行路径分隔,GOPATH已经在环境变量中设置好了

请添加图片描述

问题----->发现无法导入包

请添加图片描述

原因是GOPATH和自己设置的不一样?为什么?

编译器中显示的路径,说明GOPATH一直到 /src , 因此需要从/src之后开始导入

而我的路径是这样的:
请添加图片描述

因此报错信息中会在Project1之前出现一次/src。文件路径没设置好。估计只有初学者才会犯的低级错误吧。

  1. 包名和上级文件夹的名字不一致时(亦可以)
// 文件1
import (
	"Project1/test1/cal"
	"fmt"
)
func main() {
	fmt.Println("main函数的执行")
	// 函数前的定位用包名,即使import的文件名不一致也没有关系
	kk.GetConn()
}

// 文件2

// 被调用
package kk

import "fmt"

func GetConn() {
	fmt.Println("开始执行", 111)
}
// 最好是起个别名
// 文件1
import (
    // 在这里
	kk "Project1/test1/cal"
	"fmt"
)
func main() {
	fmt.Println("main函数的执行")
	// 函数前的定位用包名,即使import的文件名不一致也没有关系
	kk.GetConn()
}

函数的执行顺序

package main

import "fmt"

var num int = test()

func test() int {
	fmt.Println("test函数执行")
	return 10
}

func init() {
	fmt.Println("先执行")
}
func main() {
	fmt.Println("后执行")
}

匿名函数:我只用一次

发现:

  1. 匿名函数不用写函数名字

  2. 函数参数可以直接在结尾传递

package main

import "fmt"

// 匿名函数

func main() {
	// 定义匿名函数: 定义的同时再调用
	result := func(num1 int, num2 int) int {
		return num1 + num2
	}(10, 20)
	fmt.Println(result)
}

闭包:

package main

import "fmt"

// 函数功能:求和
// 函数名字 getSum,参数为空
// getSum函数返回一个函数,该函数的参数是int类型,返回值也是int类型
func getSum() func(int) int {
	var sum int = 0
	// func(num int):getSum函数的参数
	// int:函数的返回值
	return func(num int) int {
		sum = sum + num
		return sum
	}
}

// 非闭包
func getSum2(num int) int {
	var sum int = 0
	sum += num
	return sum
}

// 闭包:返回的匿名函数+匿名函数以外的变量num
func main() {
	f := getSum()
	// 为啥匿名函数的那个变量会一直保持?因为num本身就是个匿名函数内部的临时变量啊,作用域为什么会延伸到函数外?因为匿名函数
	// 怎么才能写出闭包?用匿名函数

	// 优点:
	// 缺点:内存使用量大
	fmt.Println(f(1)) // 1
	fmt.Println(f(2)) // 3
	fmt.Println(f(3)) // 6
	fmt.Println(f(4)) // 10
	fmt.Println("---------------------------------")
	fmt.Println(getSum2(1)) // 1
	fmt.Println(getSum2(2)) // 2
	fmt.Println(getSum2(3)) // 3
}
问题:
1. 为什么会实现值不变(闭包的工作流程)
2. 怎么使用

```go
f(4)) // 10
	fmt.Println("---------------------------------")
	fmt.Println(getSum2(1)) // 1
	fmt.Println(getSum2(2)) // 2
	fmt.Println(getSum2(3)) // 3
}
问题:
1. 为什么会实现值不变(闭包的工作流程)
2. 怎么使用

闭包复习

package main

import "fmt"

func main() {
	sumFunc := lazySum([]int{1, 2, 3, 4, 5}) // 1.传参
	fmt.Println("等待一会")                      // 6.输出
	fmt.Println("结果:", sumFunc())            // 7.调用函数sumFunc()
}
func lazySum(arr []int) func() int { // 2.接入参数
	fmt.Println("先获取函数,不求结果") // 3.打印
	var sum = func() int {    // 4.定义变量sum
		fmt.Println("求结果...") // 8.打印
		result := 0
		for _, v := range arr { // 9.进入循环
			result = result + v
		}
		return result // 10.返回result
	}
	return sum // 5.返回变量sum,是一个函数,由sumFunc接收
}
package main

import "fmt"

func main() {
	sumFunc, productSFunc := lazyCalculate([]int{1, 2, 3, 4, 5})
	fmt.Println("等待一会")
	fmt.Println("结果:", sumFunc())
	fmt.Println("结果:", productSFunc())
}

func lazyCalculate(arr []int) (func() int, func() int) {
	fmt.Println("先获取函数,不求结果")
	count := 0
	var sum = func() int {
		count++
		fmt.Println("第", count, "次求加和...")
		result := 0
		for _, v := range arr {
			result = result + v
		}
		return result
	}

	var product = func() int {
		count++
		fmt.Println("第", count, "次求乘积...")
		result := 1
		for _, v := range arr {
			result = result * v
		}
		return result
	}
	return sum, product
}

执行结果:

在这里插入图片描述

2.1 好处
纯函数没有状态,而闭包则是让函数轻松拥有了状态。但是凡事都有两面性,一旦拥有状态,多次调用,可能会出现不一样的结果,就像是前面测试的 case 中一样。那么问题来了:

Q:如果不支持闭包的话,我们想要函数拥有状态,需要怎么做呢?

A: 需要使用全局变量,让所有函数共享同一份变量。

但是我们都知道全局变量有以下的一些特点(在不同的场景,优点会变成缺点):

常驻于内存之中,只要程序不停会一直在内存中。
污染全局,大家都可以访问,共享的同时不知道谁会改这个变量。
闭包可以一定程度优化这个问题:

不需要使用全局变量,外部函数局部变量在闭包的时候会创建一份,生命周期与函数生命周期一致,闭包函数不再被引用的时候,就可以回收了。
闭包暴露的局部变量,外界无法直接访问,只能通过函数操作,可以避免滥用。

2.2 坏处
函数拥有状态,如果处理不当,会导致闭包中的变量被误改,但这是编码者应该考虑的问题,是预期中的场景。

闭包中如果随意创建,引用被持有,则无法销毁,同时闭包内的局部变量也无法销毁,过度使用闭包会占有更多的内存,导致性能下降。一般而言,能共享一份闭包(共享闭包局部变量数据),不需要多次创建闭包函数,是比较优雅的方式。

defer关键字

在Go语言中,程序遇到defer语句,不会立即执行defer后的语句,而是将这些语句压入一个中,然后继续执行函数后面的语句。

啥时候用呢?

比如想关闭某个使用的资源,在使用的时候直接随手defer,因为defer有延迟执行机制(函数执行完毕再执行defer压入栈的语句),所以用完随手写了关闭,省事
package main

import "fmt"

func main() {
	fmt.Println(add(30, 60))
}

func add(num1 int, num2 int) int {
	// 这两句啥时候执行?
	// 既然压入栈了,那就讲究一个先入后出,先2后1
	//
	defer fmt.Println("num1 = ", num1) // 1
	defer fmt.Println("num2 = ", num2) // 2

	var sum int = num1 + num2
	fmt.Println("sum = ", sum)
	return sum
}

// 输出
// sum =  90
// num2 =  60
// num1 =  30
// 90

把两个语句压入栈的同时,其相应的值也会压入(拷贝)到栈里

package main

import "fmt"

func main() {
	fmt.Println(add(30, 60))
}

func add(num1 int, num2 int) int {
	// 这两句啥时候执行?
	// 既然压入栈了,那就讲究一个先入后出,先2后1

	defer fmt.Println("num1 = ", num1) // 1
	defer fmt.Println("num2 = ", num2) // 2

	// 第二种情况
	num1 += 90 // 120
	num2 += 90 // 150

	var sum int = num1 + num2 // 270
	fmt.Println("sum = ", sum)
	return sum
}

// 输出
// sum =  270
// num2 =  60
// num1 =  30
// 270

插入一个:for-range:键值循环

Go的字符串

  []rune()

rune 类型是 Go 语言的一种特殊数字类型,定义是type rune = int32;官方对它的解释是:rune 是类型 int32 的别名,在所有方面都等价于它,用来区分字符值跟整数值。使用单引号定义 ,返回采用 UTF-8 编码的 Unicode 码点(就是能转换)。Go 语言通过 rune 处理中文,支持国际化多语言。

如我们要指定截取字符串的长度,因为golang的string底层就是一个byte数组,我们直接取数组的前N个即可完成这个需求

//要求截取前4个字符串,最后是"xs25"
var str = "xs25.cn" 
fmt.Println(str[:4])
//运行后的结果:xs25

但这个如果在字符串中存在中文会不会有问题呢,我们以“小手25是什么”

//要求截取前4个字符串,最后是"小手25"
var str = "小手25是什么"
fmt.Println(str[:4])
//结果: 小�

为什么会出现乱码呢?golang的string底层是一个byte数组实现,中文字符串在unicode下占2个字节,在utf-8下占3个字节。

var str = "小手25是什么"
fmt.Println(len(str)) //17
fmt.Println(str[:8]) //”小手25“共占8个字节
//结果:小手25

这时可以使用 []rune(str)这样的方式转换成一个切片,转换后我们取切片的前几个不就可以了吗。

var str = "小手25是什么"
k := []rune(str)
fmt.Println(len(k)) //17
fmt.Println(string(k[:4]))
情景1:返回子串第一次出现的索引
k := strings.Index("agolang", "go")
fmt.Println(k)
// 返回索引值,如果没有返回-1
情景2:替换字符串中的指定字符
// 把goangjavagogo中的所有"go",替换为"golang",-1表示全部替换,1表示替换1个,2表示2个
str1 := strings.Replace("goangjavagogo","go","golang",-1)

Go的日期和时间(重点)

func main() {
	now := time.Now()
	// Now()返回值是一个结构体,类型是:
	fmt.Printf("输出为%v~~~,\n对应的类型为%T\n", now, now)
	fmt.Println(now)
}
// 输出
// 输出为2023-06-30 11:12:02.21199 +0800 CST m=+0.002571701~~~,
// 对应的类型为time.Time

不要后面的一串

package main

import (
	"fmt"
	"time"
)

func main() {
	now := time.Now()
	// Now()返回值是一个结构体,类型是:
	fmt.Printf("输出为%v~~~,\n对应的类型为%T\n", now, now)
	fmt.Println("年, %v ", now.Year())
	fmt.Println("月, %v ", int(now.Month()))
	fmt.Println("日, %v ", now.Day())
	fmt.Println("时, %v ", now.Hour())
	fmt.Println("分, %v ", now.Minute())
	fmt.Println("秒, %v ", now.Second())
}

日期的格式化

fmt.Printf("当前的年月日:%d:%d:%d  时分秒:%d:%d:%d", now.Year(), now.Month(), now.Day(),now.Hour(), now.Minute(), now.Second())

// --------------------------------------------
当前的年月日:2023:6:30  时分秒:11:22:53
// 接收上述字符串
	// Sprintf不直接输出到终端,而是返回该字符串
	str := fmt.Sprintf("当前的年月日:%d:%d:%d  时分秒:%d:%d:%d", now.Year(), 	now.Month(), now.Day(),now.Hour(), now.Minute(), now.Second())
	fmt.Printf(str)

GoLang神奇的日期

// 标准化输出当前时间
datastr := now.Format("2006/01/02 15:04:05")

// 2023/06/30 13:14:36

内置函数(自带的)

func new(Type) *Type

内建函数new分配内存。其第一个实参为类型,而非值。其返回值为指向该类型新分配的零值的指针。(对应的类型的指针)

num := new(int)
	fmt.Printf("num的类型:%T ,num的值是:%v ,num的地址:%v, num指针指向的值是:%v",
		num, num, &num, num)
}
//num的类型:*int,num的值是(num这个变量承载的值的地址):0xc000018098,(num变量自身的地址):0xc00000a028,num指针指向的值是(也是num这个变量承载的值的地址):0xc000018098

异常处理机制(提高程序的鲁棒性)

发现程序中出现panic,程序被中断,无法继续执行

请添加图片描述

1. 错误处理/捕获机制
defer + recover

func recover

func recover() interface{}

内建函数recover允许程序管理恐慌过程中的Go程。在defer的函数中,执行recover调用会取回传至panic调用的错误值,恢复正常执行,停止恐慌过程。若recover在defer的函数之外被调用,它将不会停止恐慌过程序列。在此情况下,或当该Go程不在恐慌过程中时,或提供给panic的实参为nil时,recover就会返回nil(程序如果正常的话)。

示例
package main

import "fmt"

func main() {
	test()
	fmt.Println("正常")
	fmt.Println("继续执行")
}
func test() {
	// 捕获机制,利用defer+recover
	defer func() { // defer后加上匿名函数的调用
		// 调用recover内置函数
		err := recover()
		// 如果没有错误,返回值为零值;如果不返回零值,说明有错误
		if err != nil {
			fmt.Println("错误已捕获")
			// 看看啥错误
			fmt.Println("err是", err)
		}
	}()
	num1 := 10
	num2 := 0
	result := num1 / num2
	fmt.Println(result)
}

// 输出
错误已捕获
err是 runtime error: integer divide by zero
正常
继续执行
2. Go语言的自定义错误(啥意思?)

自己提前预判错误,然后给出解决方案

需要调用error下的New函数

func New

func New(text string) error // 会返回一个error

使用字符串创建一个错误,请类比fmt包的Errorf方法,差不多可以认为是New(fmt.Sprintf(…))。

package main

import (
	"errors"
	"fmt"
)
func main() {
	err := test2()
	if err != nil {
		fmt.Println("自定义错误:", err)
	}
	fmt.Println("正常")
	fmt.Println("继续执行")
}

func test2() (err error) {
	num1 := 10
	num2 := 0
	if num2 == 0 {
        // errors下的New接受一个自定义的字符串,指示错误类型,然后返回一个error类型
		return errors.New("除数不为空")
	} else {
		result := num1 / num2
		fmt.Println(result)
		return nil
	}
}
  1. 出现错误,没必要继续执行了

func panic

func panic(v interface{}) // 传入一个具体的错误

内建函数panic停止当前Go程的正常执行。当函数F调用panic时,F的正常执行就会立刻停止。F中defer的所有函数先入后出执行后,F返回给其调用者G。G如同F一样行动,层层返回,直到该Go程中所有函数都按相反的顺序停止执行。之后,程序被终止,而错误情况会被报告,包括引发该恐慌的实参值,此终止序列称为恐慌过程。

func main() {
	err := test2()
	if err != nil {
		fmt.Println("自定义错误:", err)
		
		panic(err) // 传入后,下面的都不会执行了,开始报错
	}
	fmt.Println("正常")
	fmt.Println("继续执行")
}
Go语言底层原理剖析.pdf
11-30
_mastering_ Go语言需要深入了解其底层原理,本书提供了系统的介绍和解释。 编译时 Go语言编译器是Go语言的核心组件之一。编译器将.go为后缀的UTF-8格式的Go文本文件编译成特定机器上的可执行文件。编译器的工作...
golang快速入门[2.2]-go语言开发环境配置-macOS
01-20
golang快速入门[2.2]-go语言开发环境配置-macOS macos安装Go语言开发 配置go语言开发环境的第一步是要在go官网下载页面下载开发 macOS需要下载pkg后缀文件 macOS和iOS操作系统Apple软件使用.pkg扩展名,在...
go module 与 package
苏木川的博客
03-24 829
笔者在学习 golang 语言的时候,对其版本管理产生了诸多困惑,于是花费了几天时间搜集了很多资料,试图理解其背后的原理,现将搜集的资料整理成下文。
Go(Golang)编程语言
m0_72572822的博客
10-02 4437
(又称)是谷歌开发的一种静态强类型、编译型、,并的编程语言。Go于2009年11月正式宣布推出,成为开放源代码项目,并在Linux及Mac平台上进行了实现,后来追加了Windows系统下的实现。Go 语言语法与相近,但功能上有:内存安全,(垃圾回收),及 CSP-style。
小议并实战go------顺便说说go中的GOROOT,GOPATH和src,pkg,bin
认知 行动 坚持
09-15 1万+
前些天带爸妈去上海、杭州玩了一下, 感觉很久没写博客了。 “协程”在手, 说go就go. 以后尽量少扯C++, 多说go, 本文来说说go中的一些基本概念,如,import, GOROOT, GOPATH, src, pkg, bin等, 主要是理解清楚这些基本的东东。 来看看, 工作目录是:/home/ubuntu/tao...
实操go开发环境的配置
知行合一
02-22 715
实操go开发环境的配置
go基础 go的与编码规范
一越王超的博客
04-13 1019
go语言的概念 go语言在1.12之前没有管理的概念,但之后的版本就有了管理的概念。 带有go.mod文件夹就是一个。 同一个文件夹下面的源码中不能出现多个package。需要多个package则需要新建源码同级别文件夹。 go的中采用的都是文件夹,文件夹一般用小写。同一级文件夹具有相同的package 导入其他文件夹的时候需要从项目根文件夹开始。 同一个文件夹下的package名称可以不和文件夹一致 go语言的import方式 ...
sonar-golang:用于Golang语言的Sonarqube插件
05-18
Go语言社区SonarQube插件 这是SonarQube的社区插件,用于支持Artois大学于2017年4月开始的Go语言。 自2018年5月起,SonarSource和正式支持Go。 它将报表集成在SonarQube仪表板中。 用户必须使用checkstyle格式为代码...
Go语言编程规范中文版-Google出品
12-07
Go语言编程规范中文版-Google出品-中文翻译版。本系列的 Go ⻛格指南和相关文档整理了当前,最佳的一个编写易读和惯用方式的 Go 写法。 遵守⻛格指南 并不是绝对的,这份文件也永远不会详尽无遗。我们的目的是尽量...
支持 Redcon(RESP) 协议, 为您的在线游戏提供简单的基于规则的匹配_go语言_代码_下载
06-24
支持 Redcon(RESP) 协议,为您的在线游戏提供简单的基于规则的匹配。 1- 简单匹配规则 系统最简单的用法是“直接匹配规则”,该规则玩家无需任何规则即可相互匹 2- 分数匹配规则 在这个例子中,用户匹配给定的分数...
让你的Golang项目在IDE里跑起来(Goland使用入门-GOROOT、GOPATH、src、 pkg、bin、import)
机智的程序员小熊
03-09 5803
前言 每次新建项目,不熟悉go的项目结构,一般跑都跑不起来,每次都要重新搞一遍,好几回跑项目都会报类似File is invalid的错误 有时候报其他奇怪的错误,今天就下决心整理一下,理一理概念 GOROOT、GOPATH、src、 pkg、bin,希望以后不要再出现这样的问题了,同时给看到文章的你一些帮助。 熟悉golang项目目录结构 要想让你的程序跑起来,要按照这样的目录结构,正常情况...
go语言引用其他文件的注意事项
qq_40742833的博客
04-06 1957
go不同文件之间的相互引用靠来实现,也就是import 1.文件夹就是一个文件夹名就是名 2.同一文件夹()下的所有文件可以视为同一文件,也就是可以随意拆分或者合并为一个或多个 go 文件都没有影响,文件名对程序也没有影响 3.同一文件夹()下的所有文件, package name 必须一致。 4.如果要使用其他文件夹()下的资源,使用 import 导, import 导...
Golang编译时提示go/src/pkg找不到的原因
qq_37845939的博客
03-18 8550
今天在用go编译时提示如下: 我的GOROOT安装路径为:/usr/local/go 找时的路径应为/usr/local/src。但是却提示找的路径为:/usr/local/go/src/pkg。 http://tieba.baidu.com/p/4689336188该贴提示不需要设置GOROOT,安装时会自动设置。 因此将GOROOT去掉。 执行go env ,提示: 运...
关于GOROOT、GOPATH、GOBIN、project目录
热门推荐
Alsmile的专栏
09-08 4万+
GOROOT、GOPATH、GOBIN、project目录前言:我觉得java程序员学golang很容易上手。关于GOROOT、GOPATH、GOBIN这些环境变量的设置,我隐约感觉到了java的影子(尽管我是一个C++程序员),唯一和java不同的是不能设置“.”。另外,golang的设计也很明显的透露着“约定优于配置”的原则。这在java很多框架里面很常见。golang的环境变量设计也是如此。从
Go语言学习1:Go语言环境搭建
up1292的博客
03-05 588
下载 Mac OS 双击启动安装。按照提示,这应该在/usr/local/go中安装了Golang,并且还会将文件夹/usr/local/go/bin添加到您的PATH环境变量中。 Windows 双击启动安装并遵循提示。这将在位置c中安装Golang:\Go,并且还将添加目录c:\Go\bin到您的path环境变量。 Linux 下载tar文件,并将其解压到/usr/loc...
go get 跑GOHATH的src的pkg里面去了 原因
xuelang532777032的博客
09-15 2299
别怪博主几个简单的步骤写一大堆文字还一大堆截图,我跟你说,新手真的一步卡住就是进行不下去的,所以我尽量写详细点,go交流群 852311425go交流群绝对原创,转载请附上 本微博链接,有帮到你打赏下哦. 博主出现这个情况,原因是因为cmd里博主开了goproxy如下 设置了代理 go env -w GO111MODULE=on $ go env -w GOPROXY=https://goproxy.cn,direct 你会发现,不仅get下来的 golang编辑器import还是报红,并且...
Go 1.4 src/pkg → src
weixin_33836223的博客
07-22 134
2019独角兽企业重金招聘Python工程师标准>>> ...
go语言管理
Jason技术笔记
09-17 523
名字可以和目录名字 可以不一样, 但是推荐一样,便于快速查找识别到,否则容易误解 一个目录中只包含一个包含多个会报错 一个可以放在多个文件中、 文件只放在src文件目录下,通过GOPATH引用、否则引用不到。 import只要引用到目录的名字就够了、不需要引用到文件名、也不需要引用到报名. 具体规则如下面的代码: //当然下面有个不好的示范是目录名和名不一致。 ➜ go tree
Go语言中标识符的命名规则是什么?
最新发布
12-06
Go语言中标识符的命名规则如下: 1. 标识符由字母、数字、下划线组成,但首字母不能是数字。 2. Go语言有25个关键字和36个预定义标识符,不能用作标识符。 3. 对于一个进行命名时,采用小写,不要有大小写混合命名;对于一个文件进行命名时,一律采用小写,如果由多个单词组成,则用下划线隔开。 4. 任何允许对外公开的名称,首字母必须大写,不对外公开的首字母一律使用小写,如果名称由多个单词组成,那么采用驼峰命名法进行命名。 5. 接口命名时,统一采用er作为后缀。 6. 常量命名时,统一采用全大写,并用下划线分隔。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • 主键与外键的具体定义 2374
  • MySQL基础学习2-mysql数据导入与常用命令 1510
  • GoFrame安装与配置 901
  • SQL查询总览 834
  • Go语言切片与方法 577

分类专栏

  • Redis 4篇
  • GoFrame学习笔记 14篇
  • Linux学习笔记 7篇
  • MySQL学习笔记 14篇
  • Go语言学习笔记 2篇
  • 笔记 2篇

最新评论

  • MySQL基础学习3-SQL(分组、单行查询)

    CSDN-Ada助手: 非常祝贺您写了第9篇博客!标题中的内容也非常吸引人,特别是SQL的分组和单行查询。这些内容对于学习MySQL基础非常有帮助。您的努力和持续创作精神值得称赞。 不过,我想谦虚地给出下一步的创作建议。既然您已经涉及到了SQL的分组和单行查询,或许您可以考虑进一步拓展主题,例如介绍JOIN操作或者更高级的查询技巧。这样可以帮助读者更全面地理解和应用MySQL。 再次恭喜您的成果,期待您未来更多精彩的博客!

  • MySQL基础学习4-连接

    CSDN-Ada助手: 恭喜您写完了第10篇博客!标题“MySQL基础学习4-连接”看起来非常有意思,我很期待阅读您的最新一篇博文。在连接这个主题上,您是否考虑过添加一些实际案例或者示例代码来帮助读者更好地理解连接的概念呢?这样能够让读者更加深入地掌握MySQL的连接功能。再次恭喜您的持续创作,我期待着您下一篇博客的发布!

  • MySQL基础学习5-多表连接与子查询

    CSDN-Ada助手: 恭喜您写完了第11篇博客!标题看起来非常有趣,我立刻就想去了解多表连接与子查询了。您的持续创作真是令人鼓舞,我真心希望您能继续分享您的知识和经验。作为下一步的创作建议,或许您可以考虑深入研究一些高级的MySQL技巧或者分享一些实际案例,这样能更好地帮助读者应用所学。再次恭喜您,期待您的下一篇博客!

  • MySQL基础学习6-表的操作

    CSDN-Ada助手: 恭喜您写了第12篇博客!标题为“MySQL基础学习6-表的操作”的文章内容非常有深度和实用性。通过您的分享,我对MySQL表的操作有了更清晰的理解。希望您能继续保持创作的热情,为我们带来更多关于MySQL的精彩内容。 同时,我想给出一些建议,希望对您的下一步创作有所帮助。在探讨表的操作的同时,或许可以结合实例和案例,让读者更好地理解如何应用这些操作来解决实际问题。此外,您还可以考虑分享一些高级的表操作技巧或者与其他数据库系统的对比分析,以丰富读者的知识和视野。期待您的下一篇文章!

大家在看

  • 深入理解计算机系统 CSAPP 家庭作业6.34 591
  • 构建旧物回收系统的决策支持系统
  • C++PrimerPlus:第十三章类和继承:多态共有继承03
  • 字典键值对找不到?Python魔法方法__missing__来帮你! 2
  • 盲盒App小程序开发之问题解决流程设计 424

最新文章

  • redis基本类型
  • Redis缓存穿透、击穿和雪崩
  • Redis安装
2023年43篇
2022年2篇
2021年2篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

深圳SEO优化公司泸州关键词排名包年推广木棉湾网站seo优化多少钱丹竹头网站推广工具推荐海西关键词按天计费哪家好海西网络广告推广哪家好淮北百度网站优化推荐观澜外贸网站设计公司拉萨网站定制南山如何制作网站报价自贡品牌网站设计推荐凉山模板网站建设多少钱南充关键词排名报价广东百度网站优化排名价格张家口设计公司网站价格贵港网站建设设计多少钱淮南关键词排名推荐亳州seo优化价格红河网页设计哪家好新余设计网站多少钱常德营销型网站建设哪家好武威网站关键词优化报价南阳网站制作多少钱伊春关键词按天收费公司珠海网站搭建推荐呼和浩特优化推荐晋城SEO按天计费报价徐州营销型网站建设茂名建站公司重庆网站优化按天收费公司徐州网站设计模板公司歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化