Go语言中的构造函数:
- Go 语言没有构造函数的功能
- 使用结构体初始化的过程来模拟实现构造函数
- 结构体可以像其他数据类型一样将结构体类型作为参数传递给函数
Go语言中的构造函数语法
type 类型名 struct {
字段名1 字段类型1
字段名2 字段类型2
......
}
func newfunc(变量名1 变量类型, 变量名2 变量类型 ……) *类型名{
return &类型名{
字段名1: 变量1,
字段名2: 变量2,
......
}
}
- Go语言的类型或结构体没有构造函数的功能,但是我们可以使用结构体初始化的过程来模拟实现构造函数。
- 构造函数传入的变量类型需要与return返回结构体指针字段名类型一致
- 构造函数可以只返回结构体中某些字段名
示例1:
package main
import "fmt"
type person struct {
name string
age int
}
//构造函数约定俗成用new开头,不是强制
//返回的是结构体还是结构体指针
//当结构体比较大的时候使用结构体指针,减少程序内存的开销。
func personOnlyName(name string) *person {
return &person{
name: name,
}//仅返回部分字段
}
func newperson(name string, age int) *person {
return &person{
name: name,
age: age,
}//返回所有字段
}
func main() {
p1 := personOnlyName("Go语言")
fmt.Println(p1)
p2 := newperson("golang", 20)
fmt.Println(p2)
}
//运行结果:
//&{Go语言 0}
//&{golang 20}
示例2:
package main
import "fmt"
type person struct {
name string
age int
}
func print1(p person){
p.name="值传递"
fmt.Println("print1",p)
}
func print2(p *person){
p.name="指针传递"
fmt.Println("print2",p)
}
func main() {
p1:=person{"Go语言",20}
print1(p1) //值传递,形参无法改实参
fmt.Println(p1)
print2(&p1) //指针传递,形参可以改实参
fmt.Println(p1)
}
//运行结果:
//print1 {值传递 20}
//{Go语言 20}
//print2 &{指针传递 20}
//{指针传递 20}