10、go语言结构体struct

go语言struct

  • 1、struct
  • 2、struct详解
  • 3、定义struct
  • 4、访问结构体
  • 5、结构体作为函数参数
  • 6、结构体指针
  • 7、方法
    • 指针接收者

1、struct

1、go中没有类,但是可以通过结构体struct实现oop
2、struct的成员(也叫属性或字段)可以是任何数据类型(普通类型、复合类型、函数、map、interface、struct),所以我们可以理解为go语言中的“类”

2、struct详解

struct区分大小写,首字母大写,则该成员为公有成员(对外可见),否则是私有成员(对外不可见)

3、定义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}

4、访问结构体

结构体.成员名
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)
}

5、结构体作为函数参数

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)			
}

6、结构体指针

type Books struct {
	title string
}
func main(){
	var book1 Books = Books{"go语言"}
	printBook( &book1)
}
func printBook( book *Books) {
	fmt.Printf("书籍标题:%s\n", book.title)
}

7、方法

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()
}

你可能感兴趣的:(golang基础)