1.slice和array
package main
import (
"fmt"
)
func main() {
s := []int{1, 2, 3}
ss := s[1:]
for i := range ss {
ss[i] += 10 //slice中改变数组的值会将原数组中的值改变
}
fmt.Println(s)
ss = append(ss, 4) //append后的值赋给了变量ss,则ss就不会指向原数组
fmt.Println(ss)
for i := range ss {
ss[i] += 10
}
fmt.Println(ss)
fmt.Println(s)
}
//结果
[1 12 13]
[12 13 4]
[22 23 14]
[1 12 13]
2.:= 与var
:=必须用在func内部,var可以生成一个全局的变量
没声明和已经声明的都可以用 := ,但是没有声明的不能直接用 =:
x, _ := f() //错,x已经声明不需要用 :=
x, _ = f() //对, x已经声明可以直接使用 =
x, y := f() //对, y没有声明
x, y = f() //错, y没有声明,不能直接使用 =
3.map的正确使用方法
使用map,必须使用make生成map,否则不能初始化map的值。
var m make(map[string]int) //使用make来初始化map
for key, ok :=m["b"]; ok { //使用ok来判断遍历的正确是否,不用其他方式
println(v)
}
4.strct 的初始化和调用
//定义struct
type Student struct { id int name string address string age int }
1.赋值方式:
var s *Student = new(Student) s.id = 101 s.name = "Mikle" s.address = "红旗南路" s.age = 18
2.
var s1 *Student = &Student{102, "John", "Nanjing Road", 19}
这两种都是指针类型的。package main
type S struct { m string } func f() *S { return &S{"foo"} //A } func main() { p := *f() //B,这里加*是表示返回的是指针类型 *&正好中和,*是获取指针的值。 print(p.m) //print "foo" }
5.传参是传指针还是具体的变量。
如果参数func(p *interface{}
) 则只能传指针类型,
如果参数func(p
interface{}
) 可以传指针和具体变量。
package main
type S struct {}
func f(x interface{}) {}
func g(x *interface{}) {}
func main() {
s := S{}
p := &s
f(s) //A correct
g(s) //B incorrect
f(p) //C correct
g(p) //D incorrect
}
6.存指针的map的方式,指针是*int
m := make(map[int]*int)
7.for循环的i,获取临时变量的指针,由于go的闭包属性,
package main
const N = 3
func main() {
m := make(map[int]*int)
for i := 0; i < N; i++ {
m[i] = &i //A
}
for _, v := range m {
print(*v)
}
}
由于闭包关系,最后所引用的值,则是最后一个的值。因此要改变这种情况,最好是在for循环内再重新常见一个变量
package main
const N = 3
func main() {
m := make(map[int]*int)
for i := 0; i < N; i++ {
j := int(i) //这是一个新的变量,因此不会被后来者覆盖。
m[i] = &j
}
for _, v := range m {
print(*v)
}
}
8.var 的全局变量定义
必须要声明变量的类型,例如: var s int