go学习笔记(4) - 结构体、接口
2021-07-02 本文已影响0人
卡门001
结构体与方法
- 工厂函数返回局部变量地址
func createNode(value int) *TreeNode {
}
- 结构体专有方法
func (node TreeNode) print()
...
- 结体构综合示例
package main
import "fmt"
//struct:结构体
type TreeNode struct {
value int
Left,Right *TreeNode
}
//工厂方法,一般返回结构的地址
func createNode(value int) *TreeNode {
return &TreeNode{value: value}
}
//等同一起func print(node TreeNode) {
//代码该方法是由TreeNode使用
func (node TreeNode) print() {
fmt.Print(node.value)
}
//go函数都是传值
//要解决TreeNode中value在main中使用,用指定
func (node *TreeNode) setValue(value int) {
node.value = value
}
//代码该方法是由TreeNode使用
func print(node TreeNode) {
fmt.Print(node.value)
}
func main() {
var root TreeNode;
root = TreeNode{value: 0}
root.Left = &TreeNode{}
root.Right = &TreeNode{2,nil,nil}
root.Right.Right = new(TreeNode)
root.Left.Right = createNode(12)
root.print()
root.Right.Left.setValue(4)
root.Right.Left.print()
fmt.Println("")
}
接口
package main
import "fmt"
//定义1个接口student,它包含1个 StudentName 方法
type student interface {
StudentName() string
Gender() int
}
//2、定义结构体
type StudentImp struct {
name string //一个返回值对应接口的一个方法近回
gender int
}
//3.给结构体绑定一个方法 StudentName。表示它实现了 student接口
func (s StudentImp) StudentName() string{
return s.name
}
//4.给结构体绑定一个方法 Gender。表示它实现了 student接口
func (s StudentImp) Gender() int{
return s.gender
}
//5. 使用
func main() {
//1. 实例化结构体
imp := StudentImp{}
imp.name = "nian"
imp.gender = 1
//2. 再实例化一下interface
var myStudent student
//3. 将结构体赋给接口变量
myStudent = imp
//4. 调用接口变量的值
fmt.Println(myStudent.Gender())
}
问题集锦
new与make
- new只分配内存,make只用于slice,map,和channel的初始化
- new(T) 返回的是 T 的指针
- 慎重使用new, 建议使用make来初始化map
包
- 为同一个结构定义的方法必须在一个包内完成
- 每个目录一个包
- main为特殊包
- import时的包名由 go.mod中定义的前缀+package 名
- 扩展已有类型
- 使用组合的方式
- 用别名的方式
- 使用内嵌的方式