Go 语言 在线

2200go-pointer-to-pointer

指向指针的指针的指针

package main
import "fmt"

func main(){
  var a int = 1
  var ptr1 *int = &a
  var ptr2 **int = &ptr1
  var ptr3 **(*int) = &ptr2 // 也可以写作:var ptr3 ***int = &ptr2
  // 依次类推
  fmt.Println("a:", a)
  fmt.Println("ptr1", ptr1)
  fmt.Println("ptr2", ptr2)
  fmt.Println("ptr3", ptr3)
  fmt.Println("*ptr1", *ptr1)
  fmt.Println("**ptr2", **ptr2)
  fmt.Println("**(*ptr3)", **(*ptr3)) // 也可以写作:***ptr3
}

执行结果:

a: 1ptr1 0xc0420140b0ptr2 0xc042004028ptr3 0xc042004030*ptr1 1**ptr2 1**(*ptr3) 1

2199go-passing-arrays-to-functions

我觉得这个解说有点模糊,因为没有区分数组和切片:

声明数组:

nums := [3]int{1,2,3,}

声明切片:

nums := []int{1,2,3}

没有所谓没有声明长度的数组存在。

2198go-passing-arrays-to-functions

多维数组传参:

package main

func prt(arr [][] float32){
    for i:= 0;i < 3;i++{
        println(arr[i][0])
    }
}

func main(){
    var arr = [][]float32 {{-1,-2},{-3,-4},{-5}}
    prt(arr)
}

2197go-passing-arrays-to-functions

func main() {
    var array = []int{1, 2, 3, 4, 5}
    /* 未定义长度的数组只能传给不限制数组长度的函数 */
    setArray(array)
    /* 定义了长度的数组只能传给限制了相同数组长度的函数 */
    var array2 = [5]int{1, 2, 3, 4, 5}
    setArray2(array2)
}

func setArray(params []int) {
    fmt.Println("params array length of setArray is : ", len(params))
}

func setArray2(params [5]int) {
    fmt.Println("params array length of setArray2 is : ", len(params))
}

输出:

params array length of setArray is :  5
params array length of setArray2 is :  5

初始化数组长度后,元素可以不进行初始化,或者不进行全部初始化,但未进行数组大小初始化的数组初始化结果元素大小就为多少。

2196go-method

Go 没有面向对象,而我们知道常见的 Java。

C++ 等语言中,实现类的方法做法都是编译器隐式的给函数加一个 this 指针,而在 Go 里,这个 this 指针需要明确的申明出来,其实和其它 OO 语言并没有很大的区别。

在 C++ 中是这样的:

class Circle {
  public:
    float getArea() {
       return 3.14 * radius * radius;
    }
  private:
    float radius;
}

// 其中 getArea 经过编译器处理大致变为
float getArea(Circle *const c) {
  ...
}

在 Go 中则是如下:

func (c Circle) getArea() float64 {
  //c.radius 即为 Circle 类型对象中的属性
  return 3.14 * c.radius * c.radius
}