闽公网安备 35020302035485号
package main
type treeNode struct {
value int
left, right *treeNode
}
func main(){
var root treeNode
fmt.Println(root)
root = treeNode{value: 3}
root.left = &treeNode{}
root.right = &treeNode{5, nil, nil}
}
当然,我们也可以通过关键字new来初始化结构体
package main
type treeNode struct {
value int
left, right *treeNode
}
func main(){
root = treeNode{value: 3}
root.left.right = new(treeNode)
}
为结构体创建方法package main
import "fmt"
type treeNode struct {
value int
left, right *treeNode
}
// 堆代码 duidaima.com
func printVal(t treeNode){
fmt.Println(t.value)
}
func main(){
root = treeNode{value: 3}
root.left.right = new(treeNode)
printVal(root) // 3
}
要实现上面的功能,go还提供了类似class的一种语法,就是这样package main
import "fmt"
type treeNode struct {
value int
left, right *treeNode
}
func (t treeNode) printVal(){
fmt.Println(t.value)
}
func main(){
root = treeNode{value: 3}
root.left.right = new(treeNode)
root.printVal() // 3
}
上面两种方式都实现了同样的功能,从语法层面,无非就是将参数treeNode放在函数名前面还是后面而已。第二种方式,我们称之为结构体方法。package main
import "fmt"
type treeNode struct {
value int
left, right *treeNode
}
func (tree treeNode) setValue(val int) {
tree.value = val
}
func (tree treeNode) printValue() {
fmt.Println(tree.value)
}
func main() {
root := treeNode{value: 3}
root.setValue(4)
root.printValue() // 3 【setValue中会讲结构体复制出来一份,然后重新复制,所以原来原来结构体value并未发生变化】
}
如果想让结构体内容发生变化,我们在传递的时候,使用指针即可,就像这样package main
import "fmt"
type treeNode struct {
value int
left, right *treeNode
}
func (tree *treeNode) setValue(val int) {
tree.value = val
}
func (tree *treeNode) printValue() {
fmt.Println(tree.value)
}
func main() {
root := treeNode{value: 3}
root.setValue(4)
root.printValue() // 4 【因为传递的是指针,所以修改之后,原结构体也发生变化了】
}
我们称第一种方式为值接收者,第二种方式称为指针接收者。值/指针接收者均可以接受值/指针
func createNode(value int) *treeNode {
return &treeNode{value: value}
}
应用的时候,我们可以这样package main
import "fmt"
type treeNode struct {
value int
left, right *treeNode
}
func main(){
root := createNode(3)
fmt.Println(root.value) // 3
}
注:在这个位置返回了局部变量的地址