当前位置: 首页 > news >正文

Golang 教程2

Golang 教程2

注意,该文档只适合有编程基础的同学,这里的go教程只给出有区别的知识点

函数的基本形式
//形式
/* 
func 函数(形参列表)(返回值类型列表){执行语句return + 返回值列表
}
*/
1、 一个返回值的情况
func cal (num1 int, num2 int) (int) { // 函数返回只有一个的情况下,可以省略(), 如果没有返回值,后面一个括号可以直接不写。return num1 + num2
}func main() {fmt.Println(cal(1, 2))
} ``````````````````````````````````````````````````````````````````````````````````````````````````
(base) PS E:\Goproject\src\gocode\testproject01\unit2\demo01>  go run .\main.go
3
``````````````````````````````````````````````````````````````````````````````````````````````````
/*
注意
1、遵循标识符命名规范:见名知意 + 驼峰命名, 如addNum 
2、首字母大写则可以被本包文件和其他包文件使用(类似public)
3、首字母小写只能被本包文件使用,其他包文件不能使用(类似于private)*/
2、没有返回值的情况
func cal (num1 int, num2 int)  { //注意,此处省略了返回列表的()fmt.Println(num1 + num2)
}func main() {cal(10, 20)
} ``````````````````````````````````````````````````````````````````````````````````````````````````
(base) PS E:\Goproject\src\gocode\testproject01\unit2\demo01>  go run .\main.go
3
``````````````````````````````````````````````````````````````````````````````````````````````````
3、多个返回值的情况
func cal (num1 int, num2 int) (addRes int, subRes int) { // 函数返回只有一个的情况下,可以省略()addRes = num1 + num2subRes = num1 - num2return addRes, subRes
}func main() {addRes, subRes := cal(10, 20) //返回多少个值就用多少个变量接收//如果不需要某个返回值,用 "_" 接收进行忽略//如 addRes, _ := cal(10, 20)fmt.Printf("add result is %d, sub result is %d", addRes, subRes)
} ``````````````````````````````````````````````````````````````````````````````````````````````````
(base) PS E:\Goproject\src\gocode\testproject01\unit2\demo01>  go run .\main.go
add result is 30, sub result is -10
``````````````````````````````````````````````````````````````````````````````````````````````````
4、 每个函数执行程序会给这个函数会单独开辟一个内存空间,所以涉及到数值交换的情况下传入地址
// 函数执行完毕之后所对应的内存空间会销毁//a、 不传入变量地址的情况
func swap  (num1 int, num2 int)  { // 函数返回只有一个的情况下,可以省略()num1, num2 = num2, num1
}
func main() {a := 1b := 2fmt.Printf("before change, a is %d, b is %d \n", a, b)swap(a, b)fmt.Printf("after change, a is %d, b is %d", a, b)
} 
``````````````````````````````````````````````````````````````````````````````````````````````````
(base) PS E:\Goproject\src\gocode\testproject01\unit2\demo01>  go run .\main.go
before change, a is 1, b is 2 
after change, a is 1, b is 2
``````````````````````````````````````````````````````````````````````````````````````````````````
//b、 传入变量地址的情况
func swap  (num1 *int, num2 *int)  { // 函数返回只有一个的情况下,可以省略()*num1, *num2 = *num2, *num1
}func main() {a := 1b := 2fmt.Printf("before change, a is %d, b is %d \n", a, b)swap(&a, &b)fmt.Printf("after change, a is %d, b is %d", a, b)
} ``````````````````````````````````````````````````````````````````````````````````````````````````
(base) PS E:\Goproject\src\gocode\testproject01\unit2\demo01>  go run .\main.go
before change, a is 1, b is 2 
after change, a is 2, b is 1
``````````````````````````````````````````````````````````````````````````````````````````````````
5、 golang 不支持重载
func swap  (num1 int, num2 int)  { // 函数返回只有一个的情况下,可以省略()num1, num2 = num2, num1
}func swap  (num1 int)  { // 函数返回只有一个的情况下,可以省略()
}``````````````````````````````````````````````````````````````````````````````````````````````````
(base) PS E:\Goproject\src\gocode\testproject01\unit2\demo01>  go run .\main.go
# command-line-arguments
.\main.go:12:6: swap redeclared in this block //其他语言可以支持,go不支持.\main.go:8:6: other declaration of swap
``````````````````````````````````````````````````````````````````````````````````````````````````
6、 golang 提供可变参数重载 用 “…” 替代
func sum  (name string, isVip bool, args...int)  int { // 函数返回列表只有一个的情况下,可以省略()var sum int = 0fmt.Println(name, isVip, args)for _, value := range args { // 遍历数组, 如果不需要索引, 用 _ 承接	sum += value}return sum
}func main() {fmt.Println(sum("liMing", true, 1,2,3,4,5,6,7,8,9))
} ``````````````````````````````````````````````````````````````````````````````````````````````````
(base) PS E:\Goproject\src\gocode\testproject01\unit2\demo01>  go run .\main.go
liMing true [1 2 3 4 5 6 7 8 9]
45
``````````````````````````````````````````````````````````````````````````````````````````````````
7、 基本数据类型和数据默认都是值传递,即进行值拷贝。在函数内修改,不会影响到原来的值
func test (num int) {num = 30fmt.Println(num)
}func main() {num := 10test(num)fmt.Println(num)
} ``````````````````````````````````````````````````````````````````````````````````````````````````
(base) PS E:\Goproject\src\gocode\testproject01\unit2\demo01>  go run .\main.go
30
10
``````````````````````````````````````````````````````````````````````````````````````````````````//如何才能让main函数里头的num值也发生改变? 可以传入地址func test (ptr *int) {fmt.Println(ptr)*ptr = 30 //这里的意思是将指针对应的值进行改变fmt.Println(*ptr)
}func main() {num := 10test(&num) // 传入的是地址fmt.Println(num)
} ``````````````````````````````````````````````````````````````````````````````````````````````````
(base) PS E:\Goproject\src\gocode\testproject01\unit2\demo01>  go run .\main.go
0xc00000a0f8
30
30
``````````````````````````````````````````````````````````````````````````````````````````````````
8、 在go中, 函数也是一种数据类型,可以赋值给一个变量,则该变量就是一个数据类型的变量了。通过该变量可以对函数进行调用
func test (num int) {fmt.Println(num)
}//可以通过type 给函数取别名 
type myFunc func(int)func test2 (num int, num2 float32, testFunc myFunc) {testFunc(123)
}func main() {a := testfmt.Printf("a 的类型是: %T, test函数的类型是: %T\n", a, test)//可以通过该变量对函数进行调用a(123) // 等价于 test(123) test2(123, 3.14, test)test2(123, 3.14, a)
} 
``````````````````````````````````````````````````````````````````````````````````````````````````
(base) PS E:\Goproject\src\gocode\testproject01\unit2\demo01>  go run .\main.go
a 的类型是: func(int), test函数的类型是: func(int)
123
123
123
``````````````````````````````````````````````````````````````````````````````````````````````````// 可以对返回的列表变量取别名, 这样函数体里面的顺序就无所谓了func test (num1 int, num2 int) (addRes int, subRes int) {subRes = num1 - num2addRes = num1 + num2return
}func main() {addRes, subRes := test(10, 20)fmt.Println(addRes, subRes)
} ``````````````````````````````````````````````````````````````````````````````````````````````````
(base) PS E:\Goproject\src\gocode\testproject01\unit2\demo01>  go run .\main.go
30 -10
``````````````````````````````````````````````````````````````````````````````````````````````````

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • NoSql数据库 Redis集群详解
  • 如何使用 Pytest 进行测试
  • 【AI绘画】Midjourney前置指令/describe、/shorten详解
  • 给自己复盘用的tjxt笔记day12第一部分
  • Android 事件分发:为什么有时候会出现事件冲突?事件的顺序是如何的?出现事件冲突如何解决呢?比如为什么左右可以滑动,而上下却不行?
  • 中信银行与中国国家地理携手致敬中国极地考察40周年
  • 查看 mysql 密码过期策略,设置永不过期
  • 医疗器械法规笔记
  • 虚幻5|按键触发学习
  • 低代码技术:快速构建应用的未来
  • 华为HCIP-datacom 真题 (2024年下半年最新题库)
  • 华为OD机试算法精选题解汇总:提前准备,稳步通关的关键
  • rust单线程下异步代码的意义
  • 进程间通信--IPC机制
  • APP 数据抓取 - Charles 抓包工具的使用(Charles 端口配置、CA 证书配置、Charles Android 模拟器配置)
  • 【css3】浏览器内核及其兼容性
  • 【笔记】你不知道的JS读书笔记——Promise
  • 【知识碎片】第三方登录弹窗效果
  • Android框架之Volley
  • create-react-app做的留言板
  • CSS魔法堂:Absolute Positioning就这个样
  • DOM的那些事
  • Java IO学习笔记一
  • JS字符串转数字方法总结
  • laravel with 查询列表限制条数
  • mysql_config not found
  • session共享问题解决方案
  • Swift 中的尾递归和蹦床
  • UEditor初始化失败(实例已存在,但视图未渲染出来,单页化)
  • vue+element后台管理系统,从后端获取路由表,并正常渲染
  • 表单中readonly的input等标签,禁止光标进入(focus)的几种方式
  • 开源中国专访:Chameleon原理首发,其它跨多端统一框架都是假的?
  • 目录与文件属性:编写ls
  • 扑朔迷离的属性和特性【彻底弄清】
  • 十年未变!安全,谁之责?(下)
  • 微信小程序设置上一页数据
  • 为视图添加丝滑的水波纹
  • kubernetes资源对象--ingress
  • ​批处理文件中的errorlevel用法
  • ​如何使用ArcGIS Pro制作渐变河流效果
  • ​数据结构之初始二叉树(3)
  • ###51单片机学习(2)-----如何通过C语言运用延时函数设计LED流水灯
  • #laravel 通过手动安装依赖PHPExcel#
  • #数据结构 笔记三
  • $Django python中使用redis, django中使用(封装了),redis开启事务(管道)
  • (04)Hive的相关概念——order by 、sort by、distribute by 、cluster by
  • (20)目标检测算法之YOLOv5计算预选框、详解anchor计算
  • (Java)【深基9.例1】选举学生会
  • (k8s中)docker netty OOM问题记录
  • (react踩过的坑)Antd Select(设置了labelInValue)在FormItem中initialValue的问题
  • (附源码)spring boot球鞋文化交流论坛 毕业设计 141436
  • (附源码)ssm户外用品商城 毕业设计 112346
  • (附源码)ssm失物招领系统 毕业设计 182317
  • (论文阅读26/100)Weakly-supervised learning with convolutional neural networks
  • (四)【Jmeter】 JMeter的界面布局与组件概述