Golang官方称Go语言的语法相对Java语言而言要简洁很多,但是简洁背后也灵活了很多,所以很多看似很简单的代码上的细节稍不注意就会产生坑。本文主要对struct结构体的相关的语法进行总结和说明。
结构体类型的声明:
type user struct {
name string
email string
} func (u user) notify() { fmt.Println("nitity...",u.name,u.email) } func (u *user) changeEmail(email string) { //这里的方法在被调用时,user传入的是调用者的指针 u.email = email }e
结构体变量的赋值和初始化:
func main() { //直接使用批针的方式
u1 := new(user) //此时无法对u1进行初始化赋值
u1.changeEmail("u1@email.com") //只能通过user的方法进行赋值
u1.notify() //方式同上
var u2 *user
u2= new(user) //使用new函数返回的是其参数类型的指针
u2.changeEmail("u2@email.com")
u2.notify() var u3 user //当声明变量时,这个变量对应的值总是会被初始化。这个值要么用指定的值初始化,要么用零值(即变量类型的默认值)做初始化
u3.changeEmail("u3@email.com")
u3.notify() //上面的方式只是起演示作用,在某些场合可以使用
//下面两种方式是建议采用的方式
bill := user{"Bill","bill@email.com"} //声明一个变量并初始化
bill.notify() lisa:=&user{"Lisa","lisa@email.com"}
lisa.notify() // 在这里Go会在底层这样做:(*lisa).notify bill.changeEmail("huxin@tedu.com") //这里Go底层会 (&bill).changeEmail("huxin@tedu.com")
bill.notify() lisa.changeEmail("lisa@newdomain.com")
lisa.notify() }g
说明一下:关键字func和函数名之间的参数被称为接收者,Go语言里有两种类型的接收者:值接收者和指针接收者,上面的notify方法的声明使用的是值接收者,changeEmail方法使用的是指针接收者,Go语言为了我们使用上的简单,在实 际执行时会根据我们传的值或指针自动帮我们进行转换以适应方法的需要。
还需要注意:
在Go语言中,所有的变量都以值的方式传递。因为指针变量的值是所指向的内存地址,在函数间传递指针变量,是在传递这个地址值,所以依旧被看作以值的方式在传递。