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)
}
}
 (编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|