Go语言结构体 (11)| Go主题月

252 阅读2分钟

结构体

Go 语言的结构体可以包含多种数据类型,Go语言的数组只能包含一种数据类型,可以使用type和struct定义一个结构体:

type test struct {   //声明一个结构体,名字为test
    value int        //声明其中一个字段,名字为value ,数据类型为int
    name string      //声明其中一个字段,名字为name, 数据类型为string
}

结构体内的字段是唯一的,不能重复,也可以把类型相同的字段放在一行:

type letsgo struct{
    data1,data2,data3 int
}

也可以定义一个空的结构体,没有内容:

type test strut{   
}

image.png

结构体初始化

定义了一个结构体不使用也不会报错,因为结构体只是规定了一组数据的内存布局,只有实例化才会分配内存。

type test strut{
    myvalue int
    mydata string
}
var mytest test   //实例化一个结构体,mytest为结构体实例,test为结构体类型,这个东西将会非常常见

一种基础的实例化方式:

type letsgo struct{
    data1,data2,data3 int
}
var p letsgo
p.data1 = 1
p.data2 = 2
p.data3 = 3
fmt.Println(p)  //{1,2,3},如果没有给data2,data3赋值,那么输出的值就是{1,0,0}

可以在实例化的时候给其中字段赋值,必须按照顺序来:

type letsgo struct{
    data1,data2,data3 int
}
var p =letsgo{1,30,3}
fmt.Println(p)  //{1,30,3}

如果不按照顺序呢:

type letsgo struct{
    data1,data2,data3 int
}
var p =letsgo{data3:3,data2:30,data1:1}
fmt.Println(p)  //{1,30,3},还是按照结构体的顺序输出

image.png

嵌套结构体

结构体还可以套娃,结构体里面还可以弄一个结构体:

type father struct{
    name string
    other son
}

type son struct{
    name string
}

嵌套结构体也可以用上面的方法一样初始化:

package main
import "fmt"

func main() {	
    type son struct{
        name string
    }	

    type father struct{
        name string
        other son  //son 的定义一定要在上面,不然会报错。
    }

    p:=father{
        name:"张三",
        other:son{
            name :"张三的儿子",
        },
    }
    fmt.Println(p)  //{张三 {张三的儿子}}
    fmt.Println(p.other.name)  //访问结构体使用.  输出:张三的儿子
}

访问结构体用.,上面的例子已经说明白了。第二层也是用.,

把结构体作为函数参数

填补一下说函数的时候挖的坑,直接来一个例子:

package main
import "fmt"
type father struct{
	name string
}
func printName ( fa father ){
	fmt.Println(fa.name)  
}
func main() {
	p:=father{
		name:"张三",
	}
	printName(p)  //输出张三
}

再试下用结构体指针作为函数参数:

package main
import "fmt"
type father struct{
	name string
}
func printName ( fa *father ){
	fmt.Println(fa.name)  //读取传递过来的fa的地址保存的结构体,输出结构体其中的字段
}
func main() {
	p:=father{
		name:"张三",
	}
	printName(&p)  //传递结构p的地址,输出张三
}

这里讲了很多代码例子,因为发现结构体特性用代码说出来比较直接,下一篇说一下与结构体关联很密切的接口

image.png