指针
指针操作
-
指针包括指针地址、指针类型和指针取值
-
&: &符号放在变量前面进行取地址操作
-
**:*放在变量前面根据地址进行取值
指针地址:
func main() {
var a int = 1
// a的值是1--类型是int--,地址是0xc0000120c0,&是地址符号
fmt.Printf("a的值是%v--类型是%T--,地址是%p \n", a, a, &a)
// 指针变量:指针一种特殊的变量,存储的数据是另一个变量的地址
// 值类型的数据都有对应的指针类型,例如*int、*int64、*string 等
var b = &a
// b的值是0xc0000120c0--类型是*int--,地址是0xc000056028
// *int:int的指针类型,*代表指针
// go中所有的变量都有自己的内存地址,指针变量也有自己的地址
fmt.Printf("b的值是%v--类型是%T--,地址是%p \n", b, b, &b)
}
指针取值:
a := 1
b := &a // 指针变量
// // b的值是a的内存地址,通过*b打印该内存地址对应的值,也就是a的值
fmt.Println(*b) // 1
//通过内存地址改变值
*b = 3
fmt.Println(a) //3
make和new
所有的引用数据类型必须要分配内存空间才能赋值使用,指针也是引用数据类型
new:
new是一个内置函数,作用是动态地分配内存,返回该指针的地址,值是对应类型指针的零值
// new 的参数就是数据类型,得到的是一个对应的零值的指针
var num = new(bool)
fmt.Println(num) // 0xc00009e012
fmt.Printf("%T \n", num) // *bool
fmt.Println(*num) // false
*num = true
fmt.Println(*num) // true
make:
make和new的区别:
-
make 只用于 slice、map 以及 channel 的初始化,返回的还是这三个引用类型本身
-
new 用于类型的内存分配,并且内存对应的值为类型零值,返回的是指向类型的指针
结构体
Golang 中没有“类”的概念,Golang 中的结构体和其他语言中的类有点相似。和其他面向对
象语言中的类相比,Golang 中的结构体具有更高的扩展性和灵活性。
Golang 中的基础数据类型可以表示一些事物的基本属性,但是当我们想表达一个事物的全
部或部分属性时,这时候再用单一的基本数据类型就无法满足需求了,Golang 提供了一种
自定义数据类型,可以封装多个基本数据类型,这种数据类型叫结构体,英文名称 struct。
也就是我们可以通过 struct 来定义自己的类型
类型别名:
// 自定义类型
type myInt int
// 类型别名 通过赋值给类型取一个别名
type myFloat = float64
func main() {
var a myInt = 1
var b myFloat = 3.14
//区别在于一个类型是自定义的类型,一个还是原类型
fmt.Printf("%T \n", a) // main.myInt
fmt.Printf("%T", b) // float64
}
结构体定义
• 类型名:表示自定义结构体的名称,在同一个包内不能重复。
• 字段名:表示结构体字段名。结构体中的字段名必须唯一。
•