Go语言学习之路-9-结构体

什么是结构体

回顾下slice和map他们都是单类型的数组

func main() {
// 切片或者数组的类型只能存一种
s1 := []int{0, 1, 2, 3, 4, 5}
// map也是一样它的这个类型的值也只能是单类型的
m1 := map[string]string{"name": "eson", "addr": "hebei"}

fmt.Println(s1, m1)
}

那若是想存储多种类型怎么办?使用结构体:structui

// Person struce save person property
type Person struct {
name string
age int
}

func main() {
p1 := Person{name: "eric", age: 18}
fmt.Printf("%v\n", p1)
}

总结下:spa

结构体是一组数据,它是一个复合类型(每一个数据有本身的类型)指针

自定义类型&类型别名

除了标准的:字符串、数字、小数、布尔值咱们能够经过type关键字自定义类型code

// PersonAge 自定义一个类型它有uint8的全部特性
type PersonAge uint8

类型别名go1.9版本以后的新功能内存

package main

import "fmt"

// NewAge 自定义类型
type NewAge uint

// PersonAge go1.9以后引用了类型别名
// 类型别名规定:TypeAlias只是Type的别名,本质上TypeAlias与Type是同一个类型。
type PersonAge = uint8

func main() {
var a1 NewAge
var a2 PersonAge

fmt.Printf("自定义类型: %T\n", a1) // 自定义类型: main.NewAge
fmt.Printf("类型的别名: %T\n", a2) // 类型的别名: uint8
}

类型别名规定:TypeAlias只是Type的别名,本质上TypeAlias与Type是同一个类型。比如一我的自己有中文名字又启用了一个英文名字,这个应为名字指向也是同一我的字符串

区别:string

自定义类型是一个独立的数据类型,可是类型别名他的类型仍是它指向的数据类型class

使用结构体

定义结构体

type 类型名 struct {
    字段名 字段类型
    字段名 字段类型
    …
}

解释:import

  • 类型名:标识自定义结构体的名称,在同一个包内不能重复
  • 字段名:标识结构体字段名。同一个结构体内的字段名必须惟一
  • 字段类型:标识结构体字段的具体类型
type Person struct {
	name string
	age  uint
}

声明使用

标准声明方式

func main() {
	// 标准声明方式
        // 当咱们定义了一个变量后默认就使用了这个结构体的零值
	var p1 Person
	fmt.Printf("%v\n", p1)
	p1.name = "eric"
	fmt.Printf("%v\n", p1)
}

实例化指针

func main() {
	// p1 := new(Person) 
	// 或者采用
	p1 := &Person{}
	fmt.Printf("%v\n", p1)
}

new或者取址符会返回一个指针类型的结构体,什么使用指针类型的结构体呢?

  • 结构体很大的时候不但愿每次使用的时候都COPY一分内存数据

实例化先声明一个变量在赋值(没有初始化实例化通常都会使用零值),初始化是在声明的时候就赋值

初始化声明(经常使用)

package main

import "fmt"

type person struct {
	name string
	age  int
}

func main() {
	// 键值对初始化
	p1 := person{name: "eson", age: 18}

	// 列表初始化
	p2 := person{"eric", 18}

	// 指针初始化(&或new)
	p3 := &person{name: "fire", age: 18}

	fmt.Printf("%v,%v,%v", p1, p2, p3)
}

匿名结构体

在一些须要临时使用一个结构体的场景的时候,可使用匿名结构体

package main

import "fmt"

func main() {
	// 匿名结构体
	var user struct {
		name string
		age  int
	}
	user.name = "eson"
	user.age = 18
	// user的类型是: struct { name string; age int }
	fmt.Printf("user的类型是: %T\n", user)
	// user的值:{eson 18}
	fmt.Printf("user的值:%v\n", user)
}
相关文章
相关标签/搜索