当前位置:网站首页>Go-9-数据类型-函数
Go-9-数据类型-函数
2022-08-09 01:26:00 【hahyyy】
Go的数据类型分为四大类
- 基础类型
- 数字、字符串、布尔型
- 聚合类型
- 数组、结构体
- 引用类型
- 指针、slice、map、函数、管道
- 接口类型
变量定义
Go语言是静态类型的,变量声明时必须明确变量的类型
Go语言与其他语言显著不同的一个地方在于,Go语言的类型在变量后面
var a int // 如果没有赋值,默认为0
var b int = 1 // 声明时赋值
var c = 1 // 声明时赋值
d := 1 // 只能在函数体中使用
msg := "hello world" // 只能在函数体中使用
var e, f int = 1, 2 // 一次声明多个变量注意:
- 变量需要定义后再使用
- :=左侧的变量不应该时已经被声明过的,否则会导致编译错误
- 变量定义后没有使用编译会失败
- go会根据值确定类型,也会根据类型自动确认值
nil零值
nil是go语言中预先的标识符,我们可以直接使用nil,而不用声明它
nil的意思是无,或者是零值
nil的值类型必须是指针、通道、func、接口、映射或切片类型
在go语言中,如果你声明了一个变量但是没有对它进行赋值操作,那么这个变量就会有一个类型的默认零值,每种类型都有不同对应的零值
bool -- false
int -- 0
string -- “”
其他的默认都是nil
指针
指针即某个值的地址,类型定义时使用符号*,对一个已经存在的变量,使用&获取该变量的地址
一般来说,指针通常在函数传递参数,或者给某个类型定义新的方法时使用
go语言中,参数是按值传递的,如果不使用指针,函数内部会拷贝一份参数的副本,对参数的修改不会影响到外部变量的值,如果参数使用指针,对参数的传递将会影响到外部变量
package main
import "fmt"
func main(){
// 指针
var p *string
p = &msg
fmt.Println(p)
// 修改指针指向对象的值
*p = "Hello"
fmt.Println(*p, msg)
num := 100
add(num)
fmt.Println(num)
realAdd(&num)
fmt.Println(num)
}
func add(num int){
num += 1
}
func realAdd(num *int){
*num += 1
}
# 返回的num分别是100 101函数定义
go语言函数定义格式如下
func function_name([parameter list]) [return_types] {
函数体
}函数定义解析:
- func:函数由func开始声明
- function_name:函数名称,参数列表和返回值类型构成了函数签名
- parameter list:参数列表,参数就像一个占位符,当函数被调用时,可以将值传递给参数,这个值被称为实际参数。参数列表指定的是参数类型、顺序、及参数个数。参数是可选的,也就是说函数也可以不包含参数
- return_types:返回类型,函数返回一列值。return_types是该列值的数据类型。有些功能不需要返回值,这种情况下return_types不是必须的
- 函数体:函数定义的代码集合
| 函数参数类型 | 函数内对形参操作,是否影响实参 |
| 变量 | 否 |
| 指针 | 是 |
| 数组 | 否 |
| 数组元素 | 否 |
| slice | 是 |
参数与返回值
一个典型的函数,使用关键字func,参数可以由多个,返回值也支持有多个
- 无返回值的函数
- 对于无返回值的函数,函数体中不需要也不能进行return返回
- 实现2个数的加法和除法
- 返回值的数量及类型需要与声明的一致
package main
import "fmt"
func main() {
fmt.Println(add2(1,2))
fmt.Println(add3(3,1))
}
func add2(num1 int, num2 int) (int, int) {
return num1 + num2 , 100
}
func add3(num1 int, num2 int) (ans int, ans2 int) {
ans = num1 + num2
ans2 = num1 - num2
return
}
- 实现:可变长参数
package main
import "fmt"
func main() {
add4(1,2,3,4,5)
}
func add4(nums ... int){
fmt.Println(reflect.TypeOf(nums))
fmt.Println(len(nums))
fmt.Println(nums)
}
边栏推荐
猜你喜欢
![class path resource [bean.xml] cannot be opened because it does not 错误解决方案](/img/e2/6430a511998944a3357984b554b00c.png)
class path resource [bean.xml] cannot be opened because it does not 错误解决方案

TCP/IP协议栈

Discourse 的关闭主题(Close Topic )和重新开放主题

Using MySQL in Ubuntu/Linux environment: Solve the problem of com.mysql.jdbc.PacketTooBigException: Packet for query is too large

经典卷积神经网络ZFNet--解卷积可视化
![ONNX是什么?怎么用?[简明解读版]](/img/e3/ce8c24e43c90dda6a391b52246537b.png)
ONNX是什么?怎么用?[简明解读版]

论文笔记:SAITS: SELF-ATTENTION-BASED IMPUTATION FOR TIMESERIES

Mysql高级篇(逻辑架构和存储引擎)

C语言-大端存储和小端存储

容器运维平台的故障处理-1
随机推荐
typescripet92-添加任务功能优化
有相同字符串的查找
5-2 Seaborn 分类绘图
面试秘籍 | 软件测试必备的mysql数据库技术
《LC刷题总结》——贪心
轻量级网络ESPNet系列 空洞卷积简介
LeetCode每日一题:搜索插入位置 (均1200道)方法:二分查找
ABAP 报表中如何以二进制方式上传本地文件
走向合规化的虚拟人直播
4-7 Matplotlib库 箱线图
js文件的处理
Transformer前言:self-attention与Multi-Headed Attention的详细理解
4-4 Matplotlib库 直方图
LeetCode每日两题02:第一个错误的版本 (均1200道)方法:二分查找
德语翻译器在线翻译中文
进程和线程
d初化模板构造器
字符串压缩
5-3 Seaborn 分布绘图
等到中心化的平台不再,衍生于这个平台的一切都将化作泡影