1、struct的声明
GO中:
type student struct {
Name string
Age int
}
C中
#include <stdio.h>
typedef struct Student{
int Age;
char Name[20];
}struct_int;
int main()
{
struct_int a ={1,"Tom"};
struct Student b = {2,"Faker"};
printf("%d,%s\n",a.Age,a.Name);
printf("%d,%s\n",b.Age,b.Name);
return 0;
}
首先:go语言中struct声明时候是反过来的type student struct,通常是用student这个类型去声明定义 如:var studetn_struct student
不可以像c语言在末尾直接写struct_int
typedef struct Student{
int Age;
char Name[20];
}struct_int;
c语言中:一般是用struct_int去声明结构体,或者直接加到typedef struct {}之后或者 struct Student(struct是不可以缺少的)。
2、初始化:
c中:struct_int a ={1,”Tom”,{1,”gogoing”}};有结构体嵌入的时候直接{}写内容就可以了。
go:这样是不行的。 a := person{{1}, “Tom”, 13}编译会出现错误;正确写法如下:
package main
import (
"fmt"
)
type human struct {
sex int
}
type person struct {
human
name string
age int
//sex int
}
func main() {
//var a person,
b := human{1}
//a := person{{1}, "Tom", 13}
//b = {sex::1}
a := person{human: struct{ sex int }{1}, name: "name", age: 2}
//a := human{1}
fmt.Println(a)
fmt.Println(b)
}
不过通常也不会用到以上写法。
通常’.’引用结构体中的变量。
3、定义
c语言中:引用结构体指针的时候需要->就是(*p)
#include <stdio.h>
typedef struct human{
int sex;
char a[20];
};
typedef struct Student{
int Age;
char Name[20];
struct human human_stuct;
}struct_int;
int main()
{
struct_int a ={1,"Tom",{1,"gogoing"}};
struct Student b = {2,"Faker"};
struct Student *c = (struct Student *)malloc (sizeof(struct Student));
//char d[20] = "aaa";
c->Age= 1;
strcpy(c->Name,"aa");
printf("%d,%s,%s\n",a.Age,a.Name,a.human_stuct.a);
printf("%d,%s\n",b.Age,b.Name);
printf("%d,%s\n",c->Age,c->Name);
return 0;
}
而GO语言就简单多了。‘.’是通用的。
c := &a,fmt.Println(c.age)。指针可以直接用’.’引用。最强大的是c是person结构体,person结构体中有human结构体,c可以直接引用human结构体中的成员fmt.Println(c.sex)。c语言是不行的。
在对char a[20];进行赋值的时候发现复制时候出现错误。那是c语言中如果数组在声明时没有经行初始化,必须用strcpy等函数进行复制。
本来想对go进行测试,但是我输入字符串时候,提示字符串是string类型。c语言中只要涉及指针都要对它进行初始化,没有初始化,没有申请空间会造成程序崩溃,是非常严重的错误。
c在对字符串处理上是比较麻烦的,c++,go由于有string类型,处理一般不会造成程序崩溃。
go语言声明和初始化是一起的,var默认初始化。b int,在程序中是不被允许的,这样可以减少很多的错误。