切片和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一下 因为你使用的是指针地址 而不是实例化 独立出来的变量
评论前必须登录!
注册