- 首选要大写结构体
- 在调用的函数中导入包
文件:stu.go
package mystudy
// 这里要大写大写
type Stu struct{
name string
age int
}
/// 调用
文件main.go
package main
import “模块名称/mystudy”
func main(){
var st mystudy.Stu = mystudy.Stu{“lisi”, 22}
}
方案2:针对小写的结构体如何对外使用呢,这里借助一个桥梁,就是对外开放的函数
- 首先定义结构体
- 定义一个外部可以访问的函数
- 访问函数以修改结构体
定义 mystudy.go
package mystudy
// 面向对象 结构体之方法
import “fmt”
type teacher struct{
Name string
age int
}
func InitTeacher(name string, age int)*teacher{
return &teacher{name, age}
}
func DemoObjStruct(){
var te *teacher
te = &teacher{“wagn”, 22}
fmt.Println(te)
(*te).Name = “www”
fmt.Println(te)
}
定义主函数
package main
import (
“fmt”
“com.gdzs/goproject/src/com/gdzs/mystudy”
)
func main(){
te := mystudy.InitTeacher(“青青”, 28)
fmt.Println(te)
(*te).Name = “qingqing”
// 也可以写成 te.Name = “qingqing”
fmt.Println(te)
}
// 输出结果
&{青青 28}
&{qingqing 28}
注意
- 以上的teacher的属性需要首字母大写,主函数中才可以使用te.Name修改,如果是小写则无法访问,就会报如下错误
main.go:86:8: (*te).name undefined (type mystudy.teacher has no field or method name)
- 注意声明的时候,不能使用var xxx mystudy.teacher,因为这个结构体是不对外使用的,所以只能使用xxx:=xx这种隐式声明类型的方式。
1.6结构体嵌入
1.6.1 嵌入方式1:匿名结构体
结构体嵌入(Struct embedding)是一种在一个结构体中嵌入另一个结构体的方式,以便通过嵌入的结构体来访问其字段和方法。
通过结构体嵌入,可以将一个结构体类型作为另一个结构体的字段,使得被嵌入的结构体的字段和方法成为了外部结构体的一部分,就好像它们是直接定义在外部结构体中一样。
使用结构体嵌入的主要目的是实现代码的重用和组合。通过嵌入结构体,可以将通用的字段和方法提取到一个单独的结构体中,并在其他结构体中嵌入该结构体,从而实现代码的复用,并且可以通过外部结构体访问嵌入结构体的字段和方法。
package mystudy
// 结构体嵌入知识点
import “fmt”
type Animal struct{
Name string
Age int
}
func getAnimal(name string, age int)*Animal{
return &Animal{name, age}
}
func(a Animal) eat(){
fmt.Println(a.Name, “吃东西”)
}
type Dog struct{
Animal // 嵌入结构体
weight int
}
func (d Dog) call(){
fmt.Println(d.Name,“叫了一声,说她的体重是:”,d.weight)
}
func (d *Dog) setWight(weight int){
(*d).weight = weight
fmt.Println(d.weight)
}
func DemoQianru(){
// 声明方式1
var d Dog = Dog{Animal{“花花”, 22}, 108}
fmt.Println(d)
// 声明方式2
// 在 Go 语言中,结构体的字段初始化可以按照顺序进行赋值。
// 但是在嵌套结构体中,如果嵌入的结构体没有指定字段名,
// 那么在初始化时不能省略字段名。
var d2 Dog = Dog{Animal:Animal{“兰兰”, 22}, weight:108}
fmt.Println(d2)
d.setWight(99)
fmt.Println(d)
// 声明方式3使用指针
var d3 *Dog = &Dog{Animal:Animal{“雨雨”, 22}, weight:108}
(*d3).setWight(98)
fmt.Println((*d3))
}
嵌入的结构体可以通过变量直接调用,如上代码所示
// 访问方式1
d2.weight
// 访问方式2
d2.Animal.Name
对于指针,这几种方式调用都是可以使得
对于指针,这几种方式调用都是可以使得s
fmt.Println(d3.Animal.Name)
fmt.Println(d3.Name)
fmt.Println((*d3).Name)
1.7.2结构体嵌入:当作一个字段
- 一个结构体当作一个类型来嵌入结构体中
type Dog struct {
a Animal // Animal结构体被嵌入到Dog结构体中
}
- 声明和调用方法
- 声明:var c1 = cat{Animal{“猫猫”, 19}, 180}
- 调用方式:c1.a.XXX
package mystudy
// 结构体嵌入知识点
import “fmt”
type Animal struct{
Name string
Age int
}
func getAnimal(name string, age int)*Animal{
return &Animal{name, age}
}
func(a Animal) eat(){
fmt.Println(a.Name, “