golang 结构体,使用关键字type
定义,struct
是结构体类型。在golang中没有class
类。结构体就是golang 的面向对象。结构体的字段可以是基本数据类型、数组、切片、映射、通道、结构体本身等。
type structname struct {
field dataType
field dataType
}
type 定义结构体
structname 结构体名称
struct 结构体类型
第一种实例化结构体,直接实例化并赋值
//定义结构体
type person struct {
name string
age int
}
//实例化结构体
personObj := person {
name:"zhang"
age: 22
}
//访问结构体的属性
personObj.name
第二种实例化结构体,先声明一个变量,变量类型是person
结构体,再对变量赋值。
//变量
var personObj person
//赋值
personObj.name = "zhang"
personObj.age = 22
第三种实例化结构体,使用New
personObj := New(person)
personObj.name="zhang"
personObj.age = 22
第四种实例化结构体,使用指针&
personObj := &person{}
personObj.name="zhang"
personObj.age=22
实例化指针结构体有两种方法。new
和 &
,这两种方式实例化的结构体都是指针完成的。
new实例化结构体
//定义一个s的结构体
type s struct {
name string
}
//new实现结构体
var a *s = new(s)
(*a).name = "zhangsan"
fmt.Println(a.name)
&
实例化结构体
var a *s = &s{}
(*a).name = "zhangsan"
fmt.Println(a.name)
var a *s //创建一个空的结构体,指针指向了空
a = new(s) // 需要重新赋值给一个结构体
*a.name="zhang"
fmt.Println(a.name)
在结构体中,字段也可以是匿名的,这意味着你可以直接访问嵌套结构体的字段,而不需要通过结构体名进行访问。
type Address struct {
Street string
City string
}
type Person struct {
FirstName string
LastName string
Age int
Address // 匿名字段
}
func main() {
p := Person{
FirstName: "Alice",
LastName: "Doe",
Age: 28,
Address: Address{
Street: "456 Park Ave",
City: "Townsville",
},
}
fmt.Println(p.Street) // 直接访问嵌套结构体的字段
}
谁实例化了结构体,谁就拥有结构体定义的方法。
type Person struct {
name string
}
//定义结构体方法
func (c Person) Say(msg string) {
fmt.Println(msg)
}
// person结构体实现了一个Say的方法,如果要使用Say方法,则实例化Person结构体即可。
p := Person{
name: "zhangsan",
}
fmt.Println(p)
p.Say("hello ,i am p")
如果在其他地方需要修改结构体的值,那么就需要使用指针,如果不使用指针是无法修改。
type Person2 struct {
name string
}
func setName(p Person2, val string) {
//不使用指针,此时的p和外部的结构无关系
p.name = val
}
func main(){
var p = Person2{}
p.name = "zhangsan"
fmt.Println(p.name) //zhangsan
setName(p, "sss")
fmt.Println(p.name) //zhangsan
}
下面修改成指针结构体之后
type Person2 struct {
name string
}
func setName(p Person2, val string) {
p.name = val
}
//使用指针,将按址修改
func setName2(p *Person2, val string) {
p.name = val
}
func main(){
//指针结构体的创建方法。
var p = &Person2{}
p.name = "sss"
fmt.Println(p.name)
setName2(p, "s1")
fmt.Println(p.name) // s1
fmt.Println(*p.name) // s1
//上面的*p 和p 是一个意思,go会将p自动转换为*p
}
使用结构体表示学生信息的一个简单实例。
package main
import "fmt"
type Student struct {
ID int
Name string
Age int
Gender string
}
func main() {
student := Student{
ID: 123,
Name: "Alice",
Age: 20,
Gender: "female",
}
fmt.Printf("ID: %d\nName: %s\nAge: %d\nGender: %s\n",
student.ID, student.Name, student.Age, student.Gender)
}
在这个示例中,我们定义了一个 Student
结构体,包含了学生的 ID、姓名、年龄和性别。然后我们创建了一个 student
实例,并打印了学生的信息。它演示了如何定义、实例化和使用结构体来表示复杂的数据类型。