Go中的struct

1. 用来自定义复杂数据结构
2.struct 里面可以包含多个字段(属性),字段可以是任意类型
3.struct类型可以定义方法,注意和函数的区分
4.struct类型是值类型
5.struct类型可以嵌套
6.Go语 言没有class类型,只有struct类型

1. struct 声明:

type 标识符 struct {
    field1 type
    field2 type
}
//例子:
type Student struct {
    Name string
    Age int
    Score int
}

2.struct 中字段访问:和其他语言一样,使用点

例子:
  var stu Student
  stu.Name = “tony”
  stu.Age = 18
  stu.Score=20
  fmt.Printf(“name=%s age=%d score=%d”, stu.Name, stu.Age, stu.Score)

package main

import(
    "fmt"
)

type Test struct {
    A int
    b int
}

type Student struct {
    Age int
    Name string
    Score int
    Sex string
    a Test  //struct类型可以嵌套
    t Int
    c *int
}

func testStruct () {
    var s Student
    s.Age = 18
    s.Name = "tom"
    s.Score = 80
    s.Sex = "man"
    s.a.A = 100
    s.c = new(int)   //给指针分配内存
    *(s.c) = 100     //给指针对应的变量赋值

    fmt.Printf("name:%s age:%d score:%d sex:%s c=%d\n", s.Name, s.Age, s.Score, s.Sex, *(s.c))
    fmt.Printf("%+v\n", s)
    s1 := s        //结构体是值类型
    s1.Name = "jim"
    *(s1.c) = 200  //结构体内的指针还是引用类型

    fmt.Printf("name:%s age:%d score:%d sex:%s c=%d\n", s.Name, s.Age, s.Score, s.Sex, *(s.c))
    fmt.Printf("%+v\n", s)

}

func main() {
    testStruct()
}

3.struct定义的三种形式:

  a.var stu Student
  b.var stu *Student = new (Student)
  c.var stu *Student = &Student{}

  1)其中b和c返回的都是指向结构体的指针,访问形式如下:
  a. stu.Name、stu.Age和stu.Score或者 (*stu).Name、(*stu).Age等

package main

import(
    "fmt"
)

type Student struct {
    Score int
}

func testStruct () {

    var p3 = new(Student)
    (*p3).Score = 100
    p4 := p3
    p4.Score = 1000
    //语法糖,底层会转成 (*p4).Score=1000的形式
    fmt.Printf("p3=%+v\n", *p3)
}

func main() {
    testStruct()
}

4.struct的内存布局:struct中的所有字段在内存是连续的,布局如下:

package main

import(
    "fmt"
)

type Point struct {
    x int
    y int
}

type Rect struct {
    p1 Point
    p2 Point
}

type RectA struct {
    p1 *Point
    p2 *Point
}

func main(){
    var r1 Rect
    var r2 RectA

    r2.p1 = new(Point)
    var r3 = new(Point)
    var r4 = new(Point)
    r2.p2 = new(Point)

    fmt.Println(r3, r4)
    //r1的内存布局
    fmt.Printf("p1.x addr:%p\n", &r1.p1.x)
    fmt.Printf("p1.y addr:%p\n", &r1.p1.y)
    fmt.Printf("p2.x addr:%p\n", &r1.p2.x)
    fmt.Printf("p2.y addr:%p\n", &r1.p2.y)
    fmt.Println()
    fmt.Println()
    //r2的内存布局
    fmt.Printf("p1.x addr:%p\n", &(r2.p1.x))
    fmt.Printf("p1.y addr:%p\n", &(r2.p1.y))
    fmt.Printf("p2.x addr:%p\n", &(r2.p2.x))
    fmt.Printf("p2.y addr:%p\n", &(r2.p2.y))
    fmt.Printf("p1:%p\n", &r2.p1)
    fmt.Printf("P2:%p\n", &r2.p2)
}

原文地址:https://www.cnblogs.com/domestique/p/8229021.html

时间: 2024-11-14 13:03:49

Go中的struct的相关文章

linux内核中的struct rlimit结构体详解

   在linux内核中,对一个进程获取系统资源的数量进行了限制.那么linux内核是如何实现这种对一个进程的各种资源的限制呢?    linux使用struct rlimit结构体来实现的,rlimit是 resource limit的缩写.    struct rlimit           {               unsigned int rlim_cur;  /* soft limit */               unsigned int rlim_max;  /* ha

C++中的struct和class的区别

C++中的struct对C中的struct进行了扩充,它已经不再只是一个包含不同数据类型的数据结构了,它已经获取了太多的功能.struct能包含成员函数吗? 能!struct能继承吗? 能!!struct能实现多态吗? 能!!! ? ? 既然这些它都能实现,那它和class还能有什么区别? 最本质的一个区别就是默认的访问控制,体现在两个方面: ? ? 默认的继承访问权限.struct是public的,class是private的.你可以写如下的代码:struct A{char a;}:struc

c++中的struct

c++中的struct不在是c中的struct,不仅仅是一个多个数据类型的结构体了.c++中的struct可以具有成员函数(c语言中是不可以的),c++ struct还可以继承class等等.同时c++中的struct还兼容c的struct.下面这篇文章写得很详细 C++中struct和class的区别 我也贴一段小代码吧 1 #include <iostream> 2 using namespace std; 3 4 struct test_struct{ 5 int id; 6 int a

浅析Python中的struct模块

最近在学习python网络编程这一块,在写简单的socket通信代码时,遇到了struct这个模块的使用,当时不太清楚这到底有和作用,后来查阅了相关资料大概了解了,在这里做一下简单的总结. 了解c语言的人,一定会知道struct结构体在c语言中的作用,它定义了一种结构,里面包含不同类型的数据(int,char,bool等等),方便对某一结构对象进行处理.而在网络通信当中,大多传递的数据是以二进制流(binary data)存在的.当传递字符串时,不必担心太多的问题,而当传递诸如int.char之

C\C++中的 struct 关键字详解

struct关键字是用来定义一个新的类型,这个新类型里面可以包含各种其他类型,称为结构体. 1. 什么是结构体 结构体(struct)是一种自定义的数据类型,就是把一组需要在一起使用的数据元素组合成一个新的类型.结构体的作用就是封装,以方便地使用这些封装到一起的属性. 新的类型与C++中基本类型int,库类型string一样.C++的关键字struct是从C语言中的struct继承过来的,它们之间有区别与联系. 2. C语言的struct: C语言可以使用结构体struct来存放一组不同类型的数

python中的struct

我们知道python只定义了6种数据类型,字符串,整数,浮点数,列表,元组,字典.但是C语言中有些字节型的变量,在python中该如何实现呢?这点颇为重要,特别是要在网络上进行数据传输的话. python提供了一个struct模块来提供转换.下面就介绍这个模块中的几个方法. struct模块中最重要的三个函数是pack(), unpack(), calcsize() # 按照给定的格式(fmt),把数据封装成字符串(实际上是类似于c结构体的字节流) pack(fmt,v1, v2, ...) #

Swift中enum, struct, class的有关使用方法

import Foundation print("Hello, World!") let a = 10var b = 20var c = a + b;c = 3000 //重载:函数名相同, 函数类型不同(参数, 返回值不同), 构成重载, 调用的时候, 根据参数确定调用那个函数func helloworld(a:Int)->Int {    return a * 100}func hellowold(a:String)->Int {    return 100}print

C++中的struct与class继承方式

代码: 1 #include <iostream> 2 #include <cstdio> 3 4 using namespace std; 5 6 //class A{ 7 struct A{ 8 public: 9 int i{5}; 10 void print(){ 11 cout<<i<<endl; 12 } 13 }; 14 //class B:A{ 15 struct B:A{ 16 public: 17 }; 18 19 int main(){

C#中的struct(结构)为值类型,struct类型全接触

众所周知,struct类型和class类型非常相似,尤其是在C++中,class可以办到的事struct几乎都可以实现.在C#中struc类型依然存在,它的用处相对来说已经显得越来越不重要,这里主要讲述一下C#中struct和class的一个最大不同点,在C#中struct是值类型,而class是引用类型. 例: class Program { struct Test { public int a ; } static void Main(string[] args) { Test test1