1、go中没有类,但是可以通过结构体struct实现oop
2、struct的成员(也叫属性或字段)可以是任何数据类型(普通类型、复合类型、函数、map、interface、struct),所以我们可以理解为go语言中的“类”
struct区分大小写,首字母大写,则该成员为公有成员(对外可见),否则是私有成员(对外不可见)
package main
type Books struct {
title string
author string
subject string
book_id int
}
func main(){
//创建一个结构体
fmt.Println( Books{"go语言", "www.runoob.com", "go语言教程", "956"})
//key => value格式 创建结构体
fmt.Println( Books{ title: "go语言", author:"www.runoob.com", subject: "go语言教程", book_id: "956"})
// 忽略的字段为数据类型的默认值,如0 或 空
fmt.Println( Books{title: "go语言", author: "www.runoob.com"})
}
上方代码输出结果:
{go语言 www.runoob.com go语言教程 9561}
{go语言 www.runoob.com go语言教程 9561}
{go语言 www.runoob.com 0}
结构体.成员名
package main
type Books struct{
title string
author string
subject string
book_id int
}
func main {
var book1 Books
var book2 Books
book1.title = "go语言"
book1.author = "www.runnoob.com"
book1.subject = "go语言教程"
book1.book_id = 9445
book2.title = "c语言"
book2.author = "www.runnoob.com"
fmt.Printf("Book 1 title: %s\n", Book1.title)
fmt.Printf("Book 2 title:%s \n", Book2.title)
}
package main
import "fmt"
type Books struct {
title string
author string
subject string
book_id int
}
func main(){
var book1 Books = Books{title:"go语言",author:"www.runnoob.com",subject: "go语言教程",book_id: 955}
printBooks(book1)
}
func printBooks( book Books) {
fmt.Printf("书籍标题:%s\n",book.title)
fmt.Printf("书籍坐着:%s\n",book.author)
fmt.Printf("书籍介绍:%s\n",book.subject)
fmt.Printf("书籍id:%d\n",book.book_id)
}
type Books struct {
title string
}
func main(){
var book1 Books = Books{"go语言"}
printBook( &book1)
}
func printBook( book *Books) {
fmt.Printf("书籍标题:%s\n", book.title)
}
go语言仅支持封装,不支持继承和多态
go语言中同时有函数和方法。一个方法就是一个包含了接受者的函数,接受者可以是命名类型或者是结构体类型的一个值或者是一个指针。所有给定类型的方法属于该类型的方法集
package main
import "fmt"
type Circle struct {
radius float64
}
func main(){
var c1 Circle
c1.radius = 10.00
fmt.Println("圆的面积 = ", c1.getArea())
}
//该method属于Circle类型对象中的方法
func (c Circle) getArea() float64 {
//c.radius即为Circle类型对象中的属性
return 3.14 * c.radius * c.radius
}
如果结构体过大,考虑使用指针接收者
如果有指针接收者,最好都是指针接收者
要改变结构体内容,必须使用指针接收者
package main
import "fmt"
type treeNode struct {
value int
left, right *treeNode
}
//指针接收者
func (node *treeNode) setValue(value int){
node.value = value
}
//值接收者,此处go会将node拷贝一份
func (node treeNode) Print(){
fmt.Println(node.value)
}
//工厂函数创建treeNode
func createNode(value int) *treeNode {
return &treeNode{value: value}
}
func main() {
root := treeNode{value: 3}
root.left = &treeNode{}
root.right = &treeNode{5, nil, nil}
root.left.left = createNode(2)
//new函数创建treeNode
root.left.right = new(treeNode)
root.Print()
root.left.setValue(10)
root.left.Print()
}