structure结构体是go语言中比较重要的一个概念,c语言中也有类似的东西。由于它们没有类的概念,所以结构可以简单理解为类,是不同类型数据的集合。集合中不同类型的数据称为成员,每个成员都有自己不同的类型,在js中可以理解为一个对象的各个属性。声明结构结构是通过type和struct关键字来声明的,type后跟结构的名称,struct后跟结构的每个成员的定义。typePersonstruct{namestringageintgenderstringaddressstring}上面的代码有点类似于其他语言中接口的定义。其实go也支持接口的定义。我们只需要将struct关键字替换为interface即可定义接口。初始化结构有两种方法可以初始化结构。一种是通过字面值的方式初始化结构,将结构的每个成员的值相加。以上面的Person结构为例:varp=Person{"Shenfq",25,"Male","湖南长沙"}fmt.Println("Person:",p)这个方法需要根据每个值来定义结构体成员的顺序是初始化的,当然也可以通过键值对的方式打乱顺序。这样可以省略一些成员,省略的部分会根据其类型取该类型的空值。varp=Person{name:"Shenfq",address:"湖南长沙",}fmt.Println("Person:",p)fmt.Println("Person.age:",p.age)如果要访问结构成员,可以传。运算符,这和其他语言取对象属性的方式是一致的。这里我们使用p.age来获取结构体p的成员age的值。除了文字初始化,结构也可以用new关键字初始化。varp=new(Person)该方法初始化的结构体有两个特点:new关键字返回的是一个结构体指针;new关键字返回的结果是每个成员的空值;所以,我们在通过new初始化结构体的时候,取值的时候需要加上*号。varp=new(Person)p.name="Shenfq"p.age=18p.gender="Male"p.address="湖南长沙"fmt.Println("Person:",p)如果直接打印变量在控制台p上,你会发现它前面有一个&,说明这是一个指针。匿名结构结构和函数也可以定义一个没有名字的结构,即在定义结构的同时对结构进行初始化,省略类型关键字和结构名称。varp=struct{namestringageintgenderstringaddressstring}{"Shenfq",25,"Male","湖南长沙"}方法结构体只能定义一个成员,成员都是基本类型。如果要实现类似于OOP中类的概念,也可以需要为结构体提供方法。其实我们可以为结构体指定一个方法。我们只需要在定义函数的函数名前加上结构体名,就可以将函数定义为结构体的一个方法。我们为前面的Person结构体定义了一个sayHello方法。func(pPerson)sayHello(namestring){fmt.Printf("Hi%s,I'm%s,Howareyou?\n",name,p.name)}p.sayHello("Jack")调用构造方法In和取结构体成员的值一样,你也需要传递.操作员。在Goland的Structure中,可以看到Person结构体中包含了sayHello方法,也就是说即使方法的定义不在结构体中,这个方法也属于结构体。方法中的指针有时,当我们调用方法时,需要修改结构体中某些成员的值,我们会发现原来结构体的值并没有改变。func(pPerson)growth(){p.age++}varp=Person{age:25}p.growth()在上面的代码中,我们定义的growth方法会修改结构体中传入的age值。但实际结果与我们预期的不同。varp=Person{age:25}p.growth()fmt.Println("age:",p.age)这是因为传入方法的结构是原结构的复制值,原结构需要被修改的结构,需要将它的指针传递给方法。只需要在方法中定义结构体参数时加上*,表示变量p是一个结构体指针。func(p*Person)growth(){p.age++}
