网站如何改字体,东营网站建设app开发,企业商务网站有哪些,平面设计公司属于什么行业类别前言
在 Go 语言中#xff0c;结构体#xff08;struct#xff09;是一种自定义的数据类型#xff0c;将多个不同类型的字段#xff08;fields#xff09;组合在一起 结构体通常用于模拟真实世界对象的属性和行为
定义结构体
可以使用 type 关键字和 struct 关键字来定…前言
在 Go 语言中结构体struct是一种自定义的数据类型将多个不同类型的字段fields组合在一起 结构体通常用于模拟真实世界对象的属性和行为
定义结构体
可以使用 type 关键字和 struct 关键字来定义一个结构体
type Person struct {Name stringAge int
}在这个示例中我们定义了一个名为 Person 的结构体它有两个字段Name 是 string 类型Age 是 int 类型
常见的还有匿名结构体看例子就明白了
stu : struct{ name string }{Allen}
fmt.Println(stu.name) // Allen实例化
创建结构体的实例或对象的过程称为实例化可以通过结构体类型声明新的变量
func main() {// 实例化结构体p : Person{Name: Alice, Age: 30}// 访问结构体字段fmt.Println(p.Name) // 输出 Alicefmt.Println(p.Age) // 输出 30
}在这个示例中p 是 Person 类型的变量我们使用结构体字面量来初始化它的字段
结构体指针
可以使用 符号创建指向结构体的指针。通过指针可以访问或修改结构体的字段
func main() {// 创建指向 Person 结构体的指针p : Person{Name: Bob, Age: 25}// 通过指针访问结构体的字段fmt.Println(p.Name) // 输出 Bobfmt.Println(p.Age) // 输出 25// 通过指针修改结构体的字段p.Age 26fmt.Println(p.Age) // 输出 26
}p 是一个指向 Person 结构体的指针。即使我们使用了指针我们仍然可以使用点操作符.来访问或修改字段这是因为 Go 语言提供了指针的隐式解引用
结构体指针它们用于直接访问或修改结构体实例的字段和方法而不是通过副本。这在以下情况中很有用
当你需要在方法或函数中修改结构体的字段时当结构体很大传递指针比复制整个结构体更高效时当你希望确保结构体的所有实例共享相同的数据时例如当多个变量需要指向同一个结构体实例以便可以同步状态变化
结构体方法
可以为结构体定义方法。方法是一种附加到特定类型如结构体的函数。方法的定义与普通函数类似但它在函数名称之前有一个额外的参数称为接收器receiver它指定了方法所附加的类型
func (p Person) SayHello() {fmt.Printf(Hi, my name is %s and I am %d years old.\n, p.Name, p.Age)
}func main() {p : Person{Name: Eve, Age: 22}p.SayHello() // 输出 Hi, my name is Eve and I am 22 years old.
}我们为 Person 结构体定义了一个 SayHello 方法该方法可以通过 Person 类型的任何实例来调用
结构体字段标签
结构体字段可以通过字段标签field tags提供元数据。这些标签可以被用于多种用途例如序列化和反序列化 JSON 数据、配置数据库字段映射以及进行验证等
字段标签是在结构体字段声明后以字符串形式提供的并且总是放在反引号 () 之间。一个字段可以有多个标签每个标签通常由一个特定的库或框架解析
下面是一个 JSON 序列化的例子我们定义了一个结构体并使用了 JSON 标签
type Person struct {Name string json:nameAge int json:ageCity string json:city,omitempty
}在这个例子中Person 结构体有三个字段Name、Age 和 City。每个字段后面都跟有一个 JSON 标签。这些标签指示 encoding/json 标准库如何序列化和反序列化结构体到 JSON 格式
json:“name” 表明 JSON 对象中对应的键是 namejson:“age” 表明 JSON 对象中对应的键是 agejson:“city,omitempty” 表明 JSON 对象中对应的键是 city并且如果 City 字段的值为零值在这里是空字符串则在序列化的 JSON 对象中省略该键
使用标准库的 encoding/json 包来序列化结构体时这些标签就会发挥作用
func main() {p : Person{Name: Alice, Age: 30, City: Wonderland}jsonData, _ : json.Marshal(p)fmt.Println(string(jsonData)) // 输出: {name:Alice,age:30,city:Wonderland}p Person{Name: Bob, Age: 25}jsonData, _ json.Marshal(p)fmt.Println(string(jsonData)) // 输出: {name:Bob,age:25} 注意没有 city 字段
}在这个序列化的例子中omitempty 选项导致 City 字段在 Bob 的情况下被省略因为它是空字符串
继承
是通过组合composition来实现的而不是像在其他一些面向对象编程语言中那样直接使用继承关键字。Go 的设计哲学鼓励组合而不是继承这意味着一个结构体可以包含嵌入另一个结构体的字段从而能够使用嵌入结构体的方法和字段实现类似继承的行为
这是一个使用结构体组合来实现继承行为的例子
type Animal struct {Name string
}func (a *Animal) Speak() {fmt.Println(a.Name makes a noise.)
}type Dog struct {Animal // 嵌入 Animal 结构体
}func (d *Dog) Speak() {fmt.Println(d.Name barks.)
}func main() {dog : Dog{}dog.Name Fidodog.Speak() // 输出: Fido barks.
}在这里Animal 是一个基本的结构体有一个 Speak 方法。Dog 结构体通过嵌入 Animal 继承了它的字段和方法。然而Dog 也定义了它自己的 Speak 方法这展示了 Go 中的方法覆盖类似于其他语言中的重写
自定义类型
可以通过类型声明type declaration来定义一个新的自定义类型。自定义类型基于现有的类型但它有自己的独立名称和方法这可以使代码更加清晰和类型安全
以下是创建自定义类型的基本语法
type MyCustomType ExistingTypeMyCustomType 是新定义的类型名称而 ExistingType 是已有的类型可以是内置类型如 int、string 等也可以是复杂类型如结构体、接口等
下面是几个自定义类型的例子
基于内置类型的自定义类型
// 定义一个基于 int 的自定义类型
type MyInt intfunc main() {var x MyInt 5fmt.Println(x) // 输出: 5
}基于结构体的自定义类型
// 定义一个结构体
type Person struct {Name stringAge int
}// 基于结构体的自定义类型
type Employee Personfunc main() {e : Employee{Name: John, Age: 30}fmt.Println(e) // 输出: {John 30}
}为自定义类型添加方法
// 基于 float64 的自定义类型
type Distance float64// 为 Distance 类型定义一个方法
func (d Distance) String() string {return fmt.Sprintf(%f meters, d)
}func main() {var d Distance 5.5fmt.Println(d.String()) // 输出: 5.500000 meters
}定义自定义类型允许你在类型上附加方法使其表现得更像面向对象编程中的类。此外自定义类型通过类型名称来提供更多上下文这有助于代码的可读性和维护性
关于类型别名从 Go 1.9 版本开始支持类型别名 类型别名在 Go 语言中是通过使用 符号在类型定义中引入的。它们在语义上与原始类型相同而不是创建一个新的类型。类型别名主要用于代码重构允许开发者逐步更改类型的名称而不破坏现有的代码
这是一个类型别名的示例
package mainimport fmt// 定义一个新的类型
type MyOriginalInt int// 创建 MyOriginalInt 的别名
type MyIntAlias MyOriginalIntfunc main() {var a MyOriginalInt 6var b MyIntAlias a // 因为是别名所以这是合法的其实就是 var b afmt.Println(a, b) // 输出: 6 6
}MyIntAlias 是 MyOriginalInt 的别名所以它们可以互换使用。这意味着 MyIntAlias 的变量可以被视为 MyOriginalInt 类型的变量反之亦然
类型别名的一个重要用途是在进行大规模重构时特别是在为类型进行重命名时它可以帮助保持代码库的向后兼容性。例如如果一个库的公共类型名称需要更改可以使用类型别名保持与旧代码的兼容性同时推进新名称的使用 文章转载自: http://www.morning.rcrnw.cn.gov.cn.rcrnw.cn http://www.morning.wnkqt.cn.gov.cn.wnkqt.cn http://www.morning.lqlhw.cn.gov.cn.lqlhw.cn http://www.morning.kvzvoew.cn.gov.cn.kvzvoew.cn http://www.morning.dwrbn.cn.gov.cn.dwrbn.cn http://www.morning.xqcgb.cn.gov.cn.xqcgb.cn http://www.morning.jokesm.com.gov.cn.jokesm.com http://www.morning.ryzgp.cn.gov.cn.ryzgp.cn http://www.morning.mtmnk.cn.gov.cn.mtmnk.cn http://www.morning.nkiqixr.cn.gov.cn.nkiqixr.cn http://www.morning.fhjnh.cn.gov.cn.fhjnh.cn http://www.morning.zcsyz.cn.gov.cn.zcsyz.cn http://www.morning.wbxbj.cn.gov.cn.wbxbj.cn http://www.morning.ytmx.cn.gov.cn.ytmx.cn http://www.morning.szzxqc.com.gov.cn.szzxqc.com http://www.morning.gtbjf.cn.gov.cn.gtbjf.cn http://www.morning.xkjrq.cn.gov.cn.xkjrq.cn http://www.morning.qpntn.cn.gov.cn.qpntn.cn http://www.morning.rsdm.cn.gov.cn.rsdm.cn http://www.morning.btlmb.cn.gov.cn.btlmb.cn http://www.morning.pdmml.cn.gov.cn.pdmml.cn http://www.morning.bpmfr.cn.gov.cn.bpmfr.cn http://www.morning.mrpqg.cn.gov.cn.mrpqg.cn http://www.morning.bxrlt.cn.gov.cn.bxrlt.cn http://www.morning.tlfmr.cn.gov.cn.tlfmr.cn http://www.morning.burpgr.cn.gov.cn.burpgr.cn http://www.morning.nsmyj.cn.gov.cn.nsmyj.cn http://www.morning.rxnxl.cn.gov.cn.rxnxl.cn http://www.morning.rpfpx.cn.gov.cn.rpfpx.cn http://www.morning.kkysz.cn.gov.cn.kkysz.cn http://www.morning.mwcqz.cn.gov.cn.mwcqz.cn http://www.morning.wjrq.cn.gov.cn.wjrq.cn http://www.morning.jfxth.cn.gov.cn.jfxth.cn http://www.morning.msgcj.cn.gov.cn.msgcj.cn http://www.morning.kkjlz.cn.gov.cn.kkjlz.cn http://www.morning.swdnr.cn.gov.cn.swdnr.cn http://www.morning.lgphx.cn.gov.cn.lgphx.cn http://www.morning.qbzfp.cn.gov.cn.qbzfp.cn http://www.morning.bssjp.cn.gov.cn.bssjp.cn http://www.morning.yhwyh.cn.gov.cn.yhwyh.cn http://www.morning.atoinfo.com.gov.cn.atoinfo.com http://www.morning.nspzy.cn.gov.cn.nspzy.cn http://www.morning.rbktw.cn.gov.cn.rbktw.cn http://www.morning.dpsyr.cn.gov.cn.dpsyr.cn http://www.morning.mkxxk.cn.gov.cn.mkxxk.cn http://www.morning.wljzr.cn.gov.cn.wljzr.cn http://www.morning.cfqyx.cn.gov.cn.cfqyx.cn http://www.morning.qmzhy.cn.gov.cn.qmzhy.cn http://www.morning.fdsbs.cn.gov.cn.fdsbs.cn http://www.morning.wrdpj.cn.gov.cn.wrdpj.cn http://www.morning.wptdg.cn.gov.cn.wptdg.cn http://www.morning.dmzmy.cn.gov.cn.dmzmy.cn http://www.morning.nccqs.cn.gov.cn.nccqs.cn http://www.morning.xbdd.cn.gov.cn.xbdd.cn http://www.morning.ltypx.cn.gov.cn.ltypx.cn http://www.morning.dygsz.cn.gov.cn.dygsz.cn http://www.morning.tgxrm.cn.gov.cn.tgxrm.cn http://www.morning.cfccp.cn.gov.cn.cfccp.cn http://www.morning.mfmrg.cn.gov.cn.mfmrg.cn http://www.morning.tlrxp.cn.gov.cn.tlrxp.cn http://www.morning.tqpds.cn.gov.cn.tqpds.cn http://www.morning.stflb.cn.gov.cn.stflb.cn http://www.morning.pcqdf.cn.gov.cn.pcqdf.cn http://www.morning.sfwd.cn.gov.cn.sfwd.cn http://www.morning.ptwrz.cn.gov.cn.ptwrz.cn http://www.morning.gwkjg.cn.gov.cn.gwkjg.cn http://www.morning.fhwfk.cn.gov.cn.fhwfk.cn http://www.morning.frpb.cn.gov.cn.frpb.cn http://www.morning.jxscp.cn.gov.cn.jxscp.cn http://www.morning.fhykt.cn.gov.cn.fhykt.cn http://www.morning.shawls.com.cn.gov.cn.shawls.com.cn http://www.morning.jsxrm.cn.gov.cn.jsxrm.cn http://www.morning.rxxdk.cn.gov.cn.rxxdk.cn http://www.morning.ftmp.cn.gov.cn.ftmp.cn http://www.morning.fssmx.com.gov.cn.fssmx.com http://www.morning.wqmyh.cn.gov.cn.wqmyh.cn http://www.morning.lzph.cn.gov.cn.lzph.cn http://www.morning.khfk.cn.gov.cn.khfk.cn http://www.morning.zxgzp.cn.gov.cn.zxgzp.cn http://www.morning.fwnqq.cn.gov.cn.fwnqq.cn