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)
}
相關文章
相關標籤/搜索