老师您好,关于结构体方法的问题

老师您好,关于结构体方法的问题

package main

import "fmt"

type treeNode struct {
value int
  left, right *treeNode
}

func (node treeNode) print() {
fmt.Println(node.value)
}

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


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

  root = treeNode{value: 3}
root.left = &treeNode{}
root.right = &treeNode{5, nil, nil}
root.right.left = new(treeNode)
root.left.right = createNode(2)

root.print()

setValue(4, root.right.left)
fmt.Println(root.right.left.value)
}

上面这样setValue会报错:cannot use root.right.left (type *treeNode) as type treeNode in argument to setValue

package main

import "fmt"

type treeNode struct {
value int
  left, right *treeNode
}

func (node treeNode) print() {
fmt.Println(node.value)
}

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

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

  root = treeNode{value: 3}
root.left = &treeNode{}
root.right = &treeNode{5, nil, nil}
root.right.left = new(treeNode)
root.left.right = createNode(2)

root.print()

root.right.left.setValue(4)
fmt.Println(root.right.left.value)
}

这样却不报错,不是说这两种定义方法都是一样的吗

正在回答

登陆购买课程后可参与讨论,去登陆

1回答

报错是因为你定义的函数

setValue

第二个参数要求的是一个结构体,你调用时传的却是一个结构体指针

  • 寻曜 提问者 #1

    不是说编译器会自动把指针和非指针结构体转换传入吗

    2021-04-22 11:36:36
  • ccmouse 回复 提问者 寻曜 #2

    这个不是所有情况下都会,只有在结构体的方法调用时编译器才会允许做这个简化。

    2021-04-27 19:23:59
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师