Go 结构体和方法

go面向对象:

  • 仅支持封装,不支持继承和多态。
  • 没有class,只有struct

struct定义

type structName struct {
    attributesName type
    ......
}
// Exapmle:
type treeNode struct {
    value int
    left, right *treeNode
}

var root treeNode
root = treeNode {value:1}
root.left = &treeNode{1, nil, nil}
root.left.left = new(treeNode) // java:root.left->left go .

不论是地址还是结构本身,一律使用”.”来访问

func createNode (value int) *treeNode {
    return &treeNode{value:value} // 可以返回局部变量地址
}

var node = createNode(1)

struct方法

// struct方法
func (node treeNode) print() {
    fmt.Println(node.value)
}
root.print()

// 一般的方法
func print(node treeNode) {
    fmt.Println(node.value)
}
print(root)

func(node treeNode),仍然是值传递!

func (node treeNode) setValue(value int) {
    node.value = value
}

func createNode (value int) *treeNode {
    return &treeNode{value:value}
}

var node = createNode(0)
node.setValue(1)
node.print() // 0

setValue(value int)需要成功修改value,可以修改为:

func (node *treeNode) setValue(value int) {
    node.value = value
}

nil指针可以调用方法

值接收者or指针接收者

  • 改变内容时使用指针接收者
  • 结构体过大考虑指针接收者
  • 一致性:如果有指针接收者,最好都是指针接收者
  • 值接收者go特有
  • 值/指针接收者均可接收值/指针

猜你喜欢

转载自blog.csdn.net/YeYuLuoJin/article/details/81393980