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)
}
文章评论