大佬教程收集整理的这篇文章主要介绍了[日常] Go语言圣经-可变参数习题,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
1.参数数量可变的函数称为为可变参数函数,例子就是fmt.Printf和类似函数2.参数列表的最后一个参数类型之前加上省略符号“...”3.虽然在可变参数函数内部,...int 型参数的行为看起来很像切片类型,但实际上,可变参数函数和以切片作为参数的函数是不同的 类型不同:fmt.Printf("%T\n",f)4.函数名的后缀f是一种通用的命名规范,代表该可变参数函数可以接收Printf风格的格式化字符串5.interfac{}表示函数的最后一个参数可以接收任意类型
练习5.15: 编写类似sum的可变参数@L_456_1@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的可变参数@L_456_1@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: <a href="http://code.js-code.com/tag/s/" target="_blank" class="keywords">%s</a>","至少传递<a href="http://code.js-code.com/tag/yige/" target="_blank" class="keywords">一个</a>参数")
}
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)
}
}
以上是大佬教程为你收集整理的[日常] Go语言圣经-可变参数习题全部内容,希望文章能够帮你解决[日常] Go语言圣经-可变参数习题所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。