1.struct介绍
- Go没有对象和继承的概念,也没有很多与面向对象相关的概念,例如多态和重载。
- Go 所具有的是结构体的概念,可以将一些方法和结构体关联。
虽然 Go 不会像你以前使用的面向对象语言一样,但是你会注意到结构的定义和类的定义之间有很多相似之处。下面的代码定义了一个简单的 Saiyan 结构体:
例如
type User struct{ name string age int }
需要注意的是:导入没有使用的包会报错。
2.声明和初始化
结构体值最简单的办法如下代码所示。
liming:= User{ name:"liming", age:11, }
注意:
- 赋值时,必须 , 隔开。
- 数值默认值为0 。
- 也可以只设置一个值。
例如
package main import ( "fmt" ) type User struct { name string age int } func main() { liming := User{name: "li ming"} liming.age = 11 fmt.Printf("name: %s\tage:%d", liming.name, liming.age) }
3.指针
有时候需要指针关联而不是值关联,举例如下:
package main import ( "fmt" ) type User struct { name string age int } func main() { liming := User{name: "li ming"} liming.age = 11 Super(liming) fmt.Printf("name: %s\tage:%d", liming.name, liming.age) } func Super(s User) { s.age += 1 }
运行结果如下:
Starting: C:\Users\livingbody\go\bin\dlv.exe dap --check-go-version=false --listen=127.0.0.1:9071 from c:\Users\livingbody\goworkspace\hello DAP server listening at: 127.0.0.1:9071 Type 'dlv help' for list of commands. name: li ming age:11 Process 11080 has exited with status 0 Detaching dlv dap (19808) exited with code: 0
其中打印的年龄并没有发生变化,而需要变化则需要用到指针,具体代码如下。
package main import ( "fmt" ) type User struct { name string age int } func main() { liming := &User{name: "li ming"} liming.age = 11 Super(liming) fmt.Printf("name: %s\tage:%d", liming.name, liming.age) } func Super(s *User) { s.age += 1 }
输入如下
Starting: C:\Users\livingbody\go\bin\dlv.exe dap --check-go-version=false --listen=127.0.0.1:9102 from c:\Users\livingbody\goworkspace\hello DAP server listening at: 127.0.0.1:9102 Type 'dlv help' for list of commands. name: li ming age:12 Process 5424 has exited with status 0 Detaching dlv dap (19172) exited with code: 0
注意:
- & 操作符获取值的地址(取地址操作符)
- 修改Super构造函数 (*User),意思指向类型User值的指针
- 赋值一个指针比赋值一个复杂的结构消耗小,指针的真正用途就是分享它所指的值