Go开发

一、基本知识

1.1、基本结构

(1)go文件的后缀是.go

(2)package main

​ 表示hello.go文件所在的包是main。在go中,每个文件都必须属于一个包。

(3)import “fmt”

​ 表示引入一个包,可以使用fmt包中的函数

(4)func main(){

}

func 是一个关键字,表示一个函数。

main 是函数名,是一个主函数,即为程序的入口

*go语言里面,创建什么变量则一定要使用变量,否则会报错。

*标识符首字母大写表示变量公有,首字母小写则表明变量私有只能在当前包内使用

1.2、转义字符

package mainimport "_fmt"  //_表示暂时不使用这个包
func main( )  {fmt.Println("tom\tjack") //制表符,实现对齐功能fmt.Println("hello\nword") //换行符fmt.Println("D:\\Go工具\\GoLand 2021.1.3\\bin") // "\\"输出一个\fmt.Println("天龙八部雪山飞狐\r张") //覆盖全部内容
}

1.3、代码规范

1)行注释

// 注释内容

2)块注释

/*

注释内容

*/ (块注释里面不能再嵌套一个块注释)

3)代码实现缩进,可利用shift+tab键,或者使用gofmt格式化

1.4、DOS基本操作

1)dir 查看当前目录文件内容

2)cd /d f: 切换其他盘,例如:从d盘切换到f盘

3)cd d:\test100 从当前盘切换到当前当前盘中文件包

4)cd … 回到上级目录

5)cd \ 回到顶级目录

6)md 创建空目录

7)rd 删除空目录

8)rd /q/s 删除目录(不考虑里面有无内容)

9)rd /s 带询问删除目录

10)echo 内容 > 所想创建文件的目录绝对路径(d:\test100\abc100\hello.txt)

11)copy 指定文件 复制的文件目录路径(abc.txt d:\test100)

12)move 文件名 移动的文件目录路径(想改路径可以再后面加上文件名)

13)del *.txt删除这样类型所有文件

14)cls 清屏

15)exit 退出

二、Go语言知识

2.1、Golang变量

2.1.1创建变量代码演示

package mainimport "fmt"
var(i1 = 100name2 = "joke"i3 = 1000) //创建全局变量func main() {var i int;   //指定变量类型时,创建变量格式i = 100fmt.Println("i=",i)n := "tom"  //省略var时候,需要加上 :=fmt.Println("name=",n)var n1, n2, n3 int //创建多个变量fmt.Println(n1,n2,n3)var a, name, b = 100,"tom",88 //一次性创建多个变量,其中是一一对应fmt.Println(a,name,b)j, na, k := 100,"tom",88 //省略varfmt.Println(j,na,k)fmt.Println(i1,name2,i3)
}

2.1.2 数据类型

2.1.2.1

*byte只能储存一个字符,go里面没有专门的char类型

2.1.2.2 整型类型

类型有无符号范围备注
int-2的63次方~2的63次方-1
uint0~2的64次方-1
rune-2的31次方~2的31次方-1等价int32,表示一个Unicode码
byte0~255当要存储字符时候选用byte

**Golang程序中整型变量在使用时,遵守保小不保大的原则,即保证程序正常运行的情况下采用占用空间小的数据类型。

2.1.2.3 浮点型

类型占用空间范围
单精度(float)4字节-3.403E38~3.403E38
双精度(double)8字节-1.798E308~1.798E308

2.1.2.4 字符类型

(1)go中的字符串是由字符拼接起来的

(2)

package mainimport "fmt"
func main() {var n1 byte = 'a'var n2 byte = '0'fmt.Println("n1",n1)fmt.Println("n2",n2)   //只能输出码值fmt.Printf("n2 = %n2",n2)//格式化输出可以输出字符//若超过ASCII范围var n3 int = '北'fmt.Printf("n3 = %n3",n3)  //若对变量赋值为数字再按照格式化输出,则输出对应字符。}

2.1.2.5 布尔类型

(1) 布尔类型取值只能为true和false

2.1.2.6 字符串类型

package mainimport "fmt"
func main() {//基本使用var adress string = "adfadsf sdafdasf"fmt.Println(adress)
}

(1) Go中的字符串是不可变的

(2) 创建字符串变量时,可以是使用

反引号``,可以将源码输出,双引号” “会识别引号里面的特殊字符

(3) 当一个拼接操作很长时候,可以分开写,加号必须再上面

var str = "hello" +"world" +"hahaha"

2.1.2.6 数据类型转换

 var i int32 = 100var n1 float32 = float32(i)//其余类似这种转换结构,注意转换后的i的数据类型没有改变//数据基本类型转换string//方式一、使用fmt.Sprintfvar num1 int = 99var str stringstr = fmt.Sprintf("%d",num1)fmt.Printf("str type %T str = %v",str,str)//方式二、使用strconv 函数,详见go标准文库中文文档str = strconv.FormatFloat(num1,'f',10,64) //说明:'f'格式  10表示保留10小数  64表示这个小数是float64//string类型转换成数据基本类型var str string = "true"var b boolb , _ = strconv.ParseBool(str)//因为这个函数返回两个值,因此忽略第二个值,_表示忽略

注意:在进行string转换成基本类型时,要确保能转换成有效的数据,否则Golang会直接将其转换成0.

2.2 指针

package main
import ("fmt"
)
func main(){var num int = 100//创建go指针var ptr *int = &numvar num2 int = *ptrfmt.Printf(num," ",ptr," ",num2)
}

2.3 值类型和引用类型

2.3.1 值类型

基本数据类型 int系列,float系列,bool,string,数组和结构体 struct

2.3.2 引用类型

指针,slice切片,map、管道 chan、interface等

2.4 运算符以及终端输入

说明:++ 和 – 只能独立使用,例如

package main
import ("fmt"
)
func main(){var name stringvar i int = 8var a int//a = i++,这样就是错误的写法i++a = i   //应该先让i实现++,再赋值给a//++i或者--i这样是错误的,go中没有前--或前++//从终端输入,方式一:fmt.Scanln(&name)//这里是将name的地址传给函数,可以从终端输入name的值fmt.Printf("name is %v",name)//方式二:fmt.Scanf("%s",&name)//注意输入多个时候需要一一对齐
}

2.5 流程控制

2.5.1 if语句

    //方式一:var age intvar age1 intfmt.Println("请输入年龄")fmt.Scanln(&age)if age < 0 {fmt.Println("你这个是假的的把")}//方式二:if age1 = 20; age1 > 18 {fmt.Println("你已经成年了小子")}//在go中无论if语句中有几条语句,都要加上{}if age > 18 {fmt.Println("你已经成年了小子")}else {                              //这里else必须写在这一行,否则报错fmt.Println("你还是未成年")}

2.5.2 switch语句

switch 表达式 {case 表达式一,表达式二.... :语句块case 表达式一,表达式二.... :语句块fallthrough//执行完这一语句后,还可以执行下一语句case 表达式一,表达式二.... :语句块...default:语句块//在go语言中switch语句没有break,而是默认有//switch后面可以跟常量,也可以跟函数返回值//switch后面可以不跟表达式/*例如:switch {case age == 10:语句块}*/}

2.5.3 循环语句

//方式一:
for i = 1; i < 10; i++ {语句块
}
//方式二:
var j  =  1
for j < 10 {j++
}for{	语句块break
}//for循环也可以不用写循环条件,只是需要添加break来终止循环//for range字符串遍历或遍历数组
str := "hello"
for index, val := range str{fmt.Println("index=%d, val=%c \n",index, val)
}//如果字符串中有中文,用传统的遍历会出现中文乱码,可以将其转换成切片  str2 := []rune(str)

2.6 跳转控制语句

2.6.1 break

1)入门案例

package main
import ("fmt""math/rand""time"
)func main() {//生成一个随机数,还需要个rand设置一个种子//time.Now().Unix() : 返回一个从1970:01:01 的0时时0分0秒到现在的秒数//rand.Seed(time.Now().Unix())//如何随机生成1-100的整数//n := rand.Intn(100) + 1//fmt.Println(n)var count int = 0for {rand.Seed(time.Now().UnixNano())n := rand.Intn(100) + 1count++fmt.Println("n=",n)if(n == 99){break}}fmt.Println("生成99一共使用了",count)
}

2)在嵌套循环中使用break,可以通过标签指定跳出那个循环。

lable1:
for i := 0; i < 10; i++ {if i == 2 {break lable1:}
}

2.6.2 continue

1)continue也可以通过标签跳过那个循环

lable1:
for i := 0; i < 10; i++ {if i == 2 {continue lable1:}fmt.Println(i)
}

2.6.3 goto和return

2.7 函数

2.7.1 创建函数

func 函数名(形参名 形参数据类型) (返回值数据类型) {//倘若返回值只有一个可以不加()执行语句块...return 返回值
}

2.7.2 包的使用

1)在引用包里面的函数或者变量时候,需要将变量名或者函数名首字母大写

2)在给文件打包时候,文件包名通常和所在文件夹同名

3)在import包时,src开始,不用代src,编译器会自动从src下开始引入

4)可以给包取别名,但是原先的包名就不能用了

package main
import ("fmt"util"go_code/breakDmeo/util"
)

5)在同个包下不能有相同的全局变量名或者函数名

2.7.3 函数的注意细节

1)在go中函数也是一种数据类型,可以赋值给一个变量,则该变量也就是这个函数类型的变量。通过该变量可以对函数调用

package main
import "fmt"func getSum(a int, b int) int {return a + b
}
func main() {n1 := getSumn2 := n1(10,40) //等价于getSum(10,40)
}

2)函数既然是一种数据类型,因此在Go中,函数可以作为形参,并且调用

package main
import "fmt"func getSum(a int, b int) int {return a + b
}func myFun(funvar func(int,int)int,num1 int, num2 int) {return funvar(num1,num2)
}
func main() {n1 := getSumn2 := n1(10,40)
}

3)可以为数据类型取别名

package main
import "fmt"type myType func(int,int)int //此时myType就是func(int,int)int类型func myFun(funvar myType,n1 int, n2 int) {return funvar(num1,num2)
}func getSum(a int, b int) int {return a + b
}func main() {res3 := myFun(getSum,500,600)fmt.Println(res3)
}

4)支持对返回值命名

package main
import "fmt"func getSumAndSub (a int, b int) (sum int,sub int {sum = a + bsub = a - breturn
}
func main() {var sum1 intvar sub1 intsum1,sub1 = getSumAndSub(12,56)
}

5)Go支持可变参数

//支持0到多个形参
func sum(args... int) sum int{}//支持1到多个形参,此时args为切片,相当于数组
func sum1(n1 int,args... int) sum int{}

2.7.4 init函数

1)inti函数通常会在main函数之前运行,其主要是为了完成一些初始化工作:

package utils
import "fmt"
var Age int
var Name stringfunc init(){fmt.Println("utils 包的 init().....")
}
2)package main
import ("fmt""go_code/charpter04/utils")var i int = test()func test() int {fmt.Println("test() 中的 test().....")
}func init() {fmt.Println("init 中的 init.......")
}func main() {fmt.Println("main()......i = ",i)fmt.Println("Age = ", Age, "Name = ", Name)
}

2)一个文件中包括全局变量定义、inti函数、main函数,则一般执行顺序为全局变量-》inti函数-》main函数

2.7.5 匿名函数

1)在定义匿名函数时直接调用,但只能用一次

res1 := func (n1 int, n2 int)int {return n1 + n2
}(10,20)

2)将匿名函数func(i int, j int) int赋值给a,此时便可以通过a来完成函数调用,但是a并不是函数名(可以用于函数写一个函数,并且调用)

a := func(i int,j int) int {return i + j
}res := a(10 , 20)

3)全局匿名函数

var {fun = func(i int, j int) int {return i + j}
}func main() {res := fun(10,20)
}

2.7.6 闭包

1)闭包就是一个函数和与其相关的引用环境组合的一个整体

2)案例演示:

func AddUpper() func(int) int {var n int = 10                //以下都是闭包return func(x  int) int {n = n + xreturn n}
}                                 //以上func main() {f := AddUpper()fmt.Println(f(1))fmt.Println(f(2)) //没次调用n都不会初始化而是会累积
}

3)

package mainimport ("fmt""strings"
)func makeSuffix(suffix string) func (string) string {return func (name string) string {if !strings.HasSuffix(name, suffix) {return name + suffix}return name}
}func main() {f := makeSuffix(".jpg")fmt.Println("文件处理后的格式为:" , f("winter"))
}

2.7.7 函数的defer

1)

package mainimport "fmt"func sum(i int, j int) int {defer fmt.Println("000")  //当执行到defer语句时,暂时不执行,将其压入独立的栈中。  执行顺序3defer fmt.Println("111") //当函数执行完了以后,所有defer语句都会按照先入后出的顺序. 执行顺序2tes := i + jfmt.Println("tes",tes) //执行顺序1return tes
}func main() {res := sum(10 , 20)fmt.Println("res ",res) //执行顺序4
}

2)defer的好处在于,可以及时的释放函数所创建的资源

2.7.8 字符串常用的系统函数

1)统计字符串长度

len(str),不用导入包

2)字符串遍历,同时处理中文乱码问题

str2 := "hello世界"
str3 := []rune(str2)   //转换为切片
for i := 0; i < len(str3); i++{fmt.Printf("字符=%C\n", r[i])
}

3)字符串转整数和整数转字符串

//这个函数需要导入"strconv"
n, err := strconv.Atoi("123")//字符串转整数
if err != nil {fmt.Println("转换错误")
}else{fmt.Println("转换成功",n)
}str := strconv.Itoa(123456)  //整数转字符串

4)字符串转为[]byte: var bytes = []byte(“hello go”)

转为[]byte转为字符串

 var bytes = []byte("hello go") //可以得到hello go 的编码str := string([]byte{97,98,99}) //可以得到97,98,99对应的字符abc

5)10进制转2,8,16进制: str = strconv.Formatlnt(132,2),其中返回的时字符串

6)查找子串是否在指定字符串中:strings.Contains(“seafood”,“foo”) //true

//需要引入"strings"
strings.Contains("seafood","foo") //返回true

7)统计一个字符串又几个指定字串

num := strings.Cont("see","e") //返回2

8)不分大小写进行比较

b := strings.EqualFold("abc","ABC") //返回true
//"abc" == "ABC" false     “==”是区分大小写

9)返回子串在字符串第一次出现的位置和最后一次出现的位置

index1 := strings.Index("dafdas","f") //返回3,如果没有则返回-1
index2 := strings.LastIndex("dafdas","a") //返回5

10)将指定的子串替换成另外一个子串

str := strings.Replace("go go beijing","go","hello",1)
//得到 hello go beijing
//其中1是指换掉几个,如果全部换掉则写-1,同时"go go //beijing"可以是变量例如:str2:= "go go beijing"
//str := strings.Replace(str2,"go","hello",1) ,其中str2本身没有发生变化

11)按照某个字符,为分割标识,将一个字符串转换为字符数组

strArr := strings.Split("hello,world",",")
//得到 strArr=[hello world]

12)大小写相互转化

str = strings.ToLower("GO")
str = strings.ToUpper("go")

13)字符串去掉左右空格:string.TrimSpace(" to go ")

​ 将字符串左右指定的字符去掉:strings.Trim("! hello!","!")

​ 将字符串左边指定的字符去掉:strings.TrimLeft("")

​ 将字符串右边指定的字符去掉:strings.TrimRright("")

​ 判断字符串是否为某个字符开头:strings.HasPrefix(“adfasdf”,“a”)

​ 判断字符串是否为某个字符结尾:strings.HasSuffix(“adfasdf”,“f”)

2.7.9 日期和时间相关函数

//需要引入"time"
//1) 获取当前函数
now := time.Now()
//2) 获取其他日期信息
fmt.Printf("year = %v\n",now.Year())
fmt.Printf("month = %v\n",now.Month())
fmt.Printf("day = %v\n",now.Day())
fmt.Printf("hour = %v\n",now.Hour())
fmt.Printf("minute = %v\n",now.Minute())
fmt.Printf("second = %v\n",now.Second())
//3) 格式化日期函数
fmt.Printf(now.Format("2006-01-02 15:04:05")) //可以得到当前时间,但是其中数字是固定的不能改变
//4) 时间休眠函数 time.Sleep()
//time.Second time.Hour time.Minute time.Millisecond毫秒 time.Microsecond微秒

2.7.10 内置函数

说明:直接可以使用而不用引包的函数,例:1)new

num2 := new(int)
//num2 为*int类型即指针

2)len(str)

3)make:主要用来分配内存

2.8 异常处理

1)快速入门

package mainimport "fmt"func test() {//使用defer + recover 来捕获和处理异常defer func() {err := recover() // recove()为内置函数,可以捕获到异常if err != nil {	 // 说明捕获到异常fmt.Println("err =", err)}}()num1 := 100num2 := 0res := num1 / num2fmt.Println("res=", res)
}func main() {test()fmt.Println("main.....")
}

2)自定义错误

package mainimport ("fmt""errors")func readConf(name string) (err error) {//如果输入文件名错误,则返回一个自定义的错误if name == "config.ini" {return nil} else {return errors.New("读取文件错误..")}
}func test() {err := readConf("config.ini")if err != nil {//如果读取文件错误,输出这个错误,并终止程序panic(err)}fmt.Println("继续执行程序")
}func main() {}

2.9 数组

2.9.1 一维数组

1)数组的遍历:for-range

array := [...]int{1,2,3}
for index,value := range array{fmt.Println(value)
}

①第一个index返回的是数组下标

②第二个value则是值

③仅为for循环里的局部变量

④可以用“_”来省略下标值

⑤index,value可以自定义变量名

2)注意事项

①var arr []int 这里的arr为slice切片

②数组创建后,如果没有赋值,则有默认值

1.数值型(整数、浮点数等等)=> 0

2.字符串 =>""

3.布尔类型 => false

2.9.2 二维数组

遍历:

1)双重for循环

2)for-range遍历二维数组

for i, v := range arr {for j, v2 := range v {fmt.Println("arr[%v][%v] = %t", i, j, v2)}
}

2.10 切片

2.10.1 基本介绍

1)切片是数组的引用,因此切片是引用类型,在进行传递时,遵守引用传递的机制

2)切片的长度是可以变化的,相当于一个动态变化的数组

3)演示:

package mainimport "fmt"func main() {var intArr [5]int = [...]int{1,22,5,5,6}//定义一个切片//slice := intArr[1:3]//intArr[1:3] 表示slice 引用到intArr这个数组//引用intArr数组的起始下标为1 ,最后下标为3(不包括3)slice := intArr[1:3]fmt.Println("slice元素 =",slice) // 22,33fmt.Println("slice元素的个数 =",len(slice))//2fmt.Println("slice容量 =",cap(slice))//切片的容量可以动态变化
}

2.10.2 切片内存布局

说明:1.slice为引用类型

2.slice从底层来说相当于一个结构体:

type slice struct{

​ ptr *int //储存其中的数据的地址

​ len int //slice元素的个数

​ cap int //slice的容量

}

2.10.3 切片的使用

1)定义一个切片,然后让切片去引用一个创建好的数组,如上例

2)通过make来创建切片

func main() {var slice []int = make([]int,4,10) //数据类型、len、cap容量,make创建一个切片对应的数组不可见,只能通过slice请访问数据slice[0] = 100slice[2] = 200
}

3)

func main() {var slice []string = []string{"jose","joe","jojo"}
}

4)区别

①方式一和方式二的区别在于,方式一直接引用一个事先存在的数组为可见;而方式二通过make创建切片的同时也会创建一个数组,由切片在底层维护,不可见

5)注意:

①slice := arr[:3] //默认为0-3(不包括3)同时[0:]默认为0-len(arr)

②切片可以继续切片

slice2 := slice[0:1]

③追加元素

var slice1 []int = []int{100,200,300}

slice2 = append(slice1,400,500,600) //这里append是创建了新内存,slice1并未改变

slice3 = append(slice3,slice2…)

④切片的拷贝

copy(pare1,pare2)两者都是切片类型,两者空间独立互不干扰

⑤string和slice

(1)string数组的值是不可变的,但是可以通过先将string转换[]byte切片进行修改,在转换为string数组

str := "hello"
arr1 := []byte(str)
arr1[0] = z
str = string(arr1)  //这种方法虽然可以改变string数组值,但是string中有中文就不可以//如果string有中文arr2 := []rune(str)
arr2[0] = "被"
str = string(arr2)

2.10.4 切片的遍历

package main
import "fmt"func main() {//常规的for循环遍历var arr [5]int = [...]int{1,2,3,4,5}slice := arr[1:4]for i:= 1; i < len(slice); i++{fmt.Println("slice[%v]=%v", i, slice[i])}//使用for-range方式遍历for i, v:= range slice {fmt.Println(i," ",v)}
}

2.11 map

2.11.1 基本语法

var 变量名 map[keyty]valuetype

//例子:var a map[string]string
//var a map[string]map[string]string

注意:声明是不会分配内存的,初始化需要make,分配后才能赋值和使用

package main
import "fmt"func main() {//方式一var a map[string]stringa = make(map[string]string,10) //make分配空间a["no1"] = "joke"a["no2"] = "sandy"fmt.Println(a)//方式二b := make(map[string]string)b["no1"] = "hehe"fmt.Println(b)//方式三c = map[string][string]{"no1" : "wj","no2" : "wjj"}setStu := make(map[string]map[string]string)setStu["stu1"] = make(map[string]string,3)setStu["stu1"]["name"] = "tome"setStu["stu1"]["sex"] = "man"setStu["stu1"]["age"] = "16"fmt.Println(setStu)fmt.Println(setStu["stu1"])fmt.Println(setStu["stu1"]["name"])//map的keyty不可以重复,如果重复以最后一个为准//map里面是无序的
}

2.11.2 map的增删改查

package main
import "fmt"func main() {var a map[string]stringa = make(map[string]string,10)a["no1"] = "joke"a["no2"] = "sandy"fmt.Println(a)//改//key已存在a["no1"] = "wj"fmt.Println(a)//删除//当指定的key不存在时,既不删除也不报错//如果要一次性删除完,可以遍历所有key逐个删除,或者采用map = make(...),make一个新的空间,让原来的成为垃圾,被gc回收-》 a = make(map[string]string)delete(a,"no1")//查找val,ok := a["no1"]if ok{fmt.Println("找到了欸")}else{fmt.Println("没有欸")}}

2.11.3 map的遍历

package main
import "fmt"func main() {var a map[string]stringa = make(map[string]string,10)a["no1"] = "joke"a["no2"] = "sandy"a["no3"] = "bj"fmt.Println(a)for i,v := range a {fmt.Printf("i=%v v=%v\n",i,v)}setStu := make(map[string]map[string]string)setStu["stu1"] = make(map[string]string,3)setStu["stu1"]["name"] = "tome"setStu["stu1"]["sex"] = "man"setStu["stu1"]["age"] = "16"for k1, v1 := range setStu {fmt.Println("k1=",k1)for k2, v2 := range v1 {fmt.Printf("\t k2=%v v2=%v",k2,v2)}fmt.Println()}
}

2.11.4 map切片

package main
import "fmt"func main() {var monster = []map[string]stringmonster = make(map[string]string, 2)if monster[0] == nil {monster[0] = make(map[string]string, 2)moster[0]["name"] = ["吴青峰"]moster[0]["age"] = ["600"]}if monster[1] == nil {monster[0] = make(map[string]string, 2)moster[0]["name"] = ["li青峰"]moster[0]["age"] = ["700"]}//动态增加newMonster := map[string]string{"name" : "老刘","age"  : "600",}monster = append(monster,newMonster)
}

2.11.5 排序

package main
import ("fmt""sort")
func main() {map1 := make(map[int]int,10)map1[1] = 13map1[7] = 12map1[6] = 14map1[3] = 122map1[2] = 1111//先将map的key放入切片//对切片排序//遍历切片,然后按照key来输出map的值var key []intfor k,_ := range map1 {keys = append(keys,k)}sort.Ins(keys)fmt.Println(keys)for _, k := range keys{fmt.Println(map1[k])}
}

2.11.6 使用细节

1)map是引用类型,一个函数接受map,修改后,原map的值也会改

2)map的容量达到后,再让map增加元素,会自动扩容,并不会发生panic,其能动态增长

3)map的value也经常使用struct类型

2.12 struct结构体

2.12.1 快速入门

package main
import "fmt"//结构体名大写公有,小写私有
//如若在结构体中声明了指针、slice、map则零值为nil,需要make才能分配空间使用
type Cat struct {Name stringAge int}func main() {var cat1 Catcat1.Name = "blank"cat1.Age = 16var c4 Cat = Cat{"fadsf" , 16}//创建一个指针var c2 *Cat = new Cat)//正常来写为 (*c2).Name = "fadsf"c2.Name = "dsfads" //编译器自动在底层转为*c2fmt.Println(*c3)var c3 *Cat = &Cat{} //var c3 *Cat = &Cat{"fadsf" , 16}c3.Name = "fadsdaf"  //编译器自动在底层转为*c2fmt.Println(*c3)
}

2.12.2 使用细节

1)结构体里面的属性内存都是连续的分布(其中指针的地址为连续,但是指向的空间不一定连续)

2)两个结构体相互转换时候,两者的类型以及成员变量要全部相同

3)结构体进行type重新定义(相当于取别名),golang认为是新的数据类型,可以进行强转

stu = Studnet(stu1)

2.12.3 方法

1)方法的声明和调用

type A struct {Num int
}func (a A)test() {fmt.Println(a.Num)
}

🥰func(a A) test() {} 表示 A 结构体有一种放法,名为 test

🥰(a A) 体现了test方法是和A 类型绑定的

举例:

package main
import "fmt"type Person struct {Name string
}func (p Person) test() {fmt.Println("test() name",p.Name)
}func main() {var p Personp.Name = "zhangsna"p.test() //test()方法只能由Person对象调用(&p).test()//同样会调用test函数,同样会在test函数里拷贝p,即 p.test()==(&p).test(),若用(&p).test()改变其中的值,而外部的p依然没有改变/*若有func (p *Person) test() {fmt.Println("test() name",p.Name)} 则可以改变main函数p的值但p.test()还是(&p).test()还是一样的作用*/
}

😴

func (a A)test() {fmt.Println(a.Num)
}
//其中 A可以是结构体也可以是其他数据类型
//若想调用此方法,需要相应的数据类型的变量

2.12.4 工厂模式

说明:当前包里面的声明的结构体首字母为小写,而又需要再其他包,如main包里面创建这个包的实例,则需要引入工厂模式。

实例:

package mainimport ("fmt""go_code/factory/model"
)func main() {var stu = model.NewStudent("wj",88)fmt.Println(stu)
}  

package model:

package modeltype student struct {Name stringAge int
}//由于student为小写,因此想在其他包里使用只能用工厂模式func NewStudent(n string, s int) *student{return &student{      //返回一个指针,即这个空间都可以用Name : n,Age : s,}}

🔔同样倘若结构体里有小写的成员变量,则也需要提供一个方法

例子:

package modeltype student struct {Name stringage int
}func (s *student) Getage() int {  //得到小写变量的方法return s.age
}

2.13 面向对象

2.13.1 快速入门

package main
import("fmt"
)type Account struct {AccountNo stringPwd stringBalance float64
}//存款
func (account *Account) Deposite(money float64, pwd string) {if pwd != account.Pwd {fmt.Println("你输入的密码错误~~")return}if money <= 0|| money >= account.Balance {fmt.Println("你输入的存款金额错误~~")return}account.Balance -= moneyfmt.Println("取款ok~~")
}func (account *Account) Query(pwd string) {if pwd != account.Pwd {fmt.Println("密码错误~~~")}fmt.Println("账号余额为:",account.Balance)
}func main() {account := Account{AccountNo : "sadfasd",Balance : 1000.6,Pwd : "12345",}account.Query("12345")
}

2.13.2 封装

1)隐藏细节

2)可以对数据进行验证,保证安全合理

3)对结构体中属性变量首字母小写进行封装

4)通过方法, 包 实现封装

5)通过一个首字母大写的Set方法对属性判断赋值

func (var结构体类名) Setxxx(){}

6)通过一个首字母大写的Get方法获取其属性

func (var结构体类名) Getxxx(){}

7)Golang中没有特别强调封装

快速案例

package model
import("fmt"
)type person struct {Name string             //公开的属性Namesex string				//要采用Set和Get方法age int
}func NewPerson(name string) *person {     //采用工厂函数,才能在其他包里使用,相当于构造函数return &person{Name = name,}
}
func (p *person) SetAge(age int){if age > 0&&age < 150 {p.age = age}else{fmt.Println("年龄范围不对")}
}
func(p *person) GetAge() int{return p.age
}

main 包

package main
import ("fmt""go_code/chapter09/model"
)func main() {p := model.person("smith")p.SetAge(18)fmt.Println(p.Name,"age = " , p.GetAge)
}

2.13.3 继承

1)基本语法

type Goods struct {Name stringPrice int
}type Book struct {Goods // 这里就是嵌套匿名结构体GoodsWriter string
}

2)快速入门案例

package main
import("fmt"
)type Student struct {Name stringAge intScore int
}func(stu *Student) ShowInfo(){fmt.Println(stu.Name,stu.Age,stu.Score)
}
func (stu *Student) SetScore(score int) {stu.Score = score
}type Pupil struct{Student     //嵌入Student匿名结构体名
}func (p *Pupil) testing() {fmt.Println("小学生的方法")
}type Graduate struct {Student     //嵌入Student匿名结构体名
}
func (p *Graduate) testing() {fmt.Println("大学生的方法")
}func main() {pupil := &Pupil{}pupil.Student.Age = 8pupil.testing()
}

3)注意

①结构体可以使用嵌套匿名结构体所有的字段和方法,即:首字母大小写字段和方法都可以使用

//b.A.name = "fasd"  == b.name   前提是b中没有name这个变量  

③结构体可以嵌入多个匿名结构体,若其中有相同的方法名或者属性,则需要指明匿名结构体来区分

④如果一个struct嵌套了一个有名结构体,这种模式就是组合,则在访问组合的结构体的字段或者方法,需要带上结构体名

type D struct{Name string
}
type B struct{d D
}
func main() {var b Bb.d.Name =" sdf"  //这里必须带上匿名结构体名
}

⑤嵌套结构体后,可以在创建结构体变量时,指定各个匿名结构体字段的值

type D struct{Name string
}
type H struct{Sex string
}
type B struct{DH
}
func main() {var b Bb = B{D{Name : "fads",},H{Sex : "fasd",}}
}
type D struct{Name string
}
type H struct{Sex string
}
type B struct{*D*H
}
func main() {var b Bb = B{&D{Name : "fads",}&H{Sex : "fasd",}}fmt.Println(*b.D,*b.H)
}

3)多重继承

type D struct{Name string
}
type H struct{Sex string
}
type B struct{    //多重继承DH
}
func main() {var b Bb = B{D{Name : "fads",},H{Sex : "fasd",}}
}

✨为了保证代码的简洁性,建议不使用多重继承

2.13.4 接口

1)基本语法

type Usb interface{   //接口定义//声明两个方法Start()Stop()
}type Phone struct {}type Camera struct{}func (p Phone) Start() {fmt.Println("work.....")
}
func (p Phone) Stop() {fmt.Println("over.....")
}func (c Camera) Start() {fmt.Println("work.....")
}
func (c Camera) Stop() {fmt.Println("over.....")
}func Computer struct {}
//接收一个Usb接口类型的变量
func (c Computer) Working (usb Usb){usb.Start()usb.Stop()
}func main() {computer := Computer{}phone := Phone{}camera := Camera{}computer.Working(phone)
}

2)Golang中的接口,不需要显式的实现。只要一个变量,含有接口类型中所有的方法,那么这个变量就实现了这个接口。因此Golang中没有implement这样的关键字

3)接口注意事项和细节

package mainimport("fmt"
)
type AInterface interface{Say()
}type Stu struct {Name string
}
//①
func (stu Stu) Say() {fmt.Println("stu Say()")
}//②
type interger int
func (i integer) Say() {fmt.Println("integer Say i =",i)
}//③
type BInterface interface{Hello()
}
type Moster struct{}
func(m Monster) Hello() {fmt.Println("hello...")
}
func(m Monster) Say() {fmt.Println("say hello...")
}
func main(){//①接口本身不能创建实例,但是可以指向一个实现该接口的自定义类型的变量var stu Stu//var a AInterface = stu  这样就是错误var a AInterface = stu   //√a.Say()//②只要是自定义的数据类型,就可以实现接口,不仅仅是结构体类型var i integer = 20var b AInterface = ib.Say()//③一个自定义类型可以实现多个接口var monster Monstervar a2 AInterface = monstervar b2 BInterface = monstera2.Say()b2.Hello()
}

🤖Golang中接口中不能有任何变量

👽一个接口(比如A接口)可以继承多个别的接口(比如B,C接口),这时候要实现A接口,则必须将B,C接口的方法也实现

package mainimport("fmt"
)
type AInterface interface{Say()
}
type BInterface interface{Hello()
}
type CInterface interface{AInterfaceBInterfacetest()
}
type Stu struct {}
func (stu Stu)Say(){}
func (stu Stu)Hello(){}
func (stu Stu)test(){}
func main() {var stu Stuvar c CInterface = stua.test()
}

👹interface是一个引用类型,如若未初始化,则未nil

👾空接口interface{},可以把任何变量赋给interface

4)经典案例:给切片排序

package mainimport("fmt""math/rand""sort"                       //调用sort中 interface接口
)//声明Hero结构体
type Hero struct{Name stringAge int
}
//声明一个Hero结构体切片
type HeroSlice []Hero//如下:实现Inerface接口
func (hs HeroSlice) Len()int{return len(hs)
}
//Less方法就是决定你使用了什么标准进行排序
//1.按Hero的年龄从小到大排序
func (hs HeroSlice) Less(i, j int) bool {return hs[i].Age < hs[j].Age               //升序,若返回true 就调用Swap进行排序
}
func (hs HeroSlice) Swap(i, j int) {temp := hs[i]hs[i] = hs[j]hs[j] = temp
}func main() {var heroes HeroSlicefor i := 0; i < 10; i++{hero := Hero{Name : fmt.Sprintf("英雄~%d",rand.Intn(100)),Age : rand.Intn(100),}heroes = append(heroes,hero)}for _,v := range heroes{fmt.Println(v)}//排序后fmt.Println("排序后..")sort.Sort(heroes)for _,v := range heroes{fmt.Println(v)}
}

2.13.5 继承和结构体的区别

1)接口可以当作继承的补充

2)继承的价值在于代码的复用性和可维护性

3)接口的价值在于设计好规范(方法),让其他自定义的类型去实现它

2.13.6 多态

1)多态参数

如在接口中的例子,usb既能接收phone的变量也能接收从camera的变量

2)多态数组

package mainimport("fmt"
)
type Usb interface{   //接口定义//声明两个方法Start()Stop()
}type Phone struct {Name string
}type Camera struct{Name string
}func (p Phone) Start() {fmt.Println("手机work.....")
}
func (p Phone) Stop() {fmt.Println("手机over.....")
}func (c Camera) Start() {fmt.Println("相机work.....")
}
func (c Camera) Stop() {fmt.Println("相机over.....")
}func main() {//定义一个Usb接口数组,可以存放Phone和Camear的结构体变量//这里就是多态数组var usbArr [3]UsbusbArr[0] = Phone{"小米"}usbArr[1] = Phone{"华为"}usbArr[2] = Camera{"索尼"}for i := 0; i < len(usbArr); i++{usbArr[i].Start()usbArr[i].Stop()}fmt.Println(usbArr)
}
//结果
/*  
手机work.....
手机over.....
手机work.....
手机over.....
相机work.....
相机over.....
[{小米} {华为} {索尼}]
*/

②类型断言

//例一
package mainimport("fmt"
)type Point struct{x inty int
}
func main() {var a interface{}var point Point = Point{1,2}a = point //truevar b Point// b = a  为错误写法b =a.(Point)   //将a转换,及判断a是否未指向Point的变量,如果是就转换成Point类型,相反编译器报错fmt.Println(b)//类型断言2var x interface{}var b2 float64 = 1.1x = b2//检测是否错误if y, ok := x.(float32); ok{fmt.Println("success")fmt.Println("y= ", y)}else {fmt.Println("fail")}fmt.Println("继续执行......")
}

例二

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qQJk3ThN-1635348855477)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211025222002348.png)]

2.14 文件操作

2.14.1基本介绍

1)流:数据在数据源(文件)和程序(内存)之间经历的路径

输入流:数据从数据源(文件)到程序(内存)的路径

输出流:数据从程序(内存)到数据源(文件)的路径

2)os.File封装所有文件相关操作,“os”为一个包,File为结构体

例如:func Open 和 func Close使用

package mainimport ("fmt""os"
)func main(){//打开文件//file  叫file对象//file  叫file指针//file  叫file文件句柄file, err := os.Open("d:/test.txt")  //如果不出错需要在相应位置有此文件if err != nil {fmt.Println("open file err=",err)}fmt.Println("file=",file)//关闭文件err = file.Close()if err != nil {fmt.Println("close file err=",err)}
}

2.14.2 读取文件

1)读取文件内容并显示在终端(带缓冲区的方式)

package mainimport ("fmt""os""bufio""io"
)
func main(){//打开文件file, err := os.Open("d:/test.txt")  if err != nil {fmt.Println("open file err=",err)}defer file.Close()  //及时关闭file句柄,否则会有内存泄漏//创建一个 *Reader,是带缓冲的/*const {defaultBufSize = 4096  //默认的缓冲区为4096}*/reader := bufio.NewReader(file)//循环的读取文件的内容for{str, err := reader.ReadString('\n') //读到一个"\n""就结束了,str存放内容,err存放错误信息if err == io.EOF{  //表示文件末尾break}fmt.Print(str)}fmt.Println("读取文件结束~~~~")
}

2)一次性打开(文件小,若文件大则会效率低)

package mainimport ("fmt""io/ioutil"
)
func main(){file := "d:/test.txt"content, err := ioutil.ReadFile(file)    //content是[]byteif err != nil {fmt.Printf("read file err=%v",err)}fmt.Println(string(content))
}

2.14.3 创建文件并写入内容

1)基本介绍

func OpenFile(name string, flag int, perm FileMode) (file *File, err error)

说明:os.OpenFile是一次性打开文件的方法,他会使用指定的选项、指定的模式打开指定名称的文件。

第二个参数:文件打开模式(可以组合)

第三个参数:权限控制

2)案例

//Constants包
const (O_RDONLY int = syscall.O_RDONLY // 只读模式打开文件O_WRONLY int = syscall.O_WRONLY // 只写模式打开文件O_RDWR   int = syscall.O_RDWR   // 读写模式打开文件O_APPEND int = syscall.O_APPEND // 写操作时将数据附加到文件尾部O_CREATE int = syscall.O_CREAT  // 如果不存在将创建一个新文件O_EXCL   int = syscall.O_EXCL   // 和O_CREATE配合使用,文件必须不存在O_SYNC   int = syscall.O_SYNC   // 打开文件用于同步I/OO_TRUNC  int = syscall.O_TRUNC  // 如果可能,打开时清空文件
)

①//创建一个新文件,写入内容5句“hello world”

package mainimport ("fmt""bufio""os"
)func main() {//1.打开文件filePath := "d:/abc.txt"file, err := os.OpenFile(filePath, os.O_WRONLY | os.O_CREATE, 0666)if err != nil {fmt.Printf("open file err=%v\n",err)return}//及时关闭file句柄defer file.Close()//准备写入内容str := "hello,world\n"//写入时,使用带缓存的 *Writerwriter := bufio.NewWriter(file)  //返回一个writerfor i := 0; i < 5; i++{writer.WriteString(str)}//因为writer是带缓存,因此在调用WriterString方法时候,其实内容先写入缓存的。//因此要调用Flush方法,将缓冲的数据真正写入到文件中!!!!writer.Flush()
}

②//打开一个文件,将文件的原来的内容覆盖为5句“blablablabla”

package mainimport ("fmt""bufio""os"
)func main() {//1.打开文件filePath := "d:/abc.txt"file, err := os.OpenFile(filePath, os.O_WRONLY | os.O_TRUNC, 0666)  //os.O_TRUNC打开文件并清空内容if err != nil {fmt.Printf("open file err=%v\n",err)return}//及时关闭file句柄defer file.Close()//准备写入内容str := "blablablabla\n"//写入时,使用带缓存的 *Writerwriter := bufio.NewWriter(file)  //返回一个writerfor i := 0; i < 5; i++{writer.WriteString(str)}//因为writer是带缓存,因此在调用WriterString方法时候,其实内容先写入缓存的。//因此要调用Flush方法,将缓冲的数据真正写入到文件中writer.Flush()
}

③//追加内容“ABC,哈哈哈”

package mainimport ("fmt""bufio""os"
)func main() {//1.打开文件filePath := "d:/abc.txt"file, err := os.OpenFile(filePath, os.O_WRONLY | os.O_APPEND, 0666)//os.O_APPEND写操作时将数据附加到文件尾部if err != nil {fmt.Printf("open file err=%v\n",err)return}//及时关闭file句柄defer file.Close()//准备写入内容str := "ABC,哈哈哈\n"//写入时,使用带缓存的 *Writerwriter := bufio.NewWriter(file)  //返回一个writerfor i := 0; i < 5; i++{writer.WriteString(str)}//因为writer是带缓存,因此在调用WriterString方法时候,其实内容先写入缓存的。//因此要调用Flush方法,将缓冲的数据真正写入到文件中writer.Flush()
}

④//打开一个存在的文件,将原来的内容读出显示在终端

package mainimport ("fmt""bufio""os""io"
)func main() {//1.打开文件filePath := "d:/abc.txt"file, err := os.OpenFile(filePath, os.O_RDONLY | os.O_APPEND, 0666)// os.O_RDONLY只读模式打开文件,os.O_APPEND写操作时将数据附加到文件尾部if err != nil {fmt.Printf("open file err=%v\n",err)return}//及时关闭file句柄defer file.Close()//先读取原来文件的内容,并显示在终端reader := bufio.NewReader(file)for {str, err := reader.ReadString('\n')if  err == io.EOF{break}fmt.Print(str)}//准备写入内容str := "ABC,wj\n"//写入时,使用带缓存的 *Writerwriter := bufio.NewWriter(file)  //返回一个writerfor i := 0; i < 5; i++{writer.WriteString(str)}//因为writer是带缓存,因此在调用WriterString方法时候,其实内容先写入缓存的。//因此要调用Flush方法,将缓冲的数据真正写入到文件中writer.Flush()
}

2.14.4 拷贝文件

package mainimport ("fmt""io/ioutil"
)
func main() {
//1.将abc.txt文件读取内容
//2.将读取到的内容写入到kkk.txtfile1Path := "d:/abc.txt"file2Path := "d:/kkk.txt"data, err := ioutil.ReadFile(file1Path)if err != nil {//说明读取文件有错误fmt.Println("read file err=%v", err)return}err := ioutil.WriteFile(file2Path, data, 0666)if err != nil{fmt.Printf("write file error = ", err)}
}

2)拷贝文件(图片/电影/mp3)

package mainimport ("fmt""bufio""os""io"
)//自己编写一个函数,接收两个文件的路径
func CopyFile(dstFileName string, srcFileName string)(written int64, err error){  srcfile, err := os.Open(srcFileName)if err != nil {fmt.Printf("open file err = %v\n", err)}//通过srcfile,获取Readerreader := bufio.NewReader(srcfile)defer srcfile.Close()//打开desFileNamedstFile,  err := os.OpenFile(dstFileName, os.O_WRONLY | os.O_CREATE, 0666)if err != nil {fmt.Printf("open file err=%v\n", err)return}//通过dstFile,获取到Writerwriter := bufio.NewWriter(dstFile)defer dstFile.Close()return io.Copy(writer, reader)//io包里面的Copy函数
}
func main() {srcFile := "d:/test/picture.png"dstFile := "d:/abc.png"CopyFile(dstFile, srcFile)
}

2.14.5 统计不同类型的字符

package mainimport ("fmt""bufio""os""io"
)
type CharCount struct {ChCount int  //记录英文字母NumCount int //记录数字的个数SpaceCount int //记录空格的个数OtherCount int //记录其他字符的个数
}func main() {//打开一个文件,创建一个Reader//没读取一行,就去统计改行有多少个英文、数字、空格和其他字符//然后将结果保存到一个结构体中fileName := "d:/abc.txt"file, err := os.Open(fileName)if err != nil {fmt.Printf("err = %v\n", err)return}defer file.Close()//定义一个CharCount实例var count CharCount//创建一个Readerreader := bufio.NewReader(file)//开始循环读取fileName的内容for {str, err := reader.ReadString('\n')if err == io.EOF{break}}//遍历str,进行统计for _, v = range str {fmt.Println(str)}
}

2.14.5 统计文件有多少个英文、数字、空格和其他字符

package mainimport ("fmt""bufio""os""io"
)
type CharCount struct {ChCount int  //记录英文字母NumCount int //记录数字的个数SpaceCount int //记录空格的个数OtherCount int //记录其他字符的个数
}func main() {//打开一个文件,创建一个Reader//没读取一行,就去统计改行有多少个英文、数字、空格和其他字符//然后将结果保存到一个结构体中fileName := "d:/abc.txt"file, err := os.Open(fileName)if err != nil {fmt.Printf("err = %v\n", err)return}defer file.Close()//定义一个CharCount实例var count CharCount//创建一个Readerreader := bufio.NewReader(file)//开始循环读取fileName的内容for {str, err := reader.ReadString('\n')if err == io.EOF{     //读到文件末尾退出break}//遍历str,进行统计for _, v := range str {switch  {        //这里不用v来匹配,而是当作if分支结构语句case v >= 'a' && v <= 'z':fallthrough //穿透,即强制执行下一行语句case v >= 'A' && v <= 'Z':count.ChCount++case v == ' ' || v == '\t':count.SpaceCount++  case v >= '0' && v <= '9':count.NumCount++default :count.OtherCount++       }}}//输出统计个数fmt.Printf("字符的个数为=%v 数字个数为=%v 空格个数为=%v 其他字符个数为=%v",count.ChCount, count.NumCount,  count.SpaceCount, count.OtherCount)
}

2.14.6 flag包来解析命令行参数

package mainimport ("fmt""flag"
)func main ()  {var user stringvar pwd stringvar host stringvar port int//user就是接收用户命令行中输入的 -u 后面的参数值flag.StringVar(&user,"u","","用户名,默认为空")flag.StringVar(&pwd,"pwd","","密码,默认为空")flag.StringVar(&host,"host","localhost","主机名,默认为空")flag.IntVar(&port,"port",3306,"端口号,默认为3306")//转换flag.Parse()//输出结果fmt.Printf("user=%v pwd=%v host=%v port=%v",user,pwd,host,port)
}

终端: D:\Go代码\src\go_code\chapter12> go build -o test.exe test.go

D:\Go代码\src\go_code\chapter12> test.exe -u root -pwd 132465 -host
127.0.0.5 -port 8080

2.15 测试函数是否执行正确

//cal_test文件
package main
import(_"fmt""testing" //引入go中testing框架
)//编写测试案例,去测试addUpper是否正确
func TestAddUpper(t *testing.T)  {//调用res := addUpper(10)if res != 55 {t.Fatalf("AddUpper(10) 执行错误,期望值=%v 实际值=%v\n", 55, res)}//如果正确,输出日志t.Logf("AddUpper(10) 执行正确....")
}
//被测试文件
package main//一个被测试函数
func addUpper(n int) int{res := 0for i := 1; i <= n - 1; i++ {res += i}return res
}

结果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YkkA4x5D-1635348855479)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211027233258247.png)]

函数执行原理图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0av1JAxl-1635348855481)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211027232937740.png)]

注意事项:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8oVMe5YA-1635348855483)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211027233031706.png)]

Count int //记录空格的个数
OtherCount int //记录其他字符的个数
}

func main() {
//打开一个文件,创建一个Reader
//没读取一行,就去统计改行有多少个英文、数字、空格和其他字符
//然后将结果保存到一个结构体中
fileName := “d:/abc.txt”
file, err := os.Open(fileName)
if err != nil {
fmt.Printf(“err = %v\n”, err)
return
}
defer file.Close()
//定义一个CharCount实例
var count CharCount
//创建一个Reader
reader := bufio.NewReader(file)

//开始循环读取fileName的内容
for {str, err := reader.ReadString('\n')if err == io.EOF{     //读到文件末尾退出break}//遍历str,进行统计for _, v := range str {switch  {        //这里不用v来匹配,而是当作if分支结构语句case v >= 'a' && v <= 'z':fallthrough //穿透,即强制执行下一行语句case v >= 'A' && v <= 'Z':count.ChCount++case v == ' ' || v == '\t':count.SpaceCount++  case v >= '0' && v <= '9':count.NumCount++default :count.OtherCount++       }}
}//输出统计个数
fmt.Printf("字符的个数为=%v 数字个数为=%v 空格个数为=%v 其他字符个数为=%v",
count.ChCount, count.NumCount,  count.SpaceCount, count.OtherCount)

}


### 2.14.6 flag包来解析命令行参数```go
package mainimport ("fmt""flag"
)func main ()  {var user stringvar pwd stringvar host stringvar port int//user就是接收用户命令行中输入的 -u 后面的参数值flag.StringVar(&user,"u","","用户名,默认为空")flag.StringVar(&pwd,"pwd","","密码,默认为空")flag.StringVar(&host,"host","localhost","主机名,默认为空")flag.IntVar(&port,"port",3306,"端口号,默认为3306")//转换flag.Parse()//输出结果fmt.Printf("user=%v pwd=%v host=%v port=%v",user,pwd,host,port)
}

终端: D:\Go代码\src\go_code\chapter12> go build -o test.exe test.go

D:\Go代码\src\go_code\chapter12> test.exe -u root -pwd 132465 -host
127.0.0.5 -port 8080

2.15 测试函数是否执行正确

//cal_test文件
package main
import(_"fmt""testing" //引入go中testing框架
)//编写测试案例,去测试addUpper是否正确
func TestAddUpper(t *testing.T)  {//调用res := addUpper(10)if res != 55 {t.Fatalf("AddUpper(10) 执行错误,期望值=%v 实际值=%v\n", 55, res)}//如果正确,输出日志t.Logf("AddUpper(10) 执行正确....")
}
//被测试文件
package main//一个被测试函数
func addUpper(n int) int{res := 0for i := 1; i <= n - 1; i++ {res += i}return res
}

结果:

在这里插入图片描述

函数执行原理图:

在这里插入图片描述

注意事项:
在这里插入图片描述

查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. Android的布局管理器与java中的实现方式不同

    1. Android的布局管理器: 在Android中,提供了五种布局管理器,主要通过继承ViewGroup来实现。 LinearLayout 线性布局 TableLayout 表格布局 RelativeLayout 相对布局 FrameLayout 帧布局 AbsoluteLayout 绝对布局 他们的继承关系如下: java.lang.Objectandroid.view.Vie…...

    2024/4/30 19:36:08
  2. Python 3.10 版本号引发的 bug

    2021年10月&#xff0c;Python 的 3.10 版本正式发布。但之前的 Python 3.6、3.7、3.8、3.9 子版本都为个位数&#xff0c;程序员可能习惯了这种版本格式&#xff0c;因此编写涉及版本号的代码时&#xff0c;未曾考虑到 3.10 版本。 本位列举一些相关bug&#xff0c;已在笔者的…...

    2024/4/21 17:49:14
  3. Python文件的操作处理(一看就会)

    1.1使用open()函数打开文件夹 在读取一个文件的内容之前&#xff0c;需要先打开这个文件。在Python程序中可以通过内置函数open()来打开一个文件程序中&#xff0c;&#xff0c;并用相关的方法读或写文件文件中的内容以供程序的处理和使用&#xff0c;同时可以将文件看作Python…...

    2024/4/30 22:33:55
  4. 在数据库操作中通常有如下的插入语句:insert into user (id,name,age) values (‘1‘,‘张三‘,‘18‘),使用反射完成 SQL 的拼接。 Student stud

    题目&#xff1a;在数据库操作中通常有如下的插入语句&#xff1a;题目描述&#xff1a;核心代码如下&#xff1a;代码运行结果如下&#xff1a;题目描述&#xff1a; 在数据库操作中通常有如下的插入语句&#xff1a;insert into user (id,name,age) values (‘1’,‘张三’,‘…...

    2024/4/21 17:49:13
  5. 自定义Camera系列之:GLSurfaceView + Camera2

    一、前言 假如你要使用 OpenGL ES 来渲染相机的话,使用 GLSurfaceView 将是一个很常用的选择。 这里介绍 GLSurfaceView + Camera2 的组合。 如果你对 Camera2 的相关类和接口还不熟悉,可以先看看下面这些介绍:CameraManager详解 CameraDevice详解 CameraCharacteristics详解…...

    2024/4/21 17:49:11
  6. 任意输入一个正整数,求各位数字之和。例如:输入12690,输出:“12690各位数字之和为18”

    ...

    2024/4/21 17:49:10
  7. bomblab CSAPP(深入理解计算机系统)

    CSAPP_lab之bomblab 文章目录CSAPP_lab之bomblab前言一、phase_1二、phase_2三、phase_3四、phase_4五、phase_5六、phase_6总结前言 bomblab是这我最喜欢的lab之一&#xff0c;主要思路通过反汇编代码找到拆除炸弹的答案。 拆除炸弹总共需要连续输入6次&#xff08;phase_1、…...

    2024/4/30 19:31:36
  8. 10.14日总结

    初步学习概况&#xff1a; python&#xff1a;学习完第五章字典部分&#xff0c; stuff{gold coin:42,arrow:12,rope:1,dagger:1,torch:6} def addto(inventory,addeditems):for x in addeditems:inventory.setdefault(x,0)inventory[x] 1return inventorydef display(invent…...

    2024/4/21 17:49:08
  9. 20211027_配置中心服务功能梳理(@Service+@Contract/@Inject+ServiceLocator/@PostConstruct/静态内部类的使用)

    一、背景 今天在梳理模块代码功能一页纸的时候&#xff0c;发现了工程中的一个子模块功能&#xff0c;大概的功能描述是这样的&#xff1a;“app服务启动后&#xff0c;一个服务(ConfigChangeLintener)通过监听配置中心的变更消息&#xff08;是否开启某功能&#xff09;&#…...

    2024/4/21 17:49:08
  10. 硬件描述语言HDL和汇编语言、c语言的区别

    个人感觉&#xff1a; 硬件描述语言&#xff08;vhdl等&#xff09;&#xff1a;是为了制造cpu&#xff08;类似的芯片&#xff09;&#xff0c;设计人员使用hdl设计和安排寄存器和时序电路如何组合&#xff0c;然后最终会生成门级网表&#xff0c;然后通过相关软件等生成最终物…...

    2024/4/21 17:49:08
  11. 2016级移动应用开发在线测试13-Location、Sensor & Network

    有趣有内涵的文章第一时间送达!喝酒I创作I分享生活中总有些东西值得分享@醉翁猫咪 1. 充分利用智能手机的GPS定位信息,创造了O2O的商业模式,打通了线上与线下的信息流和商流,极大地推动了移动互联网的迅猛发展,下面关于GPS技术描述错误的是() 您的回答为:GPS需要地面基站…...

    2024/4/19 13:56:26
  12. 索引的使用

    1. 验证索引提升查询效率 注&#xff1a;以下的查询语句基于tb_item 表&#xff0c;由黑马提供。本文不提供具体的数据和数据链接。 1.1 根据 id 查询 select * from tb_item where id 1999\G; 上图是上述查询语句的查询结果信息&#xff0c;从执行的时间来看&#xff0c;该…...

    2024/4/20 13:45:35
  13. flume安装教程(欢迎指教)

    flume 安装1.下载并解压 apache-flume-1.6.0-bin.tar.gz2.进入conf3.修改环境变量4.重载环境变量5.检验flume 状态未完待续1.下载并解压 apache-flume-1.6.0-bin.tar.gz tar -zxvf apache-flume-1.6.0-bin.tar.gz2.进入conf cd apache-flume-1.6.0-bin/conf cp flume-env.sh.…...

    2024/4/20 13:45:34
  14. Arduino mega 2560 上传项目总是出错最全解决方案以及串口测试教程

    一&#xff1a;串口识别和驱动安装需要保证准确无误 1.运行arduino mega 2560 首先需要安装串口驱动&#xff0c;这样我们用USB将板子和我们计算机连接的时候&#xff0c;使得我们的计算机能够识别连接的串口并且能够连接上&#xff0c;以便实现程序下载、上传、串口通讯。 注…...

    2024/4/23 12:21:17
  15. 基本Dos操作

    D: #盘符切换 dir #查看当前目录所有文件 cd #切换目录 cd /d E:\目录名 cd .. #返回上一级目录 cls #清理屏幕(clean screen) exit #退出终端 ipconfig #查看电脑ip # 打开应用 calc #打开计算器 mspaint #打开画图工具 not…...

    2024/4/20 7:58:20
  16. Termux-api调用api后没没反应:

    今天玩弄安卓终端&#xff0c;通过f-droid安装的termux&#xff0c;遇到这个调用失败问题在各学习平台网站没有找见答案&#xff01;&#xff01;&#xff01;&#xff0c;在百度贴吧里找见的。。。多亏了这位大哥。&#xff08;写一篇兴许能帮助到感兴趣而遇到这个坑的小伙伴&…...

    2024/4/19 20:12:32
  17. 【优化求解】基于水循环算法WCA求解约束单目标matlab代码

    1 简介 水循环优化算 法 是 由 &#xff28;&#xff41;&#xff44;&#xff49;&#xff25;&#xff53;&#xff4b;&#xff41;&#xff4e;&#xff44;&#xff41;&#xff52;等 人 于&#xff12;&#xff10;&#xff11;&#xff12;年提出&#xff0c;其理论受…...

    2024/4/20 13:45:30
  18. java内部类

    这是我学习Java内部类的笔记 1.为什么使用内部类? 使用内部类最吸引人的原因是&#xff1a;每个内部类都能独立地继承一个&#xff08;接口的&#xff09;实现&#xff0c;所以无论外围类是否已经继承了某个&#xff08;接口的&#xff09;实现&#xff0c; 对于内部类都没有影…...

    2024/4/25 13:43:00
  19. Hadoop的Windows开发环境配置

    将 "软件\Windows依赖\hadoop-3.1.0"目录拷贝到D:\devsoft目录下 把hadoop-3.1.0\bin目录下的 hadoop.dll 和 winutils.exe 放到系统盘的 C:\Windows\System32 下 配置HADOOP_USER_NAME 此电脑->右键 属性-> 高级系统设置->环境变量->新建系统变量 …...

    2024/4/21 17:49:05
  20. Vikings:1 walkthrough

    Vikings&#xff1a;1 walkthrough–vulnhub 假设我们已经得到ssh用户名密码&#xff1a; username&#xff1a;floki password&#xff1a;fm0usboatbuilde7 ssh -l floki 192.168.1.5 readme.txt boat 意思就是说&#xff1a;科拉茨 - 猜想 &#xff08;num&#xff09;&…...

    2024/4/21 17:49:05

最新文章

  1. Win10无法合并分区?尝试以下2种解决方法吧

    若Win10无法合并分区&#xff0c;导致C盘无法扩容&#xff0c;该如何解决呢&#xff1f;本文将介绍如何利用磁盘管理工具和傲梅分区助手轻松解决这个问题&#xff01; 为什么要合并硬盘分区&#xff1f; 合并硬盘分区是指将同一硬盘上的两个分区合并成一个&#xff0c;或者将…...

    2024/4/30 23:27:56
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. 【ARM 嵌入式 C 文件操作系列 20 -- 文件删除函数 remove 详细介绍】

    请阅读【嵌入式开发学习必备专栏 】 文章目录 文件删除函数 remove 文件删除函数 remove 在 C 语言中&#xff0c; 可以使用 remove 函数来删除一个文件&#xff0c;但在删除之前 可能想确认该文件是否存在。 可以使用 stat 函数来检查文件是否存在。 以下是如何实现这个功能…...

    2024/4/30 8:07:49
  4. Java-代理模式

    1、什么是代理模式 代理&#xff1a;自己不做&#xff0c;找别人帮你做 代理模式&#xff1a;在一个原有功能的基础上添加新的功能 分类&#xff1a;静态代理和动态代理 2、静态代理 原有方式&#xff1a;就是将核心业务和服务方法都编写在一起 package com.AE.service;p…...

    2024/4/30 3:49:08
  5. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/4/29 23:16:47
  6. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/4/30 18:14:14
  7. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/4/29 2:29:43
  8. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/4/30 18:21:48
  9. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/4/27 17:58:04
  10. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/4/27 14:22:49
  11. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/4/28 1:28:33
  12. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/4/30 9:43:09
  13. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/4/27 17:59:30
  14. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/4/25 18:39:16
  15. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/4/28 1:34:08
  16. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/4/26 19:03:37
  17. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/4/29 20:46:55
  18. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/4/30 22:21:04
  19. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/4/26 23:04:58
  20. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/4/27 23:24:42
  21. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/4/28 5:48:52
  22. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/4/30 9:42:22
  23. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/4/30 9:43:22
  24. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/4/30 9:42:49
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57