struct

简介:
复制代码
package main

import (
    "fmt"
)

type test struct{} //空的结构体

type person struct {
    name string
    age  int
}

type student struct { //结构体嵌套
    name    string
    age     int
    contact struct {
        phone, city string
        num         int
    }
}

type teacher struct { //匿名字段
    string
    int
}

func main() {
    a := test{}
    fmt.Println(a) //{}

    p := person{}
    fmt.Println(p) //{ 0}
    p.name = "joi"
    p.age = 19
    fmt.Println(p)      //{joi 19}
    fmt.Println(p.name) //joi

    p1 := person{
        name: "lll",
        age:  32,
    }
    fmt.Println(p1)      //    {lll 32}
    fmt.Println(p1.name) //lll

    A(p1)
    fmt.Println(p1.age) //32,值拷贝,不是引用传递

    A1(&p1)
    fmt.Println(p1.age) //888,指针传递,

    p2 := &person{ //p2就是指向结构体的地址了,以后和传递就是指针传递了,
        name: "kkk",
        age:  1,
    }

    A1(p2)
    p2.name = "OK"       //p2是一个地址,这里不需要用*p2 = "OK"
    fmt.Println(p2.name) //OK,

    b := struct { //匿名结构体
        name string
        age  int
    }{
        name: "uuu",
        age:  19,
    }
    fmt.Println(b) //{uuu 19}

    //匿名结构体
    c := &struct {
        name string
        age  int
    }{
        name: "eee",
        age:  29,
    }
    fmt.Println(c) //&{eee 29}

    d := student{}
    fmt.Println(d) //{ 0 {  0}}
    d = student{
        name: "dd",
        age:  1,
    }
    d.contact.city = "sity"
    d.contact.num = 9
    d.contact.phone = "phone" //里面的结构体只能够分部赋值
    fmt.Println(d)            //{dd 1 {phone sity 9}}

    e := teacher{"tec", 52} //依靠顺序传值
    fmt.Println(e)          //{tec 52}
    var e1 teacher
    e1 = e
    fmt.Println(e1) //{tec 52},结构体可以直接赋值
}

func A(per person) {
    per.age = 999
    fmt.Println(per.age) //999
}

func A1(per *person) {
    per.age = 888
    fmt.Println(per.age) //888
}
复制代码

 

复制代码
package main

/*
结构struct

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

*/

import (
    "fmt"
)

//实现继承,嵌入结构(组合)
type human struct {
    sex int
}

type teacher struct {
    human
    name string
    age  int
}

type student struct {
    human
    name string
    age  int
}

func main() {
    a := teacher{name: "teac", age: 32}
    b := student{name: "stud", age: 18}
    fmt.Println(a, b) //{{0} teac 32} {{0} stud 18}

    a1 := teacher{name: "teac", age: 32, human: human{sex: 1}}
    b1 := student{name: "stud", age: 18, human: human{sex: 1}}
    fmt.Println(a1, b1) //{{1} teac 32} {{1} stud 18}
    a1.age = 88
    a1.human.sex = 100  //a1.sex = 200也可以,因为human的字段就已经是teacher和student的属性了,
    fmt.Println(a1, b1) //{{100} teac 88} {{1} stud 18}
}
复制代码

 go语言没有class,struct就是go语言的class.


本文转自农夫山泉别墅博客园博客,原文链接:http://www.cnblogs.com/yaowen/p/8075714.html,如需转载请自行联系原作者

相关文章
|
2月前
|
编译器 C++
struct 和 typedef struct 区别和用法总结
struct 和 typedef struct 区别和用法总结
20 0
|
2月前
|
C语言 C++
[C++&C] Struct 和Typedef Struct的区别
[C++&C] Struct 和Typedef Struct的区别
88 0
|
9月前
|
编译器 C++
typedef vs #define
typedef vs #define。
19 0
|
11月前
|
C语言
struct结构体初识
struct结构体初识
37 0
|
存储 编译器 C语言
11、struct 结构
11、struct 结构
86 0
|
C语言 C++ 编译器
C/C++语法知识:typedef struct 用法详解
第一篇:typedef struct与struct的区别 1. 基本解释 typedef为C语言的关键字,作用是为一种数据类型定义一个新名字。这里的数据类型包括内部数据类型(int,char等)和自定义的数据类型(struct等)。
6043 0
|
编译器 C++
struct和typedef struct
struct和typedef struct
95 0
#define与typedef区别
1) #define是预处理指令,在编译预处理时进行简单的替换,不作正确性检查,不关含义是否正确照样带入,只有在编译已被展开的源程序时才会发现可能的错误并报错。例如: #define PI 3.1415926 程序中的:area=PI*r*r 会替换为3.1415926*r*r 如果你把#define语句中的数字9 写成字母g 预处理也照样带入。
955 0
|
网络协议 Linux 缓存
struct s_mbuf与struct sk_buff
struct s_mbuf与struct sk_buff本文的copyleft归gfree.wind@gmail.com所有,使用GPL发布,可以自由拷贝,转载。但转载请保持文档的完整性,注明原作者及原链接,严禁用于任何商业用途。
1302 0