自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(104)
  • 资源 (1)
  • 收藏
  • 关注

原创 go语言学习笔记 — 基础 — 基本语法 — 常量与变量 — 变量的类型零值

类型零值当一个变量或者新值被创建时,如果没有为其明确指定初始值,go语言会自动初始化对应类型的零值。零值并不等于空值,而是当变量被声明为某种类型后的默认值。各类型零值如下:布尔型变量的默认零值为false,bool : false整型和浮点型变量的默认零值为0,int : 0,float : 0.0字符串变量的默认零值为空字符串,string : ‘’切片、函数、指针变量的默认零值为nil,pointer、function、interface、slice、channel、map : nil对

2021-10-30 00:08:51 218

原创 go语言学习笔记 — 基础 — 基本语法 — 常量与变量 — 变量的数值类型转换

go语言使用类型前置加括号的方式进行类型转换。格式若A是一个全新的类型,需要加:;若之前已经声明过A,则不需要加:。其中,TypeOfA代表要转换的类型,B包括变量、复杂算子和函数返回值等表达式。A [:]= TypeOfA(B)实例package mainimport ( "fmt" "math")func main() { var x, y int = 3, 4 // 表达式T(v)将值v转换为类型T。 var f float64 = math.Sqrt(float6

2021-10-30 00:07:55 146

原创 go语言学习笔记 — 基础 — 基本语法 — 常量与变量 — 变量作用域(1):能够使用变量的代码范围

作用域是已声明标识符所表示的常量、变量、类型、函数或包在源代码中的作用范围。Go语言可以在三个地方声明变量:函数体内定义的变量,称为局部变量函数体外定义的变量,称为全局变量函数定义中的变量,称为形式参数在编程中,变量在实现了功能后,其作用域越小,可能造成问题的概率就越小。每个变量代表一个状态,有状态的地方就可能被修改。函数的局部变量只会影响一个函数的执行,但全局变量可能会影响所有代码的执行状态,因此限定变量作用域有助于代码稳定性。接下来,让我们具体了解局部变量、全局变量和形式参数。局部变量

2021-10-30 00:06:17 134

原创 go语言学习笔记 — 基础 — 基本语法 — 常量与变量 — 常量变量的声明(5):变量初始化声明和变量赋值

变量声明出现了:expected declaration, found ‘IDENT’。变量声明的要点:=只能在函数体内部使用,只用来声明临时(局部)变量。不能用于声明函数体外的全局变量使用var关键字在函数体外部初始化全局变量,正确操作:var a int = 8或var a = 8;使用var关键字在函数体内部初始化局部变量:var a int,a = 6变量声明和变量赋值是两个不同的操作:可以在函数体外部声明变量(var n int),然后在函数体内部引用赋值对应变量(n = 9)形成闭包。

2021-10-30 00:04:32 206

原创 go语言学习笔记 — 基础 — 基本语法 — 常量与变量 — 常量变量的声明(4):多个变量的初始化声明与赋值

1. 声明的方式多个变量声明与赋值// 为类型相同的多个变量赋值var vname1, vname2, vname3 typevname1, vname2, vname3 = v1, v2, v3并行赋值var vname1, vname2, vname3 type = v1, v2, v3自动类型推断// 和python很像,不需要显示声明类型,自动推断var vname1, vname2, vname3 = v1, v2, v3 最简写法(首选,只能在函数体内

2021-10-30 00:03:10 359

原创 go语言学习笔记 — 基础 — 基本语法 — 常量与变量 — 常量变量的声明(3):单个变量的声明与赋值

变量来源于数学,是计算机语言中储存计算结果或表示值的抽象概念,变量可以通过变量名访问。变量的功能是存储用户的数据。不同的逻辑有不同的对象类型,也就有不同的变量类型。经过半个多世纪的发展,编程语言已经形成一套固定的类型,这些类型在不同的编程 语言中基本是相通的。常见变量的数据类型有: 整型、浮点型、布尔型、结构体等。Go语言的每一个变量都拥有自己的类型,必须经过声明才能使用。Go语言变量名由字母、数字、下划线组成,其中首个字母不能为数字。1. 声明变量声明变量的一般形式是使用var关键字:var id

2021-10-30 00:01:07 136

原创 go语言学习笔记 — 基础 — 基本语法 — 常量与变量 — 常量变量的声明(2):常量的初始化定义

常量是一个简单值的标识符,在程序运行时,不会被修改。常量中的数据类型只可以是布尔型、数字型(整数型、浮点型和复数)和字符串型。常量的初始化定义特点常量的值在编译时就已确定,可以用于数组声明const size = 4var arr [size]int常量定义格式与变量基本相同常量定义的等号右边,必须是常量或常量表达式常量表达式中的函数必须是go内置函数常量的初始化定义单个常量的定义(常用)const identifier [type] = value你可以省略类型说

2021-10-30 00:00:09 171

原创 go语言学习笔记 — 基础 — 基本语法 — 常量与变量 — 常量变量的声明(1):常量的初始化规则与枚举

package mainimport ( "fmt")// 常量初始化const ( a = "A" // 第一个常量必须显式指定表达式,a与b都为"A" b c, d = iota, iota // itoa从0计数,前面已有两个常量,其值为2 e, f // e、f的常量表达式为iota,其值为3 g = "B" h = iota // h值为5)// 星期枚举const ( // 第一个常

2021-10-29 23:58:36 111

原创 go语言学习笔记 — 基础 — 基本语法 — 常量与变量 — 变量的生命周期(3):变量逃逸分析 —— go编译器自动决定变量的内存分配方式(堆还是栈),提高程序运行效率

C/C++语言需要开发者自己管理内存分配,选择合适的内存分配方式以适应不同算法需求:函数的局部变量尽量使用栈内存分配;全局变量、结构体成员变量使用堆内存分配等。变量逃逸分析:go语言把内存分配的过程整合到编译器中,由go编译器分析代码的特征和生命周期,自动选择堆分配内存还是栈分配内存。上述过程对程序员是透明的,不会感知,不需要耗费精力。编译器决定选择堆分配还是栈分配的原则。变量是否发生逃逸变量是否被取地址变量逃逸分析(使用哪种内存分配机制)package mainimport ( "fm

2021-10-29 23:57:06 154

原创 go语言学习笔记 — 基础 — 基本语法 — 常量与变量 — 变量的生命周期(2):堆(heap)

在给变量分配内存时,使用堆分配类似于向一个房间中摆放家具(为变量分配内存),家具的尺寸(变量所占内存地址空间)有大有小在摆放家具(分配内存)时,需要找一块足够大小的空间(内存地址范围)经过反复摆放和腾挪之后,房子内摆放家具乱七八糟。到了一定时候,房子内虽然还有空间,但是分布在不同区域,没有一段连续的空间可以摆放家具(给变量分配地址空间)当房子没有连续的空间摆放家具,房主(内存分配器)就需要对现有空间调整优化与栈内存分配相比,堆更适合不可预知大小的内存分配,但是代价是分配速度慢,易形成内存碎片。堆.

2021-10-29 23:55:53 107

原创 go语言学习笔记 — 基础 — 基本语法 — 常量与变量 — 变量的生命周期(1):栈(stack)

栈是一种拥有特殊规则的线性表。1. 概念栈的操作(入栈和出栈)和栈元素扩展栈只允许向线性表的一端放入数据,之后在同一端取出数据。按照后进先出(或先进后出)的顺序向栈中放入元素的过程叫入栈,入栈会增加栈中的元素数量。先入栈的元素在栈底,后入栈的元素在栈顶从只能从栈顶取出元素,取出元素后,栈中元素数变少。最先放入元素最后被取出,最后放入元素最先取出。不允许从栈底取元素,也不允许对除栈顶元素以外的元素,进行查看和修改。栈类似于桌子上的一摞书,书按顺序一本本从顶部放入,取书时只能从顶部一本本取出

2021-10-29 23:54:26 175

原创 go语言学习笔记 — 基础 — go工具(7):go工具

go工具为公共代码仓库中维护的开源代码而设计。go工具用于构建源码包,并将其生成的二进制文件安装到工作空间GOPATH的pkg和bin目录中。go工具非常丰富:获取源代码(go get)编译(go build)文档测试(go test,使用测试框架,编写单元测试,命令行测试,输出测试报告)(基准测试能提供可自定义的计时器和一套基准测试算法,快速分析一段代码可能存在的CPU耗用和内存分配问题)性能分析(go pprof,把程序CPU耗用、内存分配、竞态等问题用图形化方式展现)源码格式化源码提示

2021-10-29 23:38:08 208

原创 go语言学习笔记 — 基础 — go工具(6):性能分析,发现代码性能问题的具体位置 —— go pprof

go pprof可以帮助开发者快速定位与分析各种go程序的性能问题,如CPU消耗、内存分配和阻塞分析。性能分析使用runtime.pprof包,嵌入到待分析go程序的入口和结尾处。runtime.pprof包在程序运行时进行每秒100次采样,最少采样1秒,然后把生成的数据导出,让开发者写入文件或在其他媒介上分析。go pprof配合Graphviz图形化工具,可以把runtime.pprof包生成的数据转换成PDF,来展示程序性能分析报告。安装第三方图形化显式分析工具(graphviz)官网:www

2021-10-29 23:37:04 172

原创 go语言学习笔记 — 基础 — go工具(5.2): 基准测试 (性能测试)—— 获得代码内存占用和运行效率的性能数据

基准测试可以测试一段程序的运行性能和耗费CPU的程度。go提供了基准测试框架,可以打印出非常标准的测试报告。benchmark,意为基准。1. 基准测试的基本使用测试文件以_test.go结尾测试用例函数以func Benchmark_XXX(b *testing.B) 开头b.N由基准测试框架提供package go_test// 在同一个包文件夹下,go源文件的package声明必须是同一个包名,否则会报错:package benchmark_testimport "testing"

2021-10-29 23:35:21 354

原创 go语言学习笔记 — 基础 — go工具(5.1):单元测试 —— 测试和验证代码的框架

单元测试是指,是指对软件中的最小可测试单元进行检查和验证。对于单元测试中单元的含义,如C语言中指一个函数,Java中指一个类,图形化软件中指一个窗口或菜单等。总的来说,单元是认为规定的最小可测试功能模块,单元测试是在软件开发过程中要进行的最低级别测试活动,独立单元与程序的其他部分相隔离情况下测试。1. 注意点go单元测试源文件必须以_test.go结尾,自动执行其中所有以func TestXXX(t *testing.T)开头的函数一个单元测试文件可以包含多个测试用例函数func TestXXX(t

2021-10-29 23:33:42 195

原创 go语言学习笔记 — 基础 — go工具(4):一键获取源代码,编译并安装 —— go get

我们可以使用go get工具,借助代码管理工具远程拉取或更新代码包(及其依赖),并自动完成编译和安装,整个过程像安装一个APP一样简单。远程包的路径格式go代码可以被托管到github.com这样的托管网站。这些网站的项目包路径都有一个共同的标准:网站域名/作者或机构/项目名github.com/golang/go获取远程包:go get -v 远程包在完成设置GOPATH后,我们可以直接使用go get,格式如下:go get -v 远程包名路径,就可以下载这个包到我们$GOPATH/

2021-10-29 23:30:53 1069

原创 go语言学习笔记 — 基础 — go工具(3):编译并安装 —— go install

go install 包名,包名是相对于$GOPATH/src目录的包路径。假设本地包的绝对路径是$GOPATH/src/github.com/locutus666/go_learing/ch16/goinstall,则有如下安装操作:// GOPATH=~/go# go install github.com/locutus666/go_learing/ch16/goinstall# cd ~/go/bin# ./goinstallcall CustomPkgFunchello worl

2021-10-28 23:50:34 446

原创 go语言学习笔记 — 基础 — go工具(2):编译后运行 —— go run

python语言可以在不输出二进制可执行文件情况下,使用虚拟机直接执行源文件。go语言没有虚拟机,但使用go run可以达到同样效果。go run会编译go源码,直接执行go源码中的main()函数,不在当前目录下输出任何可执行文件。使用go run main.go运行下面代码。package mainimport ( "fmt" "os")func main() { fmt.Println("args:", os.Args)}观察运行结果# go run main.go --in

2021-10-28 23:48:49 759

原创 go语言学习笔记 — 基础 — go工具(1):编译 —— go build

go语言的编译不像C++一样配置各种包含路径、链接库地址。1. go build (无参数编译)如果源码中没有GOPATH的包依赖,则可以使用无参数编译go源码。go build会搜索当前目录下的go源文件,编译,然后在当前目录下,生成当前目录名(包名)的可执行文件。代码结构main.gopackage mainimport "fmt"func main() { pkgFunc() // 同包的函数 fmt.Println("hello world!")}lib.gopack

2021-10-28 23:47:50 833

原创 go语言学习笔记 — 基础 — 高级数据类型 — 数据容器 — 字典map(1):map声明与初始化

1. map是什么map是一种无序键值对的集合,可以通过key来快速检索数据。键值对是map中的关联关系,key类似于索引,指向数据的value值。map有以下两个特点:无序。我们无法决定map的返回顺序,因为map是使用hash表实现的可迭代。我们可以像迭代数组和切片那样,遍历map2. map声明与初始化使用关键字mapvar map_variable = map[key_data_type]value_data_type{}或者map_variable := map[ke

2021-10-28 23:40:44 266

原创 go语言学习笔记 — 基础 — 高级数据类型 — 数据容器 — 字典map(2):map键值对的增删改查

1. 插入元素(增)map插入key:value键值对scene := map[string]int{"one":1, "two":2, "three":3}scene["four"] = 4 countryCapitalMap := make(map[string]string)// map插入key - value对,各个国家对应的首都countryCapitalMap["France"] = "Paris"countryCapitalMap["Italy"] = "罗马"coun

2021-10-28 23:39:45 359

原创 go语言学习笔记 — 基础 — 高级数据类型 — 数据容器 — 数组(4):数组截取

简称 “前闭后开”a[开始索引(包含):结束索引(不包含)]a := [...]int{1, 2, 3, 4, 5}a[1:2] // 2a[1:3] // 2, 3a[1:len(a)] // 2, 3, 4, 5a[1:] // 2, 3, 4, 5a[:3] // 1, 2, 3数组截取之后,就变成slice了。var a = [5]int{1, 2, 3, 4, 5}var b = a[1:3]...

2021-10-28 22:58:32 675

原创 go语言学习笔记 — 基础 — 高级数据类型 — 数据容器 — 数组(3):向函数传递数组

如果要向函数传递数组参数,你需要在函数定义时,声明形参为数组。有以下两种方式:形参设定数组长度func MyFunction(param [10]int) { ...}示例func TestMainSet(t *testing.T) { var array = []int{1, 2, 3, 4, 5} setArray(array) // 未定义长度的数组,只能传给不限制数组长度的函数 var array2 = [5]int{1, 2, 3, 4, 5} // 定义了长度的数

2021-10-28 22:53:22 204

原创 go语言学习笔记 — 基础 — 高级数据类型 — 数据容器 — 数组(2):二维数组

go语言支持多维数组,最简单的多维数组是二维数组。以下为常用的多维数组声明方式:array_name为数组名,variable_type为Go语言的数据类型。var array_name [SIZE1][SIZE2]...[SIZEN] variable_type示例:三维的整型数组var three_dim [5][10][4]int二维数组简介二维数组是最简单的多维数组,二维数组本质上是由一维数组组成。二维数组定义方式如下:var array_name [x][y]variable_t

2021-10-28 22:51:17 461

原创 go语言学习笔记 — 基础 — 高级数据类型 — 数据容器 — 数组(1):一维数组

数组是具有相同类型的一组已编号且长度固定的数据序列,这种类型可以是任意基本类型,例如整型、字符串类型或者自定义类型。数组是一段固定长度的连续内存区域。使用数组时可以修改成员,但是数组大小从声明时就确定,不可变化。一维数组简介相对于声明number0, number1, …, and number9变量,使用一维数组形式numbers[0], numbers[1] …, numbers[9]更加方便且易于扩展。通过索引来访问(读写)数组元素,索引从0开始。声明与初始化一维数组声明并初始化数

2021-10-28 22:48:18 383

原创 go语言学习笔记 — 基础 — 高级数据类型 — 数据容器 — 切片(4):数组 vs. 切⽚

容量是否可伸缩数组容量不可伸缩,切片容量可以伸缩。是否可以进行比较数组之间可以比较(只要维度、长度、元素相同的两个数组,== 的值就是true)。切片之间不可以比较(两个相同的切片也不可比较,切片只可以与nil比较)。修改一个切片就是改变指向的数组,所以其他指向这个数组的切片也会受到影响。是否值类型数组是值类型,切片是指针类型。使用场景长度已知的情况使用数组;要求容量自动增长的情况使用切片,但切片容量的自动增长会导致内存分配和数据复制,以及未来相关的GC开销。数据类型统一.

2021-10-28 18:34:48 116

原创 go语言学习笔记 — 基础 — 高级数据类型 — 数据容器 — 切片(3):切片内部结构

切片内部结构切⽚共享存储结构切片months、Q2、summer有一个共同元素June,共享内存空间。一个隐患:使用共享内存的两个切片,如果有一方扩容,则扩容一方不再指向原有内存空间。因为扩容后会分配一个更大的空间,则使原切片的指针指向了不同的地方。...

2021-10-27 21:54:52 97

原创 go语言学习笔记 — 基础 — 高级数据类型 — 数据容器 — 切片(2):访问切片元素和子切片

访问切片切片元素使用”切片变量[]”的方式进行访问,在方括号中提供切片的索引即可访问元素,索引范围从O开始,且不超过切片的最大容量。// 初始化一个三元素切片a := make([]int, 3)// 为切片的元素赋值a[O] = 1a[1] = 2a[2] = 3切片还可以在其元素集合内连续地选取一段区域,就像其名字“切片“一样,切出一块区域,形成新的切片。str := "hello world" fmt.Println(str[6:])...

2021-10-27 19:00:14 228

原创 go语言学习笔记 — 基础 — 高级数据类型 — 数据容器 — 切片(1):切片的初始化声明

切片是一个拥有相同数据类型元素的可变长序列。切片可以通过数组来初始化,也可以通过内置函数make()初始化。声明格式var 变量名 []T其中,T代表切片元素数据类型,可以是整型、浮点型、布尔型、切片、 map、函数、结构体等。方式一:直接初始化切片(常用)[]表示是切片类型,{1, 2, 3}表示初始化值依次是1, 2, 3,其中切片容量cap和长度len都等于3。s := []int{1, 2, 3}注:直接初始化切片时,len=cap。在追加切片元素遇到容量cap不足时,将

2021-10-27 18:59:26 2082

原创 go语言学习笔记 — 基础 — 基本数据类型 — 类型类别:值类型和引用类型

1. 值类型像int、float、bool和string这些基本类型都属于值类型,使用这些类型的变量直接指向内存中的值:当使用等号=把一个变量的值赋给另一个变量时,如:j = i,实际上是在内存中将i的值进行了拷贝:2. 引用类型你可以通过&i来获取变量i的内存地址,例如0xf840000040(每次的地址都可能不一样)。值类型的变量值存储在栈中。内存地址会根据机器的不同而有所不同,甚至相同的程序在不同的机器上执行后也会有不同的内存地址。因为每台机器可能有不同的存储器布局,并且位置分配

2021-10-27 18:54:05 206

原创 go语言学习笔记 — 基础 — 基本数据类型 — 原生数据类型:布尔型、数字类型(整型与浮点型)、字符串类型

数据类型的出现是为了区分所需内存大小不同的数据。在编程时,我们需要用到大数据结构时才需要申请大内存,这样就可以充分利用内存。在go编程语言中,数据类型用于声明函数和变量。1. 基本类型go的基本类型分为3类序号类型描述1布尔型布尔型的值只能是常量true或者false。一个简单的例子:var b bool = true2数字类型整型int,浮点型float32、float64,Go语言支持整型和浮点型数字,并且原生支持复数,其中位的运算采用补码3字符串类型

2021-10-27 18:49:27 381

原创 go语言学习笔记 — 基础 — 高级数据类型 — 派生类型:指针(pointer)、数据容器、函数(func)、结构体(struct)、通道(channel)

go的派生类型,即复合类型。序号类型描述1派生类型包括:指针(pointer)、数据容器(数组array、列表list、切片slice、字典map)、结构体(struct)、通道(channel)、函数(func)、接口(interface)...

2021-10-27 18:46:56 494

原创 go语言学习笔记 — 基础 — 基本语法 — 运算符:go中的运算符

算术运算符下表列出了所有Go语言的算术运算符。假定A值为10,B值为20。运算符描述实例+相加A + B 输出结果 30-相减A - B 输出结果 -10*相乘A * B 输出结果 200/相除B / A 输出结果 2%求余B % A 输出结果 0++自增A++ 输出结果 11–自减A-- 输出结果 9package mainimport "fmt"var a int = 21var b int = 1

2021-10-27 17:23:55 251

原创 go语言学习笔记 — 基础 — 基本语法 — 类型相关(2):类型的可比较性

类型说明map宕机错误,不可比较切片([]T)宕机错误,不可比较通道(channel)可比较,必须由同一个make生成,也即同一个channel才会是true,否则false数组([cap]T)可比较,编译期知道两个数组是否一致结构体可比较,可以逐个比较结构体的值函数宕机错误,不可比较...

2021-10-27 17:23:30 118

原创 go语言学习笔记 — 基础 — 基本语法 — 类型相关(1):类型定义与类型别名

类型别名主要用于go代码升级、迁移中,类型的兼容性问题。这解决了代码重构中最麻烦的类型名变更问题。1. 类型定义与类型别名类型定义写法:type TypeDef Type栗子:type byte uint8type rune int32类型别名写法:type TypeAlias = Type栗子:type byte = uint8type rune = int32TypeAlias只是Type的别名,本质上TypeAlias与Type是同一个类型,就像一个孩

2021-10-27 17:23:11 209

原创 go语言学习笔记 — 基础 — 基本数据类型 — 指针(3):取地址与取值

&普通类型取对应变量的内存地址,得到指针类型。*指针类型从对应指针的内存地址值,取出值。

2021-10-26 10:05:25 509

原创 go语言学习笔记 — 基础 — 基本数据类型 — 指针(2):使用指针(变量)获取命令行入参信息

package mainimport ( "flag" "fmt" "testing")// 使用flag包,把命令行参数解析传入go代码中提前定义好的一些变量// 使用flag.String,定义一个mode变量,类型是*stringvar mode = flag.String("mode", "", "process mode") func main() { flag.Parse() // 解析命令行参数,并把命令行参数值解析入上述变量mode中 fmt.Println(

2021-10-26 10:03:57 144

原创 go语言学习笔记 — 基础 — 基本数据类型 — 指针(1):一文详解go指针

说到指针,许多人感到“谈指针色变”,对指针偏移、指针运算、指针转换非常恐惧。其实,指针是C族语言(C/C++)极高性能的根本,在操作大块数据和做内存地址偏移时,方便快捷。C族语言(C/C++)中指针被诟病的原因是 指针的运算 和 内存释放。go中的指针分为两个重要方面:类型指针。类型指针拥有指针的高效访问:传递数据使用指针,而不是采用内存拷贝;使用类型指针修改(其指针地址)指向的普通变量值。类型指针不能运算和偏移切片。由指向起始元素的原始指针、元素数量和容量构成。切片比原始指针更安全高效,当切片越界

2021-10-26 10:01:02 325

原创 go语言学习笔记 — 基础 — 基本数据类型 — 字符串(11):go中的字符串

string是数据类型,不是引⽤或指针。其零值是空字符串"",而不是nilstring是只读的byte slice,使用len函数可以返回它所包含的byte数string的byte数组可以存放任何数据,如可见字符(汉字、英文字母、数字),二进制数据常⽤字符串包strings包https://golang.org/pkg/strings/strconv包https://golang.org/pkg/strconv/...

2021-10-26 09:56:09 69

原创 go语言学习笔记 — 基础 — 基本数据类型 — 字符串(10):实战 —— 从.INI配置文件中,查询需要的值

.ini文件是一种古老的配置文件格式。在一些操作系统、虚幻游戏引擎、git版本管理中都在使用.ini文件格式。下面展示了.ini文件的样式。[core] repositoryformatversion = 0 filemode = false bare = false logallrefupdates = true symlinks = false ignorecase = true hideDotFiles = dotGitOnly [remote "origin"]url = ht

2021-10-26 09:53:58 183

安装centos7恢复windows引导

安装centos7恢复windows引导

2015-04-10

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除