前言:
而今姐妹们对“c语言调用自定义函数的格式”可能比较重视,看官们都需要学习一些“c语言调用自定义函数的格式”的相关文章。那么小编在网上收集了一些关于“c语言调用自定义函数的格式””的相关资讯,希望我们能喜欢,兄弟们一起来了解一下吧!版权声明:我已加入“维权骑士”()的版权保护计划,知乎专栏“网路行者”下的所有文章均为我本人(知乎ID:弈心)原创,未经允许不得转载。
如果你喜欢我的文章,请关注我的知乎专栏“网路行者”, 里面有更多像本文一样深度讲解计算机网络技术的优质文章。
和所有编程语言一样,Go语言中允许我们自定义函数来实现一组代码的复用。
自定义函数基础
在Go中,自定义函数由6部分组成:关键字func、函数名、参数列表、返回值类型(可选)、函数体、关键字return(可选),其中参数列表又分为带参数和不带参数两种类型,如果带参数的话,必须在参数列表里指明该参数的数据类型。
举例如下:
package mainimport "fmt"func sum(n1 int, n2 int) int { result := n1 + n2 return result}func main() { fmt.Println(sum(1, 2))}
这里我们用func关键字来自定义一个函数,该自定义函数的名字为sum(),该函数的参数列表里包含了两个参数n1和n2,参数n1和n2的数据类型均为int,返回值的类型也为int,函数体部分里我们创建了一个叫做result的变量,该变量为参数n1和n2的和,最后我们用return关键字将result作为函数sum()的返回值返回。最后在main()下调用该函数,打印出结果即为3。
注意:Go中的自定义函数中如果注明了返回值的类型的话,那么该自定义函数就必须包含return关键字,如果缺失了return关键字的话,系统会报错"missing return at end of function"提醒我们必须在函数体最后面加上return关键字,举例如下。
这里我们照着Python的思维只用fmt.Println(n1 + n2)将函数sum()的结果打印出来而省去了retrun的话,那么运行脚本的时候便会遇到"missing return at end of function"的报错。正确方法是在函数体的最后加上一个return (n1+ n2)(即使你的目的只是想把该函数的返回值直接打印出来,不想把它赋给另一个变量,Go也会强制你使用return关键字,因为这里我们注明了函数的返回值类型),如下图所示。
自定义函数嵌套
Go中的自定义函数可以用作另一个自定义函数中的参数,我们将其称为自定义函数嵌套。
首先创建一个自定义函数hostname(),该函数要求传入model和number两个参数,分别代表网络设备的型号和编号,两个参数的数据类型均为字符串,函数的返回值类型也为字符串,最后函数返回的值为在参数model(这里传入的值为"ISR4400")和参数number(这里传入的值为"1")两个传入的参数之间加上一个“-”后的字符串,该字符串将用作设备的主机名,如下所示。
package mainimport "fmt"func hostname(model string, number string) string { result := model + "-" + number return result}func main() { hostname := hostname("ISR4400", "1") fmt.Println(hostname)}
运行脚本,顺利返回主机名"ISR4400-1"。
接下来我们来看如何将自定义函数hostname()嵌套在另一个自定义函数hostname_with_ip()中,hostname_with_ip()函数最终的目的是将我们之前得到的主机名加上其对应的IP地址,将新的主机名以"model-number-ip"的格式打印出来。代码如下。
package mainimport "fmt"func hostname(model string, number string) string { result := model + "-" + number return result}func hostname_with_ip(original_hostname func(string, string) string, ip string) { result := original_hostname("ISR4400", "1") fmt.Println(result + "-" + ip)}func main() { hostname_with_ip(hostname, "192.168.1.1")}
这里我们在hostname()函数的基础上创建了另外一个自定义函数hostname_with_ip(),该函数包含两个参数,第一个参数original_hostname的类型为函数,该函数需要传入两个字符串参数并且返回值为字符串,第二个参数ip的类型则为字符串(注意hostname_with_ip()函数并没有定义返回值的类型,所以这里我们没有在函数体里用到return关键字)。
这里可以看到:hostname_with_ip()的第一个参数original_hostname和之前我们定义的hostname()函数一样,它们的类型都为函数,并且两个函数都需要传入两个类型为字符串的参数,并且返回的值也为字符串,既然函数类型一模一样,那我们就可以调用hostname()来作为hostname_with_ip()函数的第一个参数,在hostname()的返回值的基础之上加上一个“-”和该设备对应的ip地址(在调用hostname_with_ip()时手动传入该参数),这样通过自定义函数的嵌套,最终得到了我们需要的主机名“ISR4400-1-192.168.1.1"。
自定义函数的参数
之前我们在《网络工程师的Golang之路 -- Go数据类型(指针)》一篇中讲解为什么要使用指针时提到了一个重要的概念:在Go中,任何作为参数传递进函数中的变量并不是该变量本身,而是该变量的副本,调用函数时只会影响该变量副本的值,不会对变量本身产生任何影响。
这里我们将针对该概念再做一次实验,顺带将以前讲到的结构体、指针等知识点回顾一次。
代码如下。
package mainimport "fmt"type Switch struct{ hostname string model string ip_add string port int}func mutate(device Switch){ device.hostname = "mutated_hostname" device.model = "mutated_model" device.ip_add = "mutated_ip" device.port = 0}func main(){ sw1 := Switch{hostname: "sw1", model: "C9300", ip_add: "172.16.10.1", port: 48} mutate(sw1) fmt.Println(sw1.hostname) fmt.Println(sw1.model) fmt.Println(sw1.ip_add) fmt.Println(sw1.port)}
首先我们创建了一个结构体Switch,该结构体包含hostname、model、ip_add和port四个字段,顾名思义用来描述一台交换机的主机名、型号、ip地址以及端口数量。然后我们创建了一个叫做mutate()的自定义函数,该函数的参数类型为我们刚刚创建好的结构体Switch(记住结构体是一种用户自定义的数据类型,和字符串、整数、布尔值这些内置的数据类型是同一个概念),该mutate()函数的作用是用来修改一个Switch结构体实例的4个字段,将该实例的主机名改为"mutated_hostname",将其型号改为"mutated_model",将其ip地址改为“mutated_ip",将端口数改为0。
然后我们在main()函数下面首先将Switch结构体实例化给变量sw1,然后使用mutate(sw1)试图更改sw1的四个字段,最后会看到sw1的四个字段并没受影响,因为在Go中,任何作为参数传递进函数中的变量并不是该变量本身,而是该变量的副本,调用函数时只会影响该变量副本的值,不会对变量本身产生任何影响。
只有将变量的指针作为参数传递进函数,调用函数时才会兑变量本身的值产生影响。
将上面的代码稍微修改如下。
package mainimport "fmt"type Switch struct { hostname string model string ip_add string port int}func mutate(device *Switch) { device.hostname = "mutated_hostname" device.model = "mutated_model" device.ip_add = "mutated_ip" device.port = 0}func main() { sw1 := Switch{hostname: "sw1", model: "C9300", ip_add: "172.16.10.1", port: 48} mutate(&sw1) fmt.Println(sw1.hostname) fmt.Println(sw1.model) fmt.Println(sw1.ip_add) fmt.Println(sw1.port)}
标签: #c语言调用自定义函数的格式