Golang笔记
1.func
先看一看func 的基本构成元素
func (p myType ) funcName ( a, b int , c string ) ( r , s int ) { return }
其中:
关键字———func // 这个是定义函数的关键字
函数拥有者—(p myType) // 这个是此函数的拥有者,下面解释(此项可省略)
方法名———funcName // 这个是定义函数的名字
入参———— a,b int,b string // 这个是定义函数的入参
返回值——— r,s int // 这个是定义函数的返回值,golang可以返回多个值
函数体——— { }
重点说说这个函数拥有者(p myType),这个是相较于C/C++比较特殊的地方。
为特定类型定义函数,即为类型对象定义方法
在Go中通过给函数标明所属类型,来给该类型定义方法,上面的 (p myType) 即表示给myType声明了一个方法, p myType 不是必须的。如果没有,则纯粹是一个函数。
链接:https://www.jianshu.com/p/9aefa9ddecb9
2.golang 里面指针符号的*和&
package main import "fmt" func main() { var a int = 1 var b *int = &a var c **int = &b var x int = *b fmt.Println("a = ",a) fmt.Println("&a = ",&a) fmt.Println("*&a = ",*&a) fmt.Println("b = ",b) fmt.Println("&b = ",&b) fmt.Println("*&b = ",*&b) fmt.Println("*b = ",*b) fmt.Println("c = ",c) fmt.Println("*c = ",*c) fmt.Println("&c = ",&c) fmt.Println("*&c = ",*&c) fmt.Println("**c = ",**c) fmt.Println("***&*&*&*&c = ",***&*&*&*&*&c) fmt.Println("x = ",x) }
解释
理论
&符号的意思是对变量取地址,如:变量a的地址是&a
*符号的意思是对指针取值,如:*&a,就是a变量所在地址的值,当然也就是a的值了
简单的解释
*和聽&聽可以互相抵消,同时注意,*&可以抵消掉,但&*是不可以抵消的
a和*&a是一样的,都是a的值,值为1 (因为*&互相抵消掉了)
同理,a和*&*&*&*&a是一样的,都是1 (因为4个*&互相抵消掉了)
展开
因为有
var b *int = &a //--------------------
(可以理解为订阅一个变量时加上了*,表示这个变量是一个指针,例如var b *int,此时b就是个指针;*用在变量定义时表示这个变量是个指针,变量赋值时*a,如果a时指针,表示取a指针的值)
所以
a和*&a和*b是一样的,都是a的值,值为1 (把b当做&a看)
再次展开
因为有
var c **int = &b
所以
**c和**&b是一样的,把&约去后
会发现**c和*b是一样的 (从这里也不难看出,c和b也是一样的)聽
又因为上面得到的&a和b是一样的 所以**c和*&a是一样的,再次把*&约去后**c和a是一样的,都是1
不信你试试?
运行的结果内的地址值(0xc200开头的)可能会因不同机器运行而不同,你懂的
变量、指针地址、指针变量、取地址、取值的相互关系和特性如下:
- 对变量进行取地址操作使用
&
操作符,可以获得这个变量的指针变量。 - 指针变量的值是指针地址。
- 对指针变量进行取值操作使用
*
操作符,可以获得指针变量指向的原变量的值。
3.实例化结构体
// 结构体类型
type Struct struct {
}
//实例化结构体
s := new(Struct) 或者 s:= &Struct