go学习笔记(4) - 结构体、接口

52 阅读2分钟

结构体与方法

  • 工厂函数返回局部变量地址
  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

  1. new只分配内存,make只用于slice,map,和channel的初始化
  2. new(T) 返回的是 T 的指针
  3. 慎重使用new, 建议使用make来初始化map

  • 为同一个结构定义的方法必须在一个包内完成
  • 每个目录一个包
  • main为特殊包
  • import时的包名由 go.mod中定义的前缀+package 名
  • 扩展已有类型
    • 使用组合的方式
    • 用别名的方式
    • 使用内嵌的方式