分享
  1. 首页
  2. 文章

Golang struct结构

skymyyang · · 1885 次点击 · · 开始浏览
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

结构struct

  • Go中的struct与C中的struct非常相似,并且Go没有class,代替了class的位置,但并没有代替class的功能
  • 使用type
  • 支持指向自身的指针类型成员
  • 支持匿名结构,可用作成员或定义成员变量
  • 匿名结构也可以用于map的值
  • 可以使用字面值对结构进行初始化
  • 允许直接通过指针来读写结构成员
  • 相同类型的成员可进行直接拷贝赋值
  • 支持==与!=比较运算符,但不支持>或<
  • 支持匿名字段,本质上是定义了以某个类型名为名称的字段
  • 嵌入结构作为匿名字段看起来像继承,但不是继承
  • 可以使用匿名字段指针

结构的定义

package main
import (
 "fmt"
)
type Person struct { //结构也是一中类型
 Name string //定义struct的属性
 Age int
}
func main() {
 a := Person{}
 a.Name = "joe" //对struct的属性进行操作,类型与class的使用方法
 a.Age = 19
 fmt.Println(a)
}

字面值初始化

package main
import (
 "fmt"
)
type Person struct {
 Name string
 Age int
}
func main() {
 a := Person{
 Name: "jack",
 Age: 19, //对结构的属性进行字面值的初始化
 }
 fmt.Println(a)
}

结构的传递

package main
import (
 "fmt"
)
type Person struct {
 Name string
 Age int
}
func main() {
 a := Person{
 Name: "jack",
 Age: 19, //对结构的属性进行字面值的初始化
 }
 fmt.Println(a)
 A(a)
 fmt.Println(a) //结构也是一种值类型,对它进行传递的时候,也是进行了值得拷贝
}
func A(per Person) {
 per.Age = 13
 fmt.Println("A", per)
}
PS G:\mygo\src\mytest> go run .\temp.go
{jack 19}
A {jack 13}
{jack 19}
package main
import (
 "fmt"
)
type Person struct {
 Name string
 Age int
}
func main() {
 a := Person{
 Name: "jack",
 Age: 19, //对结构的属性进行字面值的初始化
 }
 fmt.Println(a)
 A(&a)
 fmt.Println(a) //结构也是一种值类型,对它进行传递的时候,也是进行了值得拷贝
}
func A(per *Person) { //通过一个指针进行传递,此时就不是值得拷贝了
 per.Age = 13
 fmt.Println("A", per)
}
PS G:\mygo\src\mytest> go run .\temp.go
{jack 19}
A &{jack 13}
{jack 13}
package main
import (
 "fmt"
)
type Person struct {
 Name string
 Age int
}
func main() {
 a := &Person{
 Name: "jack",
 Age: 19, //此时初始化的时候就将这个struct的指针取出来
 }
 //在进行struct的初始化的时候,就加上&取地址符号
 fmt.Println(a)
 A(a)
 B(a)
 fmt.Println(a) //结构也是一种值类型,对它进行传递的时候,也是进行了值得拷贝
}
func A(per *Person) { //通过一个指针进行传递,此时就不是值得拷贝了
 per.Age = 13
 fmt.Println("A", per)
}
func B(per *Person) { //通过一个指针进行传递,此时就不是值得拷贝了
 per.Age = 15
 fmt.Println("B", per)
}
PS G:\mygo\src\mytest> go run .\temp.go
&{jack 19}
A &{jack 13}
B &{jack 15}
&{jack 15}

匿名结构

package main
import (
 "fmt"
)
func main() {
 a := &struct { //匿名结构,需要先对结构本身进行一个定义
 Name string
 Age int
 }{
 Name: "jack",
 Age: 20,
 }
 fmt.Println(a)
}

匿名结构的嵌套

package main
import (
 "fmt"
)
type Person struct {
 Name string
 Age int
 Contact struct {
 Phone, City string //匿名结构嵌套在Person中
 }
}
func main() {
 a := Person{Name: "Jack", Age: 20}
 a.Contact.Phone = "123321" //通过这种方法对嵌套在Person中的匿名结构进行字面值的初始化
 a.Contact.City = "BeiJing"
 fmt.Println(a)
}
PS G:\mygo\src\mytest> go run .\temp2.go
{Jack 20 {123321 BeiJing}}

匿名字段

package main
import (
 "fmt"
)
type Person struct {
 string //匿名字段 在进行字面值初始化的时候 必须严格按照字段声明的顺序
 int
}
func main() {
 a := Person{"Jack", 20} //此时将string 和 int类型对调的时候就会报错
 fmt.Println(a)
}

结构相同类型的比较

package main
import (
 "fmt"
)
type Person struct {
 Name string
 Age int
}
func main() {
 a := Person{Name: "Jack", Age: 20}
 b := Person{Name: "Jack", Age: 20}
 fmt.Println(a == b)
}
PS G:\mygo\src\mytest> go run .\temp3.go
true

嵌入结构

package main
import (
 "fmt"
)
type human struct {
 Sex int
}
type teacher struct {
 human
 Name string
 Age int
}
type student struct {
 human //这里的human也是一种类型,此时它相当于一种匿名字段,嵌入结构作为匿名字段的话
 //它本质上是将结构名称作为我们的字段名称
 Name string
 Age int
}
func main() {
 a := teacher{Name: "Jack", Age: 20, human: human{Sex: 0}} //因此我们需要在这里进行这种初始化
 b := student{Name: "Tom", Age: 19, human: human{Sex: 1}}
 a.Name = "Fack"
 a.Age = 13
 a.human.Sex = 100 //保留这种调用的方法,是因为会涉及到名称的冲突
 //a.Sex = 101 这种写法也是可以的
 fmt.Println(a, b)
}
PS G:\mygo\src\mytest> go run .\temp3.go
{{100} Fack 13} {{1} Tom 19}

有疑问加站长微信联系(非本文作者)

本文来自:博客园

感谢作者:skymyyang

查看原文:Golang struct结构

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

关注微信
1885 次点击 ∙ 1 赞
暂无回复
添加一条新回复 (您需要 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏