在go语言中,如要把结构体传入函数或者方法,有两种情况:
1-如只是读取结构体里成员,不牵涉修改,可以作为参数的值传递:变量名 结构体类型
2-如要修改结构体里成员,就要用结构体指针传入:变量名 *结构体类型
package main
import "fmt"
type Books struct {
title string
id int
}
func Set (bk *Books) bool { //这里是定义了一个外部函数,通过传入结构体指针变量*Books,在下面可以修改其成员值
bk.title="new" //使用结构体指针访问结构体成员,使用 "." 操作符,注意,这里跟c语言不同,c语言里如是结构体指针,访问其成员是用->
bk.id=1
return true
}
func (bk *Books) m_Set (ntitle string,nid int) bool { //这里是直接定义了结构体类型的方法,可以通过“结构体变量.方法名”调用。
//因为是传递的结构体指针*Books,所以可以修改其成员值。
bk.title=ntitle
bk.id=nid
return true
}
func (bk Books) m_Get () (string,int) {//这里是获取结构体变量的成员值,返回多个值。因为是只读取操作,所以传递值即可,使用Books
return bk.title,bk.id
}
func main() {
var bk1 =Books{"hello",5} //直接在声明时初始化
var bk2 Books
bk2.title="xia" //在声明后依次给每个成员赋值
bk2.id=6
var bk3 =Books{title:"haha"} //使用 key => value 格式初始化,因为id成员没有初始化,默认是0
fmt.Println(bk1.title,bk1.id)
fmt.Println(bk2.title,bk2.id)
fmt.Println(bk3.title,bk3.id)
if Set(&bk3) {
fmt.Println("调用Set外部函数:",bk3.title,bk3.id)
}
if bk3.m_Set("xyz",100) {
fmt.Println("调用m_Set方法:",bk3.title,bk3.id)
}
tstr,tid:=bk3.m_Get()
fmt.Println("调用m_Get方法:",tstr,tid)
}