当前位置: 首页 > news >正文

医疗网站前置审批取消wordpress域名地址设置

医疗网站前置审批取消,wordpress域名地址设置,用绿色做图标的网站,中文博客网站模板下载第五章#xff1a;函数 5.1 函数声明 和其它语言类似#xff0c;Golang 的函数声明包括函数名、形参列表、返回值列表#xff08;可省略#xff09;以及函数体#xff1a; func name(parameter-list) (result-list) {/* ... Body ... */ }需要注意的是#xff0c;函数…第五章函数 5.1 函数声明 和其它语言类似Golang 的函数声明包括函数名、形参列表、返回值列表可省略以及函数体 func name(parameter-list) (result-list) {/* ... Body ... */ }需要注意的是函数的返回值列表可省略如果一个函数声明不包括返回值列表那么函数体执行完毕后不会返回任何值。 一个函数声明的例子如下 func hypot(x, y float64) float64 {return math.Sqrt(x * x y * y) }如果一组形参或返回值具有相同的类型我们就不必为每个形参都写出参数类型 func f(i, j, k int, s, t string) { /*... ... ...*/ } // 等价于 func f(i int, j int, k int, s string, t string { /*... ... ...*/ }函数的类型被称为函数的签名。如果两个函数的形参列表和返回值列表中的变量类型一一对应那么这两个函数被认为具有相同的类型或签名。形参和返回值的变量名不影响函数签名也不影响它们是否可以以省略参数类型的形式表示。 每次函数调用必须按照声明顺序为所有参数提供实参。在函数调用时Golang 没有默认参数值也没有办法可以通过参数名指定形参因此形参和返回值的变量名对函数调用无意义。 实参通过值的方式传递因此函数的形参是实参的拷贝。对形参的修改不会影响实参。但如果实参包括引用类型比如指针、slice、map、func、channel 等实参可能由于函数的间接引用被修改。 5.2 递归 大部分语言使用固定大小的函数调用栈固定大小的栈会限制递归的深度当用递归处理大量数据时需要避免栈溢出此外还会导致安全性问题。与此相反Golang 使用可变栈栈的大小按需增加初始时很小这使得递归不必考虑溢出和安全性问题。 5.3 多返回值 在 Golang 当中一个函数可以返回多个值。常见的有许多标准库的函数返回两个值一个值是期望得到的值另一个是函数出错的错误信息。 调用多返回值函数时返回给调用者的是一组值调用者必须显式地将这些值分配给变量 links, err : findLinks(url) // OR links, _ : findLinks(url)如果一个函数所有的返回值都有显式的变量名那么该函数的 return 语句可以省略操作数称为 bare return // CountWordsAndImages does an HTTP GET request for the HTML // document url and returns the number of words and images in it. func CountWordsAndImages(url string) (words, images int, err error) {resp, err : http.Get(url)if err ! nil {return}doc, err : html.Parse(resp.Body)resp.Body.Close()if err ! nil {err fmt.Errorf(parsing HTML: %s, err)return}words, images countWordsAndImages(doc)return // 返回 words, images, err } func countWordsAndImages(n *html.Node) (words, images int) { /* ... */ }bare return 使得代码难以理解因此不宜过度使用。 5.4 错误 在 Golang 当中函数调用发生错误时错误的信息通常通过 error 类型以函数返回值的形式反馈给函数调用者。 内置的 error 是接口类型但由于我们还没复习到接口目前只需要知道 error 类型可能是 nil 或者 non-nil。nil 意味着函数运行成功non-nil 表示失败。 可以调用 error 的 Error 函数或输出函数获得字符串类型的错误信息。 通常在函数返回 non-nil 的 error 时其它的返回值可能是未定义的undefined这些未定义的返回值应该忽略。 Go 使用控制流机制如 if 和 return处理错误这使得编码人员能更多地关注错误处理。 5.4.1 错误处理策略 最常用的方式是传播错误 resp, err : http.Get(url) if err ! nil {return nil, err }可以使用 Errorf 来格式化错误信息 doc, err : html.Parse(resp.Body) resp.Body.Close() if err ! nil {return nil, fmt.Errorf(parsing %s as HTML: %v, url, err) }第二种错误处理的策略是如果错误是偶然发生的或由不可预知的问题导致的一个明智的选择是重新尝试失败的操作 func WaitForServer(url string) error {const timeout 1 * time.Minutedeadline : time.Now().Add(timeout)for tries : 0; time.Now().Before(deadline); tries {_, err : http.Head(url)if err nil {return nil // success}log.Printf(server not responding (%s); retrying..., err)time.Sleep(time.Second unit(tries)) // exponential back-off}return fmt.Errorf(server %s failed to respond after %s, url, timeout) }如果错误发生程序无法继续运行我们可以采取第三种策略输出错误信息并结束程序。需要注意的是这种策略只能在 main 中执行 if err : WaitForServer(url); err ! nil {fmt.Fprintf(os.Stderr, Site is down: %v\n, err)os.Exit(1) }第四种策略有时我们只需要输出错误信息就足够了而不需要中断程序运行。 if err : Ping(); err ! nil {log.Printf(Ping Failed: %v; networking disabled, nil) }最后一种策略直接忽略错误。 5.4.2 文件结尾错误EOF Golang 的 io 包保证任何由文件结束引起的读取失败都会返回同一个错误——io.EOF package io import errors var EOF errors.New(EOF)in : bufio.NewReader(os.Stdin) for {r, _, err : in.ReadRune()if err io.EOF {break}if err ! nil {return fmt.Errorf(read failed: %v, err)} }5.5 函数值 在 Golang 当中函数被视为一等公民first-class values函数像其他值一样拥有类型可以被赋值给其它变量传递给函数从函数返回。对函数值的调用类似函数调用 func square(n int) int { return n * n } func negative(n int) int { return -n } func product(m, n int) int { return m * n }f : square // 指定了函数的类型为 func(int) fmt.Println(f(3))f - negative fmt.Println(f(3))f product // 错误❌: 不能将 func(int, int) 赋值给 func(int) 类型函数类型的零值为 nil调用值为 nil 的函数值会引起 panic 错误。函数值可以和 nil 进行比较。 函数值使得我们不仅可以通过数据来参数化函数亦可以通过行为。下例展示了使用 strings.Map 调用 add1 函数并将每个 add1 函数的返回值组成一个新的字符串返回给调用者 func add1(r rune) rune { return r 1 }fmt.Println(strings.Map(add1, HAL-9000)) // IBM.:111 fmt.Println(strings.Map(add1, VMS)) // WNT fmt.Println(strings.Map(add1, Admix)) // Benjy 5.6 匿名函数 拥有函数名的函数只能在包级语法块中被使用通过函数字面量function literal我们可以绕过这一限制在任何表达式中表示一个函数值。 函数字面量的语法和函数声明相似区别在于 func 关键字后面没有函数名。函数值字面量是一种表达式它的值被称为匿名函数anonymous function。 下例改写了之前例子中使用 strings.Map 调用 Add1 的例子 strings.Map(func(r rune) rune { return r 1 }, HAL-9000)通过上述方式定义的函数可以访问完整的词法环境lexical environment这意味着在函数中定义的内部函数可以引用该函数的变量 // 也被称为函数闭包 func squares() func() int { // squares 的返回值是匿名函数, 该匿名函数的返回值是 intvar x int // 在闭包中定义 xreturn func() int {x return x * x} }// 调用函数闭包的结果: func main() {f : squares()fmt.Println(f()) // 1fmt.Println(f()) // 4fmt.Println(f()) // 9fmt.Println(f()) // 16 }squares 的例子证明Golang 当中的函数不仅仅是一串代码它们还记录了函数内部的状态。通过这个例子我们也看到变量的生命周期不由它的作用域决定返回 squares 后变量 x 仍然隐式存在于 f 中。 5.6.1 警告捕获迭代变量 本节将介绍 Golang 词法作用域的一个陷阱。 考虑下述问题你被要求首先创建一些目录之后删除。正确的示例如下 var rmdirs []func() for _, d : range tempDirs() {dir : d // 注意: 这一步是必须的os.MkdirAll(dir, 0755)rmdirs append(rmdirs, func() {os.RemoveAll(dir)}) }for _, rmdir : rmdirs {rmdir() }我们可能感到困惑为什么要在循环体内用循环变量 d 赋值给一个新的局部变量 dir而不是直接使用循环变量 d问题的原因在于循环变量的作用域。在上面的程序中for 循环引入了新的词法块循环变量 dir 在这个词法中被声明。在该循环中的所有函数值都共享相同的循环变量。以 d 为例后续的迭代会不断更新 d 的值当删除操作执行时for 循环已经完成d 当中存储的值等于最后一次迭代的值这意味着每次对 os.RemoveAll 调用的结果都是删除相同的目录。 通常为了解决上述问题都会引入一个与循环变量同名或相似的局部变量作为循环变量的副本。 上述问题不仅存在于基于 range 的循环当中使用循环变量 i 时也存在相同问题。 5.7 可变参数 参数数量可变的参数称为可变参数函数典型的例子是fmt.Printf及类似函数。 在声明可变参数函数时需要在参数列表的最后一个参数类型之前添加省略号... func sum(vals ...int) int {total : 0for _, val : range vals {total val]return total }上述 sum 函数返回任意个 int 型参数的和。在函数体中vals 被看作类型为[]int的切片。 如果原始参数已经是切片类型如何传递给 sum 只需要在最后一个参数后加上省略号 values : []int{1, 2, 3, 4} fmt.Println(sum(values...))实际上可变参数函数和以切片作为参数的函数是不同的 func f(...int) {} func g([]int) {} fmt.Printf(%T\n, f) // func(...int) fmt.Printf(%T\n, g) // func([]int)可变参数函数常被用于格式化字符串。下面的 errorf 函数构造了一个以行号开头的经过格式化的错误信息。函数名的后缀 f 是一种通用的命名规范代表该可变参数函数可以接收 Printf 风格的格式化字符串 func errorf(linenum int, format string, args ...interface{}) {fmt.Fprintf(os.Stderr, Line %d: , linenum)fmt.Fprintf(os.Stderr, format, args...)fmt.Fprintln(os.Stderr) } linenum, name : 12, count errorf(linenum, undefined: %s, name) // Line 12: undefined: count其中interface{}表示函数的最后一个参数可以接收任意类型。 5.8 Deferred 函数 只需要在普通调用函数或方法前加上 defer 关键字就完成了 defer 所需要的语法。当执行到该语句时函数和参数表达式得到计算但直到包含该 defer 语句的函数执行完毕时defer 后的语句才会执行。 可以在一个函数中执行多条 defer它们的执行顺序与声明顺序相反。 5.9 Panic 异常 一般而言panic 发生时程序会中断并立即执行在该 goroutine 中被延迟defer的函数。 不是所有 panic 都来自运行时直接调用内置的 panic 函数也会引发 panic 异常。 虽然 Go 的 panic 机制类似于其它语言的异常但使用场景略微不同。由于 panic 会引起程序崩溃因此 panic 一般只用于严重错误。对于大部分漏洞我们应该使用 Go 提供的错误机制而不是 panic尽量避免程序崩溃。 5.10 Recover 捕获异常 通常来说不应该对 panic 异常做任何处理但有时我们希望程序可以从异常中恢复。 如果在deferred函数中调用了内置函数recover并且定义该defer语句的函数发生了panic异常recover会使程序从panic中恢复并返回panic value。导致panic异常的函数不会继续运行但能正常返回。在未发生panic时调用recoverrecover会返回nil。 以 Parse 为例说明 recover 的使用场景 func Parse(input string) (s *Syntax, err error) {defer func() {if p : recover(); p ! nil {err fmt.Errorf(internal error: %v, p)}}// ... parser ... }recover 帮助 Parse 从 panic 恢复。在 deferred 函数内部panic value 被附加到错误信息中。 我们不应该试图去恢复其他包引起的 panic也不应该恢复由他人开发的函数引起的 panic。
http://www.hkea.cn/news/14437718/

相关文章:

  • 网站优化查询代码手机网站建设报价表
  • 大唐网站首页网站架设的结构
  • 怎么用php做网站方案东营做网站多少钱
  • 动态表情包在线制作网站wordpress 瀑布流模板
  • 一个好网站设计专业做网站价格
  • 嘉兴北京网站建设seo网站优化经理
  • 网站推广的一般方式彩票推广网站如何做
  • 深圳移动端网站建设模板猎上网登陆官方网站
  • 做外贸网站用什么空间花西子的网络营销策略
  • 网站微商城的建设网站建设一般字体多大
  • 织梦网站地图模版做视频网站新手教学
  • 百度seo网站排名优化电脑视频制作软件
  • 查看网站是什么空间做网站联系我们在那个板块里面
  • 西安网站seo推广odoo 网站页面怎么做
  • 网站开发专业都有哪些课程网站建设 杭州市萧山区
  • 网站模版调用标签教程佛山网站建设拓客科技
  • 网站开发 毕业答辩ppt做黑枸杞的公司网站
  • 做网站创业流程图建设网站公
  • 方城微网站开发哈尔滨网站设计哪家好
  • 网站有哪些推荐做二手家电网站怎样
  • 江西企业网站建设网页设计需要学什么软件
  • 上海做设计公司网站新乡市网站建设
  • 绵阳专门做网站的公司wordpress 全宽轮播
  • 网站设计的必要性网页设计网站排行榜
  • 可做笔记的阅读网站室内设计效果图全景图
  • 珠海商城网站制作公司网站设计哪家公司好
  • 大众点评网站团购怎么做电脑上怎么添加wordpress
  • 网站设计前景163企业邮箱官网入口
  • 做网站收入特效网站大全
  • 沙井品牌网站建设wordpress插件ERP