怎么样使用Go语言中函数的参数传递与调用按值传递函数参数 , 是拷贝参数的实际值到函数的形式参数的方法调用 。在这种情况下,参数在函数内变化对参数不会有影响 。
默认情况下 , Go编程语言使用调用通过值的方法来传递参数 。在一般情况下,这意味着,在函数内码不能改变用来调用所述函数的参数 。考虑函数swap()的定义如下 。
代码如下:
/* function definition to swap the values */
func swap(int x, int y) int {
var temp int
temp = x /* save the value of x */
x = y/* put y into x */
y = temp /* put temp into y */
return temp;
}
现在,让我们通过使实际值作为在以下示例调用函数swap():
代码如下:
package main
import "fmt"
func main() {
/* local variable definition */
var a int = 100
var b int = 200
fmt.Printf("Before swap, value of a : %d\n", a )
fmt.Printf("Before swap, value of b : %d\n", b )
/* calling a function to swap the values */
swap(a, b)
fmt.Printf("After swap, value of a : %d\n", a )
fmt.Printf("After swap, value of b : %d\n", b )
}
func swap(x, y int) int {
var temp int
temp = x /* save the value of x */
x = y/* put y into x */
y = temp /* put temp into y */
return temp;
}
让我们把上面的代码放在一个C文件,编译并执行它 , 它会产生以下结果:
Before swap, value of a :100
Before swap, value of b :200
After swap, value of a :100
After swap, value of b :200
这表明,参数值没有被改变,虽然它们已经在函数内部改变 。
通过传递函数参数,即是拷贝参数的地址到形式参数的参考方法调用 。在函数内部,地址是访问调用中使用的实际参数 。这意味着 , 对参数的更改会影响传递的参数 。
要通过引用传递的值,参数的指针被传递给函数就像任何其他的值 。所以,相应的,需要声明函数的参数为指针类型如下面的函数swap(),它的交换两个整型变量的值指向它的参数 。
代码如下:
/* function definition to swap the values */
func swap(x *int, y *int) {
var temp int
temp = *x/* save the value at address x */
*x = *y/* put y into x */
*y = temp/* put temp into y */
}
现在,让我们调用函数swap()通过引用作为在下面的示例中传递数值:
代码如下:
package main
import "fmt"
func main() {
/* local variable definition */
var a int = 100
var b int= 200
fmt.Printf("Before swap, value of a : %d\n", a )
fmt.Printf("Before swap, value of b : %d\n", b )
/* calling a function to swap the values.
* a indicates pointer to a ie. address of variable a and
【go语言参数 go语言chan】* b indicates pointer to b ie. address of variable b.
*/
swap(a, b)
fmt.Printf("After swap, value of a : %d\n", a )
fmt.Printf("After swap, value of b : %d\n", b )
}
func swap(x *int, y *int) {
var temp int
temp = *x/* save the value at address x */
*x = *y/* put y into x */
*y = temp/* put temp into y */
}
让我们把上面的代码放在一个C文件,编译并执行它,它会产生以下结果:
Before swap, value of a :100
Before swap, value of b :200
After swap, value of a :200
After swap, value of b :100
这表明变化的功能以及不同于通过值调用的外部体现的改变不能反映函数之外 。
golang 怎么定义可变参数的函数golang定义可变参数go语言参数的函数方法是:
—- 采用ANSI标准形式时go语言参数,参数个数可变的函数的原型声明是:
type funcname(type para1, type para2, …)
—- 这种形式至少需要一个普通的形式参数,后面的省略号不表示省略,而是函数原型的一部分 。type是函数返回值和形式参数的类型 。
—- 采用与UNIX System V兼容的声明方式时,参数个数可变的函数原型是:
type funcname(va_alist)
va_dcl
—- 这种形式不需要提供任何普通的形式参数 。
type是函数返回值的类型 。va_dcl是对函数原型声明中参数va_alist的详细声明,实际是一个宏定义,对不同的硬件平台采用不同的类型来定义,但在最后都包括了一个分号 。因此va_dcl后不再需要加上分号了 。va_dcl在代码中必须原样给出 。va_alist在VC中可以原样给出,也可以略去 。
此外,采用头文件stdarg.h编写的程序是符合ANSI标准的 , 可以在各种操作系统和硬件上运行;而采用头文件varargs.h的方式仅仅是为了与以前的程序兼容 。所以建议使用前者 。
写命令行应用程序什么不可或缺?Go可以这样处理命令行参数 Go语言内置的flag包实现了命令行参数的解析 , flag包使得开发命令行工具更为简单 。
如果你只是简单的想要获取命令行参数,可以像下面的代码示例一样使用os.Args来获取命令行参数 。
将上面的代码执行go build -o "args_demo"编译之后 , 执行:
os.Args是一个存储命令行参数的字符串切片 , 它的第一个元素是执行文件的名称 。
本文介绍了flag包的常用函数和基本用法 , 更详细的内容请查看官方文档 。
flag包支持的命令行参数类型有bool、int、int64、uint、uint64、float float64、string、duration 。
有以下两种常用的定义命令行flag参数的方法 。
基本格式如下:
flag.Type(flag名, 默认值, 帮助信息)*Type 例如我们要定义姓名、年龄、婚否三个命令行参数,我们可以按如下方式定义:
需要注意的是,此时name、age、married、delay均为对应类型的指针 。
基本格式如下: flag.TypeVar(Type指针, flag名, 默认值, 帮助信息) 例如我们要定义姓名、年龄、婚否三个命令行参数 , 我们可以按如下方式定义:
通过以上两种方法定义好命令行flag参数后,需要通过调用flag.Parse()来对命令行参数进行解析 。
支持的命令行参数格式有以下几种:
其中,布尔类型的参数必须使用等号的方式指定 。
Flag解析在第一个非flag参数(单个”-“不是flag参数)之前停止,或者在终止符”–“之后停止 。
定义
使用
命令行参数使用提示:
$ ./flag_demo -help
Usage of ./flag_demo:
-age int
年龄 (default 18)
-d duration
时间间隔
-married
婚否
-name string
姓名 (default "张三")
正常使用命令行flag参数:
使用非flag命令行参数:
原文链接:
go语言的参数怎么实现const修饰的效果'const修饰的数据类型是指常类型,常类型的变量或对象的值是不能被更新的 。const关键字的作用主要有以下几点:(1)可以定义const常量,具有不可变性 。例如:constintMax=100;intArray[Max];(2)便于进行类型检查,使编译器对处理内容有了解,消除了一些隐患 。例如:voidf(constinti){}编译器就会知道i是一个常量,不允许修改;(3)可以避免意义模糊的数字出现,同样可以很方便地进行参数的调整和修改 。(4)可以保护被修饰的东西,防止意外的修改,增强程序的健壮性 。还是上面的例子,如果在函数体内修改了i,编译器就会报错;例如:voidf(constinti){i=10;//error!}(5)为函数重载提供了一个参考 。classA{voidf(inti){}//一个函数voidf(inti)const{}//上一个函数的重载};(6)可以节省空间,避免不必要的内存分配 。例如:#definePI3.14159//常量宏constdoulbePi=3.14159;//此时并未将Pi放入ROM中doublei=Pi;//此时为Pi分配内存,以后不再分配!doubleI=PI;//编译期间进行宏替换,分配内存doublej=Pi;//没有内存分配doubleJ=PI;//再进行宏替换,又一次分配内存!const定义常量从汇编的角度来看,只是给出了对应的内存地址,而不是象#define一样给出的是立即数,所以,const定义的常量在程序运行过程中只有一份拷贝,而#define定义的常量在内存中有若干个拷贝 。(7)提高了效率 。编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高 。
关于go语言参数和go语言chan的介绍到此就结束了 , 不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站 。
推荐阅读
- 抖音直播投什么引流,抖音直播间投什么
- 彩纸用什么做成的视频,用彩纸怎么制作
- linux命令常见,linux100个常用命令
- 桌面游戏小程序开发软件,桌面小游戏怎么做
- c语言绘图函数库有哪些 c语言实现函数绘图
- flutter的diff算法的简单介绍
- 新媒体如何做定位分析报告,新媒体定位的作用是什么
- 射击动作型游戏,动作射击单机游戏
- 包含windows系统账户号的词条