Go语言圣经-可变参数习题详解编程语言

1.参数数量可变的函数称为为可变参数函数,例子就是fmt.Printf和类似函数
2.参数列表的最后一个参数类型之前加上省略符号“…”
3.虽然在可变参数函数内部,…int 型参数的行为看起来很像切片类型,但实际上,可变参数函数和以切片作为参数的函数是不同的
类型不同:fmt.Printf(“%T/n”, 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.Node
images := ElementsByTagName(doc, “img”)
headings := ElementsByTagName(doc, “h1”, “h2”, “h3”, “h4”)

 

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) 
        } 
} 

Go语言圣经-可变参数习题详解编程语言  

原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/12539.html

(0)
上一篇 2021年7月19日 14:43
下一篇 2021年7月19日 14:43

相关推荐

发表回复

登录后才能评论