当前位置: 首页 > news >正文

白酒网站模版软文营销成功案例

白酒网站模版,软文营销成功案例,网站做等级保护,模板支架图片结构体简介 Golang 中没有“类”的概念#xff0c;Golang 中的结构体和其他语言中的类有点相似。和其他面向对象语言中的类相比#xff0c;Golang 中的结构体具有更高的扩展性和灵活性。 Golang 中的基础数据类型可以表示一些事物的基本属性#xff0c;但是当我们想表达一…结构体简介 Golang 中没有“类”的概念Golang 中的结构体和其他语言中的类有点相似。和其他面向对象语言中的类相比Golang 中的结构体具有更高的扩展性和灵活性。 Golang 中的基础数据类型可以表示一些事物的基本属性但是当我们想表达一个事物的全部或部分属性时这时候再用单一的基本数据类型就无法满足需求了Golang 提供了一种自定义数据类型可以封装多个基本数据类型这种数据类型叫结构体英文名称 struct。也就是我们可以通过 struct 来定义自己的类型了。 type 关键词自定义类型和类型别名 Golang 中通过 type 关键词定义一个结构体在讲解结构体之前我们首先给大家看看通过type 自定义类型以及定义类型别名。 自定义类型 在 Go 语言中有一些基本的数据类型如 string、整型、浮点型、布尔等数据类型 Go 语言中可以使用 type 关键字来定义自定义类型。 type myInt int上面代码表示将 myInt 定义为 int 类型通过 type 关键字的定义myInt 就是一种新的类型它具有 int 的特性。 类型别名 Golang1.9 版本以后添加的新功能。 类型别名规定TypeAlias 只是 Type 的别名本质上 TypeAlias 与 Type 是同一个类型。就像一个孩子小时候有大名、小名、英文名但这些名字都指的是他本人。 type TypeAlias Type我们之前见过的 rune 和 byte 就是类型别名他们的底层定义如下 type byte uint8 type rune int32自定义类型和类型别名的区别 类型别名与自定义类型表面上看只有一个等号的差异我们通过下面的这段代码来理解它们之间的区别。 package mainimport (fmt )// 类型定义 type newInt int// 类型别名 type myInt intfunc main() {var a newIntvar b myIntfmt.Printf(type of a:%T\n, a) //type of a:main.newIntfmt.Printf(type of b:%T\n, b) //type of b:int }结果显示 a 的类型是 main.newInt表示 main 包下定义的 newInt 类型。b 的类型是 int 类型。 下面让我们通过一些具体的例子来帮助你更好地理解Go语言中自定义类型和类型别名的区别。 自定义类型案例 假设我们正在开发一个应用程序需要记录用户的年龄。我们可以创建一个名为Age的新类型基于整数类型 type Age intfunc (a Age) isAdult() bool {return a 18 }func main() {var userAge Age 20fmt.Println(userAge.isAdult()) // 输出: true }在这个例子中Age是一个自定义类型。它不仅限于只是一个整数还拥有自己的方法isAdult()用于判断该年龄是否达到成年标准。即使int类型的值为20也不能直接赋值给Age变量除非显式转换因为它们被视为不同的类型。 类型别名案例 现在考虑我们需要在项目中处理大量的用户ID这些ID实际上是字符串形式的。为了简化代码我们可以为string类型创建一个别名UserID type UserID stringfunc main() {var id UserID user123var str string id // 这里可以直接赋值因为UserID是string的别名fmt.Println(str) // 输出: user123 }在这个例子中UserID是string类型的别名。这意味着UserID和string实际上是同一个类型你可以自由地将一个UserID类型的值赋给一个string类型的变量反之亦然而不需要进行任何类型转换。此外你不能给UserID添加新的方法因为它不是新类型而是现有类型的一个别名。 总结 自定义类型当你想要基于某个已有类型创建一个新的、独立的类型并且可能想为这个新类型添加特定的方法或行为时使用。例如我们的Age类型。类型别名当你想要简化复杂类型的引用或者是在重构过程中希望保持类型兼容性时使用。比如我们的UserID别名。 结构体定义初始化的几种方法 结构体的定义 使用 type 和 struct 关键字来定义结构体具体代码格式如下 type 类型名 struct { 字段名 字段类型 字段名 字段类型 … }其中 类型名表示自定义结构体的名称在同一个包内不能重复。字段名表示结构体字段名。结构体中的字段名必须唯一。字段类型表示结构体字段的具体类型。 举个例子我们定义一个 person人结构体代码如下 type person struct {name stringcity stringage int8 }同样类型的字段也可以写在一行 type person struct { name, city string age int8 }注意结构体首字母可以大写也可以小写大写表示这个结构体是公有的在其他的包里面可以使用。小写表示这个结构体是私有的只有这个包里面才能使用。 结构体实例化第一种方法 只有当结构体实例化时才会真正地分配内存。也就是必须实例化后才能使用结构体的字段。结构体本身也是一种类型我们可以像声明内置类型一样使用 var 关键字声明结构体类型。 var 结构体实例 结构体类型示例代码 package mainimport (fmt )type person struct {name stringcity stringage int8 }func main() {var p1 personp1.name 张三p1.city 北京p1.age 18fmt.Printf(p1%v\n, p1) //p1{张三 北京 18}fmt.Printf(p1%#v\n, p1) //p1main.person{name:张三, city:北京, age:18} }结构体实例化第二种方法 我们还可以通过使用 new 关键字对结构体进行实例化得到的是结构体的地址。 格式如下 package mainimport (fmt )type person struct {name stringcity stringage int8 }func main() {var p2 new(person)p2.name 张三p2.age 20p2.city 北京fmt.Printf(%T\n, p2) //*main.personfmt.Printf(p2%#v\n, p2) //p2main.person{name:张三, city:北京, age }从打印的结果中我们可以看出 p2 是一个结构体指针。 注意在 Golang 中支持对结构体指针直接使用.来访问结构体的成员。p2.name “张三” 其实在底层是(*p2).name “张三”。 结构体实例化第三种方法 使用对结构体进行取地址操作相当于对该结构体类型进行了一次 new 实例化操作。 package mainimport (fmt )type person struct {name stringcity stringage int8 }func main() {p3 : person{}fmt.Printf(%T\n, p3) //*main.personfmt.Printf(p3%#v\n, p3) //p3main.person{name:, city:, age:0}p3.name zhangsanp3.age 30p3.city 深圳(*p3).age 40 //这样也是可以的fmt.Printf(p3%#v\n, p3) //p3main.person{name:zhangsan, city:深圳, age:3 }结构体实例化第四种方法 键值对初始化 package mainimport (fmt )type person struct {name stringcity stringage int8 }func main() {p4 : person{name: zhangsan, city: 北京, age: 18}fmt.Printf(p4%#v\n, p4) //p4main.person{name:zhangsan, city:北京, age:18} }结构体实例化第五种方法 结构体指针进行键值对初始化 package mainimport (fmt )type person struct {name stringcity stringage int8 }func main() {p5 : person{name: zhangsan, city: 上海, age: 28}fmt.Printf(p5%#v\n, p5) //p5main.person{name:zhangsan, city:上海, age:28} }当某些字段没有初始值的时候这个字段可以不写。此时没有指定初始值的字段的 package mainimport (fmt )type person struct {name stringcity stringage int8 }func main() {p6 : person{city: 北京}fmt.Printf(p6%#v\n, p6) //p6main.person{name:, city:北京, age:0} }结构体实例化第六种方法 使用值的列表初始化 package mainimport (fmt )type person struct {name stringcity stringage int8 }func main() {// 初始化结构体的时候可以简写也就是初始化的时候不写键直接写值p7 : person{zhangsan, 北京, 28}fmt.Printf(p7%#v\n, p7) //p7main.person{name:zhangsan, city:北京, age:28} }使用这种格式初始化时需要注意 必须初始化结构体的所有字段。初始值的填充顺序必须与字段在结构体中的声明顺序一致。该方式不能和键值初始化方式混用。 结构体方法和接收者 在 go 语言中没有类的概念但是可以给类型结构体自定义类型定义方法。所谓方法就是定义了接收者的函数。接收者的概念就类似于其他语言中的 this 或者 self。 方法的定义格式如下 func (接收者变量 接收者类型) 方法名(参数列表) (返回参数) { 函数体 }其中 接收者变量接收者中的参数变量名在命名时官方建议使用接收者类型名的第一个小写字母而不是 self、this 之类的命名。例如Person 类型的接收者变量应该命名为 pConnector 类型的接收者变量应该命名为 c 等。接收者类型接收者类型和参数类似可以是指针类型和非指针类型。方法名、参数列表、返回参数具体格式与函数定义相同。 示例代码 package mainimport (fmt )type Person struct {name stringage int8 }func (p Person) printInfo() {fmt.Printf(姓名:%v 年龄:%v, p.name, p.age) } func main() {p1 : Person{name: 小王子, age: 25}p1.printInfo() }运行结果 姓名:小王子 年龄:25值类型的接收者 当方法作用于值类型接收者时Go 语言会在代码运行时将接收者的值复制一份。在值类型接收者的方法中可以获取接收者的成员值但修改操作只是针对副本无法修改接收者变量本身。 指针类型的接收者 指针类型的接收者由一个结构体的指针组成由于指针的特性调用方法时修改接收者指针的任意成员变量在方法结束后修改都是有效的。这种方式就十分接近于其他语言中面向对象中的 this 或者 self。 代码示例 package mainimport (fmt )type Person struct {name stringage int }// 值类型接收者 func (p Person) printInfo() {fmt.Printf(姓名:%v 年龄:%v\n, p.name, p.age) }// 指针类型接收者 func (p *Person) setInfo(name string, age int) {p.name namep.age age } func main() {p1 : Person{name: 小王子, age: 25}p1.printInfo()p1.setInfo(张三, 20)p1.printInfo()p1.setInfo(李四, 24)p1.printInfo() }运行结果 姓名:小王子 年龄:25 姓名:张三 年龄:20 姓名:李四 年龄:24在Go语言中给结构体增加方法时选择值接收者还是指针接收者主要取决于你是否需要在方法内部修改结构体的字段以及关于性能和语义方面的考量。以下是选择哪种方式的一些指导原则 如果需要修改结构体的字段 应该使用指针接收者。因为只有通过指针接收者方法内部对结构体字段的修改才会反映到调用该方法的实例上。例如在你的代码示例中setInfo方法使用了指针接收者这样它才能改变Person实例的name和age属性。 如果方法不修改结构体的字段 通常使用值接收者就足够了。这可以避免不必要的内存分配和复制操作。比如printInfo方法因为它不需要修改结构体的状态所以可以安全地使用值接收者。 关于性能 对于大型结构体来说使用指针接收者可以避免复制整个结构体带来的开销从而提高性能。对于小型结构体如只包含几个基本类型的字段使用值接收者可能更简洁且不会显著影响性能。 一致性 在一个程序中对于同一个类型的方法最好保持一致要么全部使用指针接收者要么全部使用值接收者以避免混淆。特别是当某些方法使用指针接收者而其他方法使用值接收者时可能会导致意外的行为或增加理解难度。 接口实现 如果一个类型实现了某个接口那么无论是使用值接收者还是指针接收者的具体方法都会被认作实现了该接口只要调用时的接收者类型匹配即可。但是为了保持清晰和一致性通常建议所有方法都使用同一种接收者类型值或指针。 我们上面的代码中也能看出printInfo中并没有修改结构体字段因此用的是值类型接收者而setInfo方法中更改了结构体字段用的就是指针类型接收者。 比如我们把上面setInfo方法传入了值类型接收者 package mainimport (fmt )type Person struct {name stringage int }// 值类型接收者 func (p Person) printInfo() {fmt.Printf(姓名:%v 年龄:%v\n, p.name, p.age) }// 指针类型接收者 func (p Person) setInfo(name string, age int) {p.name namep.age age } func main() {p1 : Person{name: 小王子, age: 25}p1.printInfo()p1.setInfo(张三, 20)p1.printInfo()p1.setInfo(李四, 24)p1.printInfo() }运行结果 姓名:小王子 年龄:25 姓名:小王子 年龄:25 姓名:小王子 年龄:25综上所述选择值接收者还是指针接收者主要基于你是否需要在方法内修改结构体的字段、性能考虑以及代码的一致性和可读性。根据具体情况做出合适的选择是很重要的。 给任意类型添加方法 在 Go 语言中接收者的类型可以是任何类型不仅仅是结构体任何类型都可以拥有方法。举个例子我们基于内置的 int 类型使用 type 关键字可以定义新的自定义类型然后为我们的自定义类型添加方法。 package mainimport (fmt )type myInt intfunc (m myInt) SayHello() {fmt.Println(Hello, 我是一个 int。) } func main() {var m1 myIntm1.SayHello() //Hello, 我是一个 int。m1 100fmt.Printf(%#v %T\n, m1, m1) //100 main. }结构体的匿名字段 结构体允许其成员字段在声明时没有字段名而只有类型这种没有名字的字段就称为匿名字段。 代码示例 package mainimport (fmt )// Person 结构体 Person 类型 type Person struct {stringint }func main() {p1 : Person{小王子, 18}fmt.Printf(%#v\n, p1) //main.Person{string:北京, int:18}fmt.Println(p1.string, p1.int) //北京 18 }运行结果 main.Person{string:小王子, int:18} 小王子 18匿名字段默认采用类型名作为字段名结构体要求字段名称必须唯一因此一个结构体中同种类型的匿名字段只能有一个。 嵌套结构体 一个结构体中可以嵌套包含另一个结构体或结构体指针。 package mainimport (fmt )// Address 地址结构体 type Address struct {Province stringCity string }// User 用户结构体 type User struct {Name stringGender stringAddress Address }func main() {user1 : User{Name: 张三, Gender: 男, Address: Address{Province: 广东, City: 深圳}}fmt.Printf(user1%#v\n, user1) //user1main.User{Name: 张 三 , Gender: 男 , Address:main.Address{Province:广东, City:深圳}} }嵌套匿名结构体 package mainimport fmt// Address 地址结构体 type Address struct {Province stringCity string }// User 用户结构体 type User struct {Name stringGender stringAddress // 匿名结构体 }func main() {var user2 Useruser2.Name 张三user2.Gender 男user2.Address.Province 广东 //通过匿名结构体.字段名访问user2.City 深圳 //直接访问匿名结构体的字段名fmt.Printf(user2%#v\n, user2) //user2main.User{Name: 张 三 , Gender: 男 , Address:main.Address{Province:广东, City:深圳 }注意当访问结构体成员时会先在结构体中查找该字段找不到再去匿名结构体中查找。 关于嵌套结构体的字段名冲突 嵌套结构体内部可能存在相同的字段名。这个时候为了避免歧义需要指定具体的内嵌结构体的字段。 package main// Address 地址结构体 type Address struct {Province stringCity stringCreateTime string }// Email 邮箱结构体 type Email struct {Account stringCreateTime string }// User 用户结构体 type User struct {Name stringGender stringAddressEmail }func main() {var user3 Useruser3.Name 张三user3.Gender 男// user3.CreateTime 2020 // ambiguous selector user3.CreateTimeuser3.Address.CreateTime 2020 //指定 Address 结构体中的 CreateTimeuser3.Email.CreateTime 2021 //指定 Email 结构体中的 C }结构体的继承 Go 语言中使用结构体也可以实现其他编程语言中的继承。 package mainimport fmt// Animal 动物 type Animal struct {name string }func (a *Animal) run() {fmt.Printf(%s 会运动\n, a.name) }// Dog 狗 type Dog struct {Age int8*Animal //通过嵌套匿名结构体实现继承 }func (d *Dog) wang() {fmt.Printf(%s 会汪汪汪~\n, d.name) }func main() {d1 : Dog{Age: 4, Animal: Animal{name: 乐乐}} //注意嵌套的是结构体指针d1.wang() //乐乐会汪汪汪~d1.run() //乐乐会动 }在Go语言中实际上并没有传统面向对象编程中的“继承”概念。Go采用了一种称为组合的方式来实现类似的功能。通过将一个结构体嵌入到另一个结构体中可以达到代码复用的目的这种方式有时被称作“嵌入”或“委派”它提供了一种灵活的方式来模拟继承的行为。 参考文献 https://gobyexample.com/ https://www.w3schools.com/go/ https://go.dev/doc/tutorial/ https://www.geeksforgeeks.org/golang-tutorial-learn-go-programming-language/
http://www.hkea.cn/news/14294620/

相关文章:

  • 深圳市房产管理局官方网站永久免费的网站推荐
  • 联系方式 响应式网站领地免费网站
  • 做网站中山长春网站建设首选网诚传媒_
  • 在线网站seo诊断抚顺建设网站
  • 网站怎么做跳出提示筐起飞页自助建站平台的特点
  • 专业网站定制价格便宜深圳app开发哪家专业
  • 如何在国外网站做翻译兼职厦门seo优化外包公司
  • 郑州代做网站个人网站代做
  • 做外贸用什么视频网站给外国小孩 做 英语题用的网站
  • 临沂企业建站效果好百度关键词代做排名
  • php网站开发架构网站建设 徐州
  • 吴江区建设银行招聘网站鹿泉微信网站建设
  • 企业网站维护建设ppt西安高科鱼化建设有限公司网站
  • 如何创办一个赚钱的网站国外最大的设计网站有哪些方面
  • 个人做收费网站人才招聘网站开发背景
  • 婚恋网站如何做自媒体营销360免费建手机网站
  • 三航奔腾建设有限公司官方网站上传文章的网站
  • windows10前段网站建设摄影网页模板
  • 1做网站推广长治seo
  • 建设部网站申请表无法打印wordpress实现选项卡
  • 设计前沿的网站wordpress 博客二号
  • 建设门户网站需要多少钱苏州网站推广去苏州聚尚网络
  • 建设教育协会官网找一个网站做优化分析
  • 辽源建站公司seo诊断工具
  • 食品安全网站建设沈阳定制网红小熊
  • 商务网站建设总结嘉兴中小企业网站制作
  • 网站设计如何收费如何用模板搭建网站
  • 抚顺网站建设技术员招聘一流高职院校建设工作网站
  • 保山市建设局网站网页设计高清素材
  • 网站流量下滑在那里建立公司网站