struct

数组、切片和映射对于混合不同类型的值没有帮助。它们只能保存一种类型。

一个struct(structure的简称)是一个由其他不同的多种值构造出来的。鉴于切片可能只能保存string类型,而映射可能只能保存int类型,你可以创建一个struct保存string、int、float64、bool等多种类型——所有的都在一个方便的组中。

声明

使用struct关键字来声明一个struct类型,后面跟着花括号。在括号中,你可以定义一个或多个字段:struct组合的值。每一个字段定义在一个单独的行,由字段名称、后面跟着的字段需要保存的值类型组成。

image-20201030100336552

(使用已经定义好的类型来定义struct变量更加常见,但是此处我们不会涵盖更多的类型定义,所以我们先这么写。)


使用点运算符访问struct字段

我们可以使用点运算符来标识属于struct的字段。这也可以用于对它们的赋值和检索。

image-20201030100825348

package main

import "fmt"

var stu struct{
	age int
	name string
}
func main() {
	stu.age=12
	stu.name="aaa"
	fmt.Printf("%#v",stu)
}

image-20201030100957937


  • 类型定义允许你自己创建新的类型。你可以基于基础类型来创建新的定义类型。
  • 为了定义一个类型,需要使用type关键字,后面跟着新类型的名字,然后是你希望基于的基础类型。如果你使用struct类型作为你的基础类型,你需要使用struct关键字,后面跟着以花括号包裹的一组字段定义,就像你声明struct变量时所做的那样。
    • image-20201030101523646
  • 就像变量,类型定义可以被放在一个函数中。但是把它的作用域限定在该函数块中,意味着你不能在函数外面使用。所以类型经常定义在函数外的包级别。
  • 如果你已经在当前包定义了一个名为car的类型,并且你同时也声明了一个名为car的变量,这个变量会遮盖类型名称,使后者无法被访问。

image-20201030101849298

类型遮盖是一个令人疑惑的问题,所以最好知道它是会发生的。

  • 事实上,使用点运算符在struct指针和struct上都可访问字段。
package main

import "fmt"

type stu struct{
	age int
	name string
}

func set(p *stu)  {
	p.name="aa"
	p.age=2
}
func main() {
	p:=stu{
		age:  0,
		name: "",
	}
	set(&p)
	fmt.Printf("%#v",p)
}

image-20201030102523098


导出类型

  • 定义类型的名称首字母必须大写才能导出该类型
package page
type Stu struct{
	Age int
	Name string
}

---

package main

import (
	"awesomeProject/src/page"
	"fmt"
)

func set(p *page.Stu)  {
	p.Name="aa"
	p.Age=2
}
func main() {
	p:= page.Stu{
		Age:  0,
		Name: "",
	}
	set(&p)
	fmt.Printf("%#v",p)
}

image-20201030103745007

  • 如果一个类型希望在它被定义的包之外访问,它必须是被导出的:它的名字必须以大写字母开头。
  • 即使一个struct类型被从包中导出,如果它的字段名称没有首字母大写的话,它的字段也不会被导出。

struct字面量

Go提供了struct字面量来让你创建一个struct并同时给它的字段赋值。

image-20201030104114492

p:= page.Stu{
		Age:  0,
		Name: "",
	}

将struct作为字段增加到另一个类型中

package page
type Stu struct{
   Age int
   Name string
}
type stu struct {
   s1 Stu
   ina int
}
  • 在struct类型中增加一个struct类型字段与增加其他类型字段相同。你提供一个字段名称,后面跟上字段类型
package main

import (
	"awesomeProject/src/page"
	"fmt"
)
type stu struct {
	s1 page.Stu
	ina int
}
func main() {
	var s1 = stu{
		s1: page.Stu{
			Name: "a",
			Age: 1,
		},
		ina: 2,
	}
	s1.s1.Name="b"
	fmt.Printf("%#v",s1)
}


package page
type Stu struct{
	Age int
	Name string
}

image-20201030104825150


匿名struct字段

通过外部struct访问内部struct的字段的代码有点乏味。想要访问内部struct的字段的时候,不得不每次都输入代表struct的字段的名称.

Go允许定义一个匿名字段:struct字段没有名字,仅仅有类型。我们可以使用匿名字段来让内部struct访问更加简单。

package main

import (
	"awesomeProject/src/page"
	"fmt"
)
type stu struct {
	page.Stu
	ina int
}
func main() {
	var s1 = stu{
		ina: 2,
		Stu:page.Stu{
			Name: "1",
			Age: 2,
		},
	}
	s1.Name="a"
	fmt.Printf("%#v",s1)
}

image-20201030110151636



本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!

定义类型 上一篇
映射 下一篇