5.2 包和封装

一、封装

  1. 通过函数命名来确定函数类型

  2. 函数-命名一般使用多单词驼峰方式命名

  3. 包-首字母大写:public(公共方法)

  4. 包-首字母小写:private(私有)

二、包

  1. 每个目录一个包

  2. 包名可以跟目录名不同,单每个目录只有一个包名

  3. main包包含可执行入口,main函数必须在main包内

  4. 为结构定义的方法必须放在同一个包内

  5. 可以是不同的而文件

举例:

// main文件,4/tree/entry/entry.go
package main

import (
	"fmt"
	"imooc-learn/4/tree"
)

func main() {
	// 创建treeNode,value为0,left与right为nil
	var root tree.TreeNode
	fmt.Println(root)

	// 定义并赋值
	root2 := tree.TreeNode{Value: 3}
	root2.Left = &tree.TreeNode{}
	root2.Right = &tree.TreeNode{5, nil, nil}
	root2.Right.Left = new(tree.TreeNode)
	root2.Left.Right = tree.CreateNode(2)
	fmt.Println(root2)

	// 赋值函数使用
	root2.Right.Left.SetValue(4)

	root2.Print()
	//Print(root2)
	fmt.Println()

	// 切片中的定义
	nodes := []tree.TreeNode{
		{Value: 3},
		{},
		{6, nil, &root},
	}
	fmt.Println(nodes)

	root2.Traveres()

}


// 类文件,4/tree/node.go
package tree

import "fmt"

// 二叉树节点结构
type TreeNode struct {
	Value       int
	Left, Right *TreeNode
}

// 为结构体定义方法,接收方法是(node treeNode)
func (node TreeNode) Print() {
	fmt.Println(node.Value)
}

// 第二种写法
func Print(node TreeNode) {
	fmt.Println(node.Value)
}

// 赋值
func (node *TreeNode) SetValue(value int) {
	node.Value = value
}

// 遍历
func (node *TreeNode) Traveres() {
	if node == nil {
		return
	}
	node.Left.Traveres()
	node.Print()
	node.Right.Traveres()
}

// 因为没有构造函数,所以可以使用工厂函数控制构造
func CreateNode(value int) *TreeNode {
	return &TreeNode{Value: value}
}

Last updated

Was this helpful?