-
结构体和方法
package main
import "fmt"
type treeNode struct {
value int
left, right *treeNode
}
// 为结构定义方法 func 后面()内为接收者
func (node treeNode) print() {
fmt.Println(node.value)
}
func (node *treeNode) setValue(value int) {
if node == nil {
fmt.Println("setting value to nil node. ignored")
return
}
node.value = value
}
// 工厂函数构造
func createNode(value int) *treeNode {
return &treeNode{value: value} // 返回了局部变量的地址
}
// 遍历节点
func (node *treeNode) traverse() {
if node == nil {
return
}
node.left.traverse()
node.print()
node.right.traverse()
}
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)
nodes := []treeNode{
{value: 3},
{},
{6, nil, &root},
}
root.print()
root.right.left.setValue(4)
root.right.left.print()
fmt.Println(nodes)
pRoot := &root
pRoot.print()
pRoot.setValue(200)
pRoot.print()
var p *treeNode
// p.setValue(123)
p = &root
p.setValue(321)
p.print()
fmt.Println("遍历树")
root.traverse()
/*
值接收者 vs 指针接收者
1.要改变内容必须使用指针接收者
2.结构过大也考虑使用指针接收者
3.如有指针接收者,最好都是指针接收者
和其他语言相比两种传输方式区别
1.值接收者是go语言特有的
2.值/指针接收者均可接受值/指针 也就是值可以接收指针 指针可以接收值
*/
}
-
包和封装
package tree
import "fmt"
type treeNode struct {
value int
left, right *treeNode
}
// 为结构定义方法 func 后面()内为接收者
func (node treeNode) print() {
fmt.Println(node.value)
}
func (node *treeNode) setValue(value int) {
if node == nil {
fmt.Println("setting value to nil node. ignored")
return
}
node.value = value
}
// 工厂函数构造
func createNode(value int) *treeNode {
return &treeNode{value: value} // 返回了局部变量的地址
}
// 遍历节点
func (node *treeNode) traverse() {
if node == nil {
return
}
node.left.traverse()
node.print()
node.right.traverse()
}
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)
nodes := []treeNode{
{value: 3},
{},
{6, nil, &root},
}
root.print()
root.right.left.setValue(4)
root.right.left.print()
fmt.Println(nodes)
pRoot := &root
pRoot.print()
pRoot.setValue(200)
pRoot.print()
var p *treeNode
// p.setValue(123)
p = &root
p.setValue(321)
p.print()
fmt.Println("遍历树")
root.traverse()
/*
值接收者 vs 指针接收者
1.要改变内容必须使用指针接收者
2.结构过大也考虑使用指针接收者
3.如有指针接收者,最好都是指针接收者
和其他语言相比两种传输方式区别
1.值接收者是go语言特有的
2.值/指针接收者均可接受值/指针 也就是值可以接收指针 指针可以接收值
*/
}
/*
go包与封装
名字一般使用CamelCase
1.首字母大写:public 可以给别人用
2.首字母小写:private 自己用
包
1.每个目录一个包
2.main包包含可执行入口
3.为结构定义的方法必须放在同一个包内,可以是不同的文件
如何扩充系统类型或别人的类型
1.定义别名
2.使用组合
*/
-
GOPATH以及目录结构
package main
type point struct{ i, j int }
// 面向对象 go语言仅支持封装,不支持继承和多态,go语言没有class,只有struct
/*
GOPATH环境变量
1.默认在~/go(unix,linux),%USERPROFILE%\go(windows)
2.官方推荐:所有项目和第三方库都放在同一个GOPATH下
3.也可以将每个项目放在不同的GOPATH
4.go build 来编译
5.go install 产生pkg文件和可执行文件
6.go run 直接编译运行
{
src{
git repository
}
pkg{
git repository
}
bin{
.exe
}
}
*/
func main() {
}