首页 > 技术文章 > Golang笔记

bbllw 2020-02-22 16:43 原文

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

推荐阅读