go语言仅支持封装,不支持继承和多态
type node struct {
value int
left *node
right *node
}
var root node
root = node{value:1}
//root := node{value:1}
root.left = &node{value:2}
root.left.right = &node{value:3}
root.right = new(node)
不论地址还是结构本身,一律使用.来访问成员
root.right.left = createNode(5)//&node{value:5}
root.print()
//fmt.Println(root)
fmt.Println()
root.setValue(100)
root.print()
显示定义和命名方法接收者
func (root node) print() { //等价 print(root node) {
fmt.Printf("value=%d", root.value)
}
只有使用指针才可以改变结构内容
nil指针也可以调用方法
func (root *node) setValue(value int) { //等价 setValue(root *node, value int) {
root.value = value
}
使用自定义工厂函数
注意返回了局部变量的地址
func createNode(value int) *node {
return &node{value:value}
}
值接受者vs指针接收者
要改变内容必须使用指针接收者
结构过大也要考虑使用指针接收者
一致性:如有指针接收者,最好都是指针接收者
//值接收者 是go语言特有
//值/指针接收者均可接收值/指针
//匿名字段
type Person struct {
name string
sex byte
age int
}
type Student struct {
Person //只有类型,没有名字,匿名字段,继承了Person的成员
id int
}
func main() {
var s1 Student = Student{
Person: Person{},
id: 0,
}
fmt.Print(s1)
//自动推导类型
s2 := Student{
Person: Person{},
id: 0,
}
fmt.Println(s2)
}