type user struct {
name string
}
func main() {
var u = user{name: "old name"}
fmt.Println(u) // {old name}
changeUserName(u) // 此处是值传递,所以u里的字段值不会被调用的方法所改变
fmt.Println(u) // {old name}
}
func changeUserName(u user) {
u.name = "new name"
}
// 示范1:
var arr = make([]int, 2)
fmt.Println(len(arr), cap(arr), arr) // 2, 2, [0, 0]
// 示范2:
var arr = make([]int, 0, 2)
fmt.Println(len(arr), cap(arr), arr) // 0, 2, []
// 示范1:
var arr = make([]int, 0)
append(arr, 10)
fmt.Println(arr) // []
arr = append(arr, 10) // 强烈推荐的写法
fmt.Println(arr) // [10]
// 示范2:
var arr = make([]int, 0, 2)
append(arr, 10)
fmt.Println(arr) // [10]
// 示范1:
func main() {
arr1 := []int{1, 2, 3}
arr2 := make([]*int, 0)
for _, v := range arr1 {
arr2 = append(arr2, &v) // 此时取的是变量v的ptr,而不是arr1中元素的ptr
}
for _, v := range arr2 {
fmt.Print(*v)
}
}
// 最后输出:333
// 示范2:
func main() {
arr1 := []int{1, 2, 3}
arr2 := make([]*int, 0)
for _, v := range arr1 {
t := v // 变量t每轮循环都新定义一次,分别存了arr1中的元素复制值
arr2 = append(arr2, &t)
}
for _, v := range arr2 {
fmt.Print(*v)
}
}
// 最后输出:123
func main() {
var arr1 [100]int
var arr2 [200]int
// 下面的代码是错的,arr1和arr2是不同的类型变量
// arr2 = arr1
}
// 示范1:
func notGCSample() []int{
var arr1 [100]int
var slice = arr1[98:100]
return slice
}
// 调用方拿到notGCSample返回值后,[100]int所占内存不会释放,因为slice底层数组使用的还是[100]int
// 示范2:
func canGCSample() []int{
var arr1 [100]int
var slice = make([]int, 2)
copy(slice, arr1[98:100])
return slice
}
// 调用方拿到notGCSample返回值后,[100]int所占内存会释放
// 示范1:
func getAddFunc() func() int {
i := 0
return func() int {
i++
return i
}
}
func main() {
f1 := getAddFunc()
fmt.Println(f1()) // 1
fmt.Println(f1()) // 2
f2 := getAddFunc()
fmt.Println(f2()) // 1
fmt.Println(f2()) // 2
}
// 示范2:
func main() {
wg := sync.WaitGroup{}
wg.Add(5)
for i := 0; i < 5; i++ {
go func() {
println(i)
wg.Done()
}()
}
wg.Wait()
}
// 最后输出:不一定,根据goroutine调度有关,可能是55555、45555、34555、35555等
type user struct {
name string
}
// 接收器是值传递而不是引用传递,所以原对象的字段值不会改变
func (u user) setUserNameByVal(name string) {
u.name = name
}
// 使用指针作为接收器,引用的是原对象,所以会修改原对象的字段值
func (u *user) setUserNameByPtr(name string) {
u.name = name
}
func main() {
u := user{name: "old name"}
fmt.Println(u) // {old name}
u.setUserNameByVal("new name by val")
fmt.Println(u) // {old name}
u.setUserNameByPtr("new name by ptr")
fmt.Println(u) // {new name by ptr}
}
// 示范1:
var bigArr [10000]int
for i, v := range bigArr { // 此处相当于拷贝了一份bigArr
// do something
}
// 示范2:
var bigArr [10000]int
for i, v := range bigArr[0:] { // 此处相当于拷贝了一份bigArr[0:]的slice
// do something
}
// 示范1:
valMap := map[string][3]int{"1": {1, 2, 3}}
valMap["1"][0] = 10 // error,因为数组是值
val := valMap["1"][0] // ok
// 示范2:
ptrMap := map[string][]int{"1": {1, 2, 3}}
ptrMap["1"][0] = 10 // ok,因为slice相当于指针
val := valMap["1"][0] // ok
Not Found
, 但是 Find 方法没查询到数据不返回任何错误