這是一個建立於
的文章,其中的資訊可能已經有所發展或是發生改變。
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 intname stringaddress stringage int}
1.賦值方式:
var s *Student = new(Student)s.id = 101s.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 maintype 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 mainconst N = 3func 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