加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

[日常] Go语言圣经-可变参数习题

发布时间:2020-12-16 19:36:15 所属栏目:大数据 来源:网络整理
导读:1.参数数量可变的函数称为为可变参数函数,例子就是fmt.Printf和类似函数2.参数列表的最后一个参数类型之前加上省略符号“...”3.虽然在可变参数函数内部,...int 型参数的行为看起来很像切片类型,但实际上,可变参数函数和以切片作为参数的函数是不同的 类

1.参数数量可变的函数称为为可变参数函数,例子就是fmt.Printf和类似函数2.参数列表的最后一个参数类型之前加上省略符号“...”3.虽然在可变参数函数内部,...int 型参数的行为看起来很像切片类型,但实际上,可变参数函数和以切片作为参数的函数是不同的 类型不同:fmt.Printf("%Tn",f)4.函数名的后缀f是一种通用的命名规范,代表该可变参数函数可以接收Printf风格的格式化字符串5.interfac{}表示函数的最后一个参数可以接收任意类型

练习5.15: 编写类似sum的可变参数函数max和min。考虑不传参时,max和min该如何处理,再编写至少接收1个参数的版本。练习5.16:编写多参数版本的strings.Join。

练习5.17:编写多参数版本的ElementsByTagName,函数接收一个HTML结点树以及任意数量的标签名,返回与这些标签名匹配的所有元素。下面给出了2个例子:

func ElementsByTagName(doc *html.Node,name...string) []*html.Nodeimages := ElementsByTagName(doc,"img")headings := ElementsByTagName(doc,"h1","h2","h3","h4")

<div class="cnblogs_Highlighter">
<pre class="brush:go;gutter:true;">package main

import (
"fmt"
"golang.org/x/net/html"
"net/http"
)

func main() {
fmt.Println(max(1,2,3,4,2))
fmt.Println(max())
fmt.Println(join("-","hello","tsh","hi"))

    resp,_ := http.Get("http://mail.sina.net")
    doc,_ := html.Parse(resp.Body)
    resp.Body.Close()
    tNodes := ElementsByTagName(doc,"p","a")
    for _,v := range tNodes {
            ForEachNode(v)
            fmt.Println("------------------------")
    }   

}

/
练习5.15: 编写类似sum的可变参数函数max和min。考虑不传参时,max和min该如何处理,再编写至少接收1个参数的版本。
/
func max(vals ...int) (int,error) {
var m int

    num := len(vals)
    if num == 0 { 
            return 0,fmt.Errorf("max: %s","至少传递一个参数")
    }   
    for _,v := range vals {
            if m < v { 
                    m = v 
            }   
    }   
    return m,nil 

}

/
练习5.16:编写多参数版本的strings.Join。
/
func join(sep string,strs ...string) (string,error) {
var res string
var num = len(strs)
if num == 0 {
return "",fmt.Errorf("join: %s","至少传递一个参数")
}

    for i,v := range strs {
            if i == (num - 1) {
                    res += v
            } else {
                    res += v + sep
            }
    }
    return res,nil

}

/
练习5.17:编写多参数版本的ElementsByTagName,函数接收一个HTML结点树以及任意数量的标签名,返回与这些标签名匹配的所有元素。下面给出了2个例子:
/
var nodes []*html.Node

func ElementsByTagName(n html.Node,names ...string) []html.Node {
newNode := n
for _,name := range names {
if n.Type == html.ElementNode && n.Data == name {
nodes = append(nodes,newNode)
}
}
for c := n.FirstChild; c != nil; c = c.NextSibling {
//可变参数传参特点
ElementsByTagName(c,names...)
}
return nodes
}
func ForEachNode(n *html.Node) {
fmt.Println(n.Data)
for c := n.FirstChild; c != nil; c = c.NextSibling {
ForEachNode(c)
}
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读