云服务器代理商-凯铧互联

golang 碰壁笔记

切片和map interface,channel当参数都是引用传递,数组和struct为值传递 需要*和&(*可以省略)
函数和struct 名字首字母需大写 其他包才可调用 否则不可调用struct里面的属性也要大写才可以!!!
                                      *User是一种类型,表示User的指针。&User是取User的指针,可以理解成User转换成*User
值传递
传递是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。
基础类型都是值传递,地球人都知道。

引用传递
引用传递是指在调用函数时将实际参数的地址传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。

func swap(x *int, y *int) {
   var temp int
   temp = *x    /* 保持 x 地址上的值 */
   *x = *y      /* 将 y 值赋给 x */
   *y = temp    /* 将 temp 值赋给 y */
}

Go 语言中同时有函数和方法。一个方法就是一个包含了接受者的函数,接受者可以是命名类型或者结构体类型的一个值或者是一个指针。所有给定类型的方法属于该类型的方法集。

func (variable_name variable_data_type) function_name() [return_type]{ /* 函数体*/ }

举个例子:

/* 定义结构体 */
type Circle struct {
  radius float64
}

func main() {
  var c1 Circle
  c1.radius = 10.00
  fmt.Println("Area of Circle(c1) = ", c1.getArea())
}

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



map 是无序的!!!! 所以需要sort做自定义循环
举例:
package main
import (
    "fmt"
    "sort"
)
type Person struct {
    Name string
    Age  int
}

func (p Person) String() string {
    return fmt.Sprintf("%s: %d", p.Name, p.Age)
}

// ByAge implements sort.Interface for []Person based on
// the Age field.
type ByAge []Person

func (a ByAge) Len() int           { return len(a) }
func (a ByAge) Swap(i, j int)      { a[i], a[j] = a[j], a[i] }
func (a ByAge) Less(i, j int) bool { return a[i].Age < a[j].Age }

func main() {
    people := []Person{
        {"Bob", 31},
        {"John", 42},
        {"Michael", 17},
        {"Jenny", 26},
    }

    fmt.Println(people)
    sort.Sort(ByAge(people))
    fmt.Println(people)
}

结果:
[Bob: 31 John: 42 Michael: 17 Jenny: 26] 
[Michael: 17 Jenny: 26 Bob: 31 John: 42]



Go中只有值传递。 slice是引用类型, 但并不是传引用!

什么叫传引用?

比如有以下代码:

var a Object

doSomething(a) // 修改a的值

print(a)
如果函数doSomething修改a的值, 然后print打印出来的也是修改后的值,

那么就可以认为doSomething是通过引用的方式使用了参数a.


循环数据同样的时候一定要注意指针是否一样!!!!


实例化建议

return的时候建议 return 实例化之后的 而不是指针

要不然如果你要赋值给变量的话 你需要先new 或者你循环赋值或者修改也需要new一下 因为你使用的是指针地址 而不是实例化 独立出来的变量

赞(0) 打赏
未经允许不得转载:云服务器代理商-凯铧互联 » golang 碰壁笔记

评论 抢沙发

评论前必须登录!

 

凯铧互联专注云计算

联系我们了解更多

觉得文章有用就打赏一下文章作者

微信扫一扫打赏