Go编程基础(array、slice、map和struct)

2018-10-07  本文已影响0人  Michaelhbjian

这篇讲解go语言中数据存储类型array、slice、map和struct,要清楚它们那些是值传递,那些是指针传递(也就是引用类型),这对后面的数据处理非常重要!

1.数组Array

定义数组的格式:

var <varName> [n]<type>
image.png

示例如下:

package main
import "fmt"
func main() {
    //先声明,后赋值
    var a [2] string
    a[0]="hello"
    a[1]="world"
    fmt.Println(a[0],a[1])
    fmt.Println(a)
    //声明并赋值
    prime:=[6]int{2,3,5,7,11,13}
    fmt.Println(prime)
}
image.png

数组需要注意的点:

区分指向数组的指针和指针数组

package main
import "fmt"
func main() {
    //可以利用...不指定数组长度
    a:=[...]int{9:1}
    //指向数组的指针
    var p *[10]int=&a
    fmt.Print(p)
}
image.png
package main
import "fmt"
func main() {
    x,y :=1,2
    //指针数组
    a:=[...]*int{&x,&y}
    fmt.Print(a)
}
image.png

2.切片slice(重点)

切片需要注意的点:

Slice的第一种创建方式:

package main
import "fmt"
func main() {
    //创建一个切片,跟数组相比没有规定长度
    p:=[]int{2,3,5,7,11,13}
    fmt.Println("p==",p)
    for i := 0; i < len(p); i++ {
        fmt.Println(i,p[i])
    }
}

Slice的第二种创建方式:

package main
import "fmt"
func main() {
    //利用make创建包含3个元素,容量为10的slice
    //提前分配容量10是为了增加元素而在此分配内存
    s1:=make([]int,3,10)
    fmt.Println(len(s1),cap(s1))
    //注意打印出来的时候只包含三个元素
    fmt.Println(s1)
}
image.png

Slice与底层数组的对应关系:

image.png

Reslice的理解:

package main
import "fmt"
func main() {
    a:=[]byte{'a','b','c','d','e','f','g','h','i','j','k'}
    //前闭后开
    sa:=a[2:5]
    //转化为字符串
    fmt.Println(string(sa))
    fmt.Println(len(sa),cap(sa))
    //从sa中取出元素--reslice功能
    sb:=sa[3:5]
    //打印出来的是fg,但是sa中并没有fg,这是为什么呢?
    //sa的本质是指针,指向的数组的地址,它会包含从3到最后一个元素的地址。(就像图中阴影部分的元素)
    fmt.Println(string(sb))
}
image.png

Append的理解:

package main
import "fmt"
func main() {
    s1:=make([]int,3,6)
    //按格式输出
    fmt.Printf("%p\n",s1)
    s1 =append(s1,1,2,3)
    fmt.Printf("%v %p\n",s1,s1)
    s1 =append(s1,1,2,3)
    fmt.Printf("%v %p\n",s1,s1)
}
image.png

3.map

map的基本定义:

map创建的方式一:

package main
import "fmt"
func main() {
    //声明一个map,int是key类型,string是value类型
    var m map[int]string
    //初始化map
    m =map[int]string{}
    fmt.Print(m)
}

map创建的方式二:

package main
import "fmt"
func main() {
    //使用make创建一个map
    m:=make(map[int]string)
    m[1]="OK"
    a:=m[1]
    fmt.Println(m)
    fmt.Print(a)
}
image.png

通过rangemap进行初始化操作如下:

package main
import "fmt"
func main() {
    //创建一个slice
    sm:=make([]map[int]string,5)
    //对一个slice进行迭代,并对slice中的map进行初始化(i对代表的索引下标,v是代表对应的值)
    for i:= range sm {
        //注意是通过索引去改变map中的值,否则只是普通的值拷贝
        sm[i] =make(map[int]string,1)
        sm[i][1] ="OK"
        fmt.Println(sm[i])
    }
    fmt.Println(sm)
}
image.png

使用map作为函数的参数传递:引用传递

package main
import "fmt"
func main() {
    a:=map[string]int{
        "Michaeljian":22,
        "Jerry":20,
    }
    mapTest(a)
    fmt.Print(a["Michaeljian"])
}
//将map作为参数传递进去并修改对应的值
func mapTest(b map[string]int) {
    b["Michaeljian"] = 18
}
image.png

4.struct

struct的知识要点:

struct的定义和赋值:

package main
import "fmt"
type person struct {
    Name string
    Age int
}
func main() {
    a:=person{}
    a.Name ="Michaeljian"
    a.Age =25
    fmt.Print(a)
}

使用struct作为函数传递的参数:值传递

package main
import "fmt"
type person struct {
    Name string
    Age int
}
func main() {
    //字面值初始化
    a:=person{
        Name:"Michaeljian",
        Age:25,
    }
    fmt.Println(a)
    A(a)
    fmt.Println(a)
}
func A(p person) {
    p.Age = 12
    fmt.Println("A",p)
}
image.png

如何想要将struct作为引用传递,需要借助指针:

package main
import "fmt"
type person struct {
    Name string
    Age int
}
func main() {
    //字面值初始化
    a:=person{
        Name:"Michaeljian",
        Age:25,
    }
    /**
    //一般在开发中会采用这种的方式,直接将person的地址赋值给a
        a:= &person{
        Name:"Michaeljian",
        Age:25,
    }
    //此时注意要修改Name的值话直接采用下面的方式即可。
    a.Name="Jerry"
    */
    fmt.Println(a)
    //传入struct的地址
    A(&a)
    fmt.Println(a)
}
func A(p *person) {
    p.Age = 12
    fmt.Println("A",p)
}
image.png

使用匿名结构类型声明struct,格式如下:

package main
import "fmt"
func main() {
  //可以a:=&struct{}{}做地址传递
    a:= struct {
        Name string
        Age int
    }{
        Name:"Michaeljian",
        Age:19,
    }
    fmt.Print(a)
}

使用struct的嵌入结构,格式如下:

package main
import "fmt"
type human struct {
    Sex int
}
type teacher struct {
    human
    Name string
    Age int
}
type student struct {
    human
    Name string
    Age int
}
func main() {
    //如何给嵌入结构human中的字段赋值,human:human{Sex:1}
    a:=teacher{Name:"Michaeljian",Age:25,human:human{Sex:1}}
    b:=student{Name:"Jerry",Age:24,human:human{Sex:2}}
    a.Name ="Jerry"
    a.Sex = 100
    fmt.Print(a,b)
}
image.png

参考资料

https://github.com/Unknwon/go-web-foundation

上一篇 下一篇

猜你喜欢

热点阅读