iis7架设网站个人建网站wordpress
iis7架设网站,个人建网站wordpress,开发一个软件需要什么技术,网站这么做301目录 一、判断语句
1.if语句
2.switch语句 二、循环语句
1.传统for循环
2.死循环
3.while模式
4.do-while模式
5.遍历切片
6.遍历map
7.break#xff0c;continue
三、函数#xff0c;指针
1.函数定义
2.匿名函数
3.高阶函数
4.闭包
5.值传递和引用传递 6.…目录 一、判断语句
1.if语句
2.switch语句 二、循环语句
1.传统for循环
2.死循环
3.while模式
4.do-while模式
5.遍历切片
6.遍历map
7.breakcontinue
三、函数指针
1.函数定义
2.匿名函数
3.高阶函数
4.闭包
5.值传递和引用传递 6.指针 四、init函数和defer函数
1.init函数
2.defer函数 3.defer面试题 一、判断语句
1.if语句
package mainimport fmtfunc main() {fmt.Println(请输入你的年龄)var age intfmt.Scan(age)if age 18 {if age 10 {fmt.Println(儿童)} else {fmt.Println(未成年)}} else if age 35 {fmt.Println(青年)} else {fmt.Println(中老年)}
}2.switch语句 可以理解为case的值就是switch的枚举结果 一般来说go的switch的多选一满足其中一个结果之后就结束switch了 package mainimport fmtfunc main() {fmt.Println(请输入你的年龄)var age intfmt.Scan(age)switch {case age 0:fmt.Println(未出生)case age 18:fmt.Println(未成年)case age 35:fmt.Println(青年)default:fmt.Println(中年)}
}我输入一个12我希望它能输出满足的所有条件例如我希望它输出未成年青年 package mainimport fmtfunc main() {fmt.Println(请输入你的年龄)var age intfmt.Scan(age)switch {case age 0:fmt.Println(未出生)fallthroughcase age 18:fmt.Println(未成年)fallthroughcase age 35:fmt.Println(青年)default:fmt.Println(中年)}
} 二、循环语句
1.传统for循环
package mainimport fmtfunc main() {var sum 0for i : 0; i 100; i {sum i}fmt.Println(sum)
}2.死循环
package mainimport (fmttime
)func main() {//每隔1秒打印当前的时间for {time.Sleep(1 * time.Second)fmt.Println(time.Now().Format(2006-01-02 15:04:05)) // 年月日时分秒的固定格式}
}3.while模式
package mainimport fmtfunc main() {//由于golang没有while循环如果需要则是由for循环稍微变化得来i : 0sum : 0for i 100 {sum ii}fmt.Println(sum)
}4.do-while模式
package mainimport fmtfunc main() {//do-while模式就是先执行一次循环体再判断i : 0sum : 0for {sum iiif i 101 {break}}fmt.Println(sum)
}5.遍历切片
package mainimport fmtfunc main() {// 第一个参数是索引第二个参数是值s : []string{os, lee}for index, s2 : range s {fmt.Println(index, s2)}
}6.遍历map
package mainimport fmtfunc main() {//第一个参数就是key第二个就是values : map[string]int{age: 24,price: 1000,}for key, val : range s {fmt.Println(key, val)}
}7.breakcontinue break用于跳出当前循环continue用于跳过本轮循环 三、函数指针 函数是一段封装了特定功能的可重用代码块用于执行特定的任务或计算 函数接受输入参数并产生输出返回值 1.函数定义
package mainimport fmtfunc add(n1 int, n2 int) int {fmt.Println(n1, n2)return n1 n2
}// 参数类型一样可以合并在一起
func add1(n1, n2 int) int {fmt.Println(n1, n2)return n1 n2
}// 多个参数
func add2(numList ...int) {fmt.Println(numList)
}func main() {i : add(1, 2)fmt.Println(i)i2 : add1(1, 2)fmt.Println(i2)add2(1, 2, 3, 4)
}2.匿名函数 匿名函数Anonymous Function是一种没有命名的函数定义。 特点 无名称匿名函数没有显式的名字因此不能像普通函数那样通过名字被调用或在其他地方被引用。内联定义可以在需要使用函数的地方直接定义无需单独的函数声明或定义部分。简洁性特别适合用于一次性使用的简单功能避免了为一个小功能特意命名一个函数的繁琐。可赋值给变量匿名函数可以赋值给一个变量通过变量名来调用此时变量充当了函数的“代理名”。可作为参数或返回值匿名函数可以作为其他函数的参数或返回值这是高阶函数的基础。访问外部变量匿名函数可以访问其定义时所在作用域内的变量形成闭包。 package mainimport fmtfunc main() {var add func(a, b int) int {return a b}fmt.Println(add(1, 2))
}3.高阶函数 高阶函数是指可以接收一个或多个函数作为参数或者返回一个函数作为结果的函数。这样的函数提升了代码的抽象层次使得我们能够以更通用和灵活的方式处理函数从而简化代码并促进复用。 package mainimport fmtfunc ApplyToIntList(list []int, f func(int) int) []int {result : make([]int, len(list))for i, v : range list {result[i] f(v)}return result
}func main() {// 编写一个高阶函数接受一个整数列表和一个处理函数作为参数返回处理函数对该列表所有元素应用后的结果列表。 示例代码squareAll : ApplyToIntList([]int{1, 2, 3, 4}, func(x int) int { return x * x })fmt.Println(squareAll) // 输出[1, 4, 9, 16]
}4.闭包 闭包是一种特殊的函数是该函数和其周围环境即自由变量组成的绑定关系。当一个函数访问其外部作用域中的变量时即使在其外部作用域已经结束函数返回后只要闭包还在使用这些变量仍会保持活跃。闭包常与高阶函数一起使用作为高阶函数的返回值或参数。 package mainimport fmtfunc counter() func() int {count : 0return func() int {countreturn count}
}func main() {// counter高阶函数func() int是闭包counterFunc : counter()fmt.Println(counterFunc()) // 输出1fmt.Println(counterFunc()) // 输出2fmt.Println(counterFunc()) // 输出3// 创建另一个计数器实例anotherCounter : counter()fmt.Println(anotherCounter()) // 输出1
}5.值传递和引用传递
值传递函数接收到的是实参的副本对形参的修改不影响实参。引用传递函数接收到的是实参的引用对形参的修改直接影响实参。 稍微了解过编程的都应该知道计算机上显示的所有的数据都是在内存里面的 也就是说我们定义的一个变量它也在内存里面有一块地 正常情况下来说函数的参数是将之前那块地复制了一份出来 如何证明呢 package mainimport fmtfunc add(num int) {fmt.Println(num) // 可以看到这个n的内存地址和外面num的内存地址是明显不一样的num 2 // 这里的修改不会影响外面的num
}func main() {num : 20fmt.Println(num)add(num)fmt.Println(num) // 20
}也就是说在函数里面不管怎么修改这个参数都不会影响原来的那个值 但是如果我需要在函数体内修改变量的值呢 这就需要用到引用传递了 我们直接将变量的内存地址传递进去 package mainimport fmtfunc add(num *int) {fmt.Println(num) // 内存值是一样的*num 2 // 这里的修改会影响外面的num
}func main() {num : 20fmt.Println(num)add(num)fmt.Println(num) // 成功修改 2
}6.指针
指针是一种特殊的数据类型它存储的是另一个变量的内存地址。简单来说指针就是一个变量的“地址标签”通过这个标签程序可以直接访问和操作该变量在内存中的值。理解指针的关键在于以下几个方面 内存地址与值 变量在内存中占据一块特定的空间每个变量都有一个唯一的内存地址。变量的值就是存储在这块内存空间中的数据。 指针变量声明 声明一个指针变量时使用星号 * 作为前缀来表示这是一个指针类型并指定它指向的值的类型。声明格式为 var pointerName *typeName其中 pointerName 是指针变量名typeName 是它所指向的值的类型。例如var xPtr *int 声明了一个名为 xPtr 的指针它指向一个整型int变量。 指针初始化与赋值 初始化指针时通常使用取地址运算符 来获取一个变量的内存地址并将其赋值给指针变量。例如x : 10; xPtr : x这里 xPtr 被初始化为变量 x 的内存地址。 解引用与指针操作 使用指针访问或修改其指向的值时需要通过解引用操作。解引用是使用指针变量前的星号 * 运算符来实现的。例如*xPtr 20 会通过 xPtr 修改其指向的整型变量的值为 20。同样y : *xPtr 会通过 xPtr 获取其指向的值并将其赋值给变量 y。 指针运算限制 Go语言中的指针不能进行算术运算如加减法这是与C语言的重要区别。试图对指针进行算术运算会在编译阶段报错。 指针用途 提高性能通过指针传递大对象时避免了值拷贝提高了效率。修改函数外部变量函数参数为指针时函数内部可以修改外部变量的值。实现动态数据结构如链表、树等节点间通过指针连接。回调函数和闭包闭包常常需要捕获并保持对外部变量的引用这通常是通过指针实现的。 我们只需要记住 是取地址*是解引用获取这个地址指向的值 四、init函数和defer函数
1.init函数 init函数用于在程序启动时执行一些初始化任务如设置默认值、打开数据库连接、加载配置等。 init函数具有以下特点 无须显式调用init函数由Go运行时自动调用无需在代码中显式调用。无参数、无返回值init函数没有参数也不返回任何值。可出现在任何包、任何源文件中一个包package中可以有多个init函数分布在不同的源文件中。 执行顺序init函数的执行顺序遵循以下规则 包内顺序同一个包中init函数按照它们在源文件中出现的顺序依次执行。如果一个源文件中有多个init函数那么它们按照从上到下的顺序执行。包间顺序不同包之间的init函数按照包导入的依赖关系进行排序。首先执行被导入包间接或直接的所有init函数然后才执行导入包本身的init函数。具体而言如果包A导入了包B那么包B中的所有init函数将在包A中的所有init函数之前执行。主包main包主包包含main()函数的包的init函数总是在所有非主包的init函数之后执行。 2.defer函数 defer语句用于延迟执行一个函数调用直到包含该defer语句的函数返回时才执行。defer语句通常用于资源清理、解锁、关闭文件、网络连接等需要确保在函数结束时执行的操作。 defer函数具有以下特点 延迟执行defer语句指定的函数调用会在包含它的函数或方法即将返回时无论正常返回还是通过panic异常返回都会被执行。这种特性使得defer函数特别适合用于确保资源的正确释放即使在函数执行过程中发生错误或异常。 后进先出LIFO顺序在同一函数中如果有多个defer语句它们的执行顺序与声明顺序相反即最后声明的defer函数最先执行最先声明的defer函数最后执行。这种顺序类似于栈的行为。 参数求值defer语句中的函数参数在defer语句执行时即函数调用前就已经求值但函数体的执行是在函数返回时。 注意事项 defer函数的返回值会被计算但会被丢弃因此defer通常用于无返回值的函数调用。大量使用defer可能会对函数的性能造成轻微影响尤其是在函数调用非常频繁的场景。应合理使用避免过度依赖。如果defer函数内部引发了panic后续的defer函数仍会按照后进先出的顺序执行直到遇到recover函数捕获该panic或者函数结束时panic传播到上层调用者。 3.defer面试题
package mainfunc DeferFunc1(i int) (t int) {// t 1t idefer func() {t 3}()return t
}
func DeferFunc2(i int) int {t : idefer func() {t 3}()return t
}
func DeferFunc3(i int) (t int) {defer func() {t i}()return 2
}// DeferFunc1中有名返回指定返回值命名func test() (t int)执行 return 语句时并不会再创建临时变量保存defer 语句修改了t即对返回值产生了影响所以返回4。
// DeferFunc2中无名返回返回值没有指定命名执行Return语句后Go会创建一个临时变量保存返回值defer 语句修改的是 t而不是临时变量所以返回1。
// DeferFunc3中有名返回执行 return 语句时把2赋值给tdefer 语句再执行t1所以返回3。
func main() {println(DeferFunc1(1))println(DeferFunc2(1))println(DeferFunc3(1))
}
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/90340.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!