linuxea:go结构体简单用法(38)

marksugar
2020-12-12 / 0 评论 / 734 阅读 / 正在检测是否收录...
温馨提示:
本文最后更新于2020年12月12日,已超过279天没有更新,若内容或图片失效,请留言反馈。

结构体是由一系列属性组成的复合数据类型,每个属性都具有名称,类型,结构体将属性组合在一起由程序进行处理
请输入图片描述

1.结构体定义

  • 自定义类型

在go语言中使用type声明一种新的类型,语法格式如下:

type Typename Formatter

某些时候我们想表示某种类型具体的含义,就可以定义一个自己的类型。

尤为重要的是,当你使用type声明了类型之后,在定义的类型将不是同一个类型,比如:

type num int
var num1 int

num和num1不是同一个类型。如果要进行运算,需要转换。

1.1定义类型

示例一

通常我们定义一个变量, 如:age,表示年龄的时候,一般使用var 直接定义,如下

var Age int

但是,这样并不能体现出age的含义,那就可以定义一个type Age int

type Age int

而后在定义变量就成了这样

var Age Age 

如下

package main
import (
    "fmt"
)
type Age int
func main(){
    var Age Age
    fmt.Println(Age)
}

运行

[root@linuxea.com /opt/Golang/work5]# go run type.go
0

我们可以进行赋值或者计算

Age += 18

如下:

package main
import (
    "fmt"
)
type Age int
func main(){
    var Age Age
    Age += 18
    fmt.Println(Age)
}

运行

[root@linuxea.com /opt/Golang/work5]# go run type.go
18

示例二

定义个User,格式是string类型

type User map[string]string

如下:

package main
import (
    "fmt"
)
type User map[string]string
func main(){
    me := make(User)
    me["addr"] = "Beijing"
    fmt.Println(me)
    fmt.Printf("%T\n",me)
}

运行

[root@linuxea.com /opt/Golang/work5]# go run user.go
map[addr:Beijing]
main.User

示例三

定义一个匿名函数类型

type Callback func(...string)

如下:

package main
import (
    "fmt"
)
type Callback func(...string)
func main(){
    var list Callback = func(args ...string){
        for i,v := range args{
            fmt.Println(i,":",v)
        }
    }
    list("a","b","c")
}

运行

[root@linuxea.com /opt/Golang/work5]# go run callback.go
0 : a
1 : b
2 : c

假如现在要定义一个结构,就需要结构体

1.2定义结构体

假设现在定义一个用户的结构体,要声明就需要使用struct模式进行定义,模式就可以认为是属性,比如,用户就需要有id属性,name,生日等。

结构体的零值就是结构体内的类型的零值

  • 示例

定义User的结构体

type User struct {
    ID int
    Name string
    Birthdy time.Time
    Addr string
    Tel string
    Remark string
}

而后var定义变量,类型即可

var user User

如下:

使用%#v打印出类型

package main
import (
    "fmt"
    "time"
)
type User struct {
    ID int
    Name string
    Birthdy time.Time
    Addr string
    Tel string
    Remark string
}
func main(){
    var user User
    fmt.Println(user)
    fmt.Printf("%#v",user)
}

运行

[root@linuxea.com /opt/Golang/work5]# go run struct.go
{0  0001-01-01 00:00:00 +0000 UTC   }
main.User{ID:0, Name:"", Birthdy:time.Time{wall:0x0, ext:0, loc:(*time.Location)(nil)}, Addr:"", Tel:"", Remark:""}

初始化结构体1

我们可以对这些进行初始化赋值

这种方式的初始化,需要对每个值进行赋值,通过定义的顺序进行赋值。

    var user2 User{1,"mark",time.Now(),"北京市","10010","mark"}

代码块

package main
import (
    "fmt"
    "time"
)
type User struct {
    ID int
    Name string
    Birthdy time.Time
    Addr string
    Tel string
    Remark string
}
func main(){
    var user User
    fmt.Println(user)
    fmt.Printf("%#v",user)


    var user2 User = User{1,"mark",time.Now(),"北京市","10010","mark"}
    fmt.Println(user2)
    fmt.Printf("%#v",user2)
}

运行

[root@linuxea.com /opt/Golang/work5]# go run struct.go
{0  0001-01-01 00:00:00 +0000 UTC   }
main.User{ID:0, Name:"", Birthdy:time.Time{wall:0x0, ext:0, loc:(*time.Location)(nil)}, Addr:"", Tel:"", Remark:""}{1 mark 2019-10-04 17:28:24.492833938 +0800 CST m=+0.000264968 北京市 10010 mark}
main.User{ID:1, Name:"mark", Birthdy:time.Time{wall:0xbf5de20e1d600c92, ext:264968, loc:(*time.Location)(0x56a0c0)}, Addr:"北京市", Tel:"10010", Remark:"mark"}

我们可以对单个属性进行调用

    fmt.Println(user4.Name)

初始化结构体2

  • 零值

如果要显示使用的是零值就可以什么都不传递进行配置

var user3 User = User{}
fmt.Println(user3)
package main
import (
    "fmt"
    "time"
)
type User struct {
    ID int
    Name string
    Birthdy time.Time
    Addr string
    Tel string
    Remark string
}
func main(){
    var user3 User = User{}
    fmt.Println(user3)
}

运行

[root@linuxea.com /opt/Golang/work5]# go run struct.go
main.User{ID:1, Name:"mark", Birthdy:time.Time{wall:0xbf5de2823a31218c, ext:494037, loc:(*time.Location)(0x56a0c0)}, Addr:"北京市", Tel:"10010", Remark:"mark"}{0  0001-01-01 00:00:00 +0000 UTC   }

我们可以对单个属性进行调用

    fmt.Println(user4.Name)

初始化结构体3

指定属性名的方式进行赋值,如下:

  • 使用属性名进行赋值就可以不用按照顺序赋值,并且可以省略一些不用的赋值,比如省略掉Remark:"mark"

尤为注意的是,这里括号内的{}的每一行都需要,

    var user4 User = User{
        ID:1,
        Name:"mark",
        Birthdy:time.Now(),
        Addr:"上海",
        Tel:"10086",
    }

我们可以对单个属性进行调用

    fmt.Println(user4.Name)

如下:

package main
import (
    "fmt"
    "time"
)
type User struct {
    ID int
    Name string
    Birthdy time.Time
    Addr string
    Tel string
    Remark string
}
func main(){
    var user4 User = User{
        ID:1,
        Name:"mark",
        Birthdy:time.Now(),
        Addr:"上海",
        Tel:"10086",
    }
    
    fmt.Println(user4)
    fmt.Printf("%#v\n",user4)    
    fmt.Println(user4.Name)
}

运行

{1 mark 2019-10-04 17:55:22.37708593 +0800 CST m=+0.000061322 上海 10086 }
main.User{ID:1, Name:"mark", Birthdy:time.Time{wall:0xbf5de3a29679dfea, ext:61322, loc:(*time.Location)(0x56a0c0)}, Addr:"上海", Tel:"10086", Remark:""}
mark

1.3定义结构体指针

我们可以使用指针给结构体传值,假设结构体如下:

type User struct {
    ID int
    Name string
    Birthdy time.Time
    Addr string
    Tel string
    Remark string
}

指针只需要直接使用*即可

var pointer *User

也可以直接进行赋值,为此定义user4

    var user4 User = User{
        ID:1,
        Name:"mark",
        Birthdy:time.Now(),
        Addr:"上海",
        Tel:"10086",
    }

而后使用指针赋值给*User

var pointer *User = &user4

代码块如下

package main
import (
    "fmt"
    "time"
)
type User struct {
    ID int
    Name string
    Birthdy time.Time
    Addr string
    Tel string
    Remark string
}
func main(){
    var user4 User = User{
        ID:1,
        Name:"mark",
        Birthdy:time.Now(),
        Addr:"上海",
        Tel:"10086",
    }
    var pointer *User = &user4
    fmt.Println(pointer)
}

运行

[root@linuxea.com /opt/Golang/work5]# go run pointer.go
&{1 mark 2019-10-04 21:51:13.684714251 +0800 CST m=+0.000136163 上海 10086 }
  • 传空值

传递控制大致可以如下即可

package main
import (
    "fmt"
    "time"
)
type User struct {
    ID int
    Name string
    Birthdy time.Time
    Addr string
    Tel string
    Remark string
}
func main(){
    var pointer1 *User = &User{}
    fmt.Println(pointer1)
    fmt.Printf("%#v",pointer1)
}

运行

[root@linuxea.com /opt/Golang/work5]# go run pointer1.go
&{0  0001-01-01 00:00:00 +0000 UTC   }
&main.User{ID:0, Name:"", Birthdy:time.Time{wall:0x0, ext:0, loc:(*time.Location)(nil)}, Addr:"", Tel:"", Remark:""}

也可以使用new,比如:

  • new出来的都是指针类型,一般用于结构体指针,而在切片和映射本身就是引用类型,一般不会使用new,而是make
package main
import (
    "fmt"
    "time"
)
type User struct {
    ID int
    Name string
    Birthdy time.Time
    Addr string
    Tel string
    Remark string
}
func main(){
    var pointer1 *User = new(User)
    fmt.Println(pointer1)
    fmt.Printf("%#v",pointer1)
}

运行

[root@linuxea.com /opt/Golang/work5]# go run pointer2.go
&{0  0001-01-01 00:00:00 +0000 UTC   }
&main.User{ID:0, Name:"", Birthdy:time.Time{wall:0x0, ext:0, loc:(*time.Location)(nil)}, Addr:"", Tel:"", Remark:""}

2.结构体操作

结构体的获取和修改,我们只需要使用赋值的变量名.属性名即可。而修改直接重新赋值即可。

2.1获取

定义了结构体后,如何通过变量访问里面的属性呢?,如下

package main
import (
    "fmt"
    "time"
)
type User struct {
    ID int
    Name string
    Birthdy time.Time
    Addr string
    Tel string
    Remark string
}
func main(){
    user4 := User{
        ID:1,
        Name:"mark",
        Birthdy:time.Now(),
        Addr:"上海",
        Tel:"10086",
    }
}

此刻,我们访问一个属性,直接可以使用变量名.属性名即可,如下:

比如只单单获取id和name

fmt.Println(user4.ID,user4.Name)

如下:

package main
import (
    "fmt"
    "time"
)
type User struct {
    ID int
    Name string
    Birthdy time.Time
    Addr string
    Tel string
    Remark string
}
func main(){
    user4 := User{
        ID:1,
        Name:"mark",
        Birthdy:time.Now(),
        Addr:"上海",
        Tel:"10086",
    }
    fmt.Println(user4.ID,user4.Name)
}

运行

[root@linuxea.com /opt/Golang/work5]# go run struct2.go 
1 mark

2.2修改

比如,我们直接修改tel

user4.Tel = "1008600"

代码块

[root@linuxea.com /opt/Golang/work5]# cat struct2.go
package main
import (
    "fmt"
    "time"
)
type User struct {
    ID int
    Name string
    Birthdy time.Time
    Addr string
    Tel string
    Remark string
}
func main(){
    user4 := User{
        ID:1,
        Name:"mark",
        Birthdy:time.Now(),
        Addr:"上海",
        Tel:"10086",
    }
    fmt.Println(user4.ID,user4.Name,user4.Tel)
    user4.Tel = "1008600"
    fmt.Println(user4.ID,user4.Name,user4.Tel)
}

运行

[root@linuxea.com /opt/Golang/work5]# go run struct2.go 
1 mark 10086
1 mark 1008600

2.3指针结构体的修改

我们直接使用上面的赋值修改即可

    user := &User{
        ID:2,
        Name: "feeker",
    }

修改,这里用到*来进行解引用,如下

    (*user).Name = "UZI"
    (*user).Tel = "10010"

如下:

package main
import (
    "fmt"
    "time"
)
type User struct {
    ID int
    Name string
    Birthdy time.Time
    Addr string
    Tel string
    Remark string
}
func main(){
    user := &User{
        ID:2,
        Name: "feeker",
    }
    (*user).Name = "UZI"
    (*user).Tel = "10010"
    fmt.Printf("%#v",user)
}

运行

[root@linuxea.com /opt/Golang/work5]# go run struct3.go
&main.User{ID:2, Name:"UZI", Birthdy:time.Time{wall:0x0, ext:0, loc:(*time.Location)(nil)}, Addr:"", Tel:"10010", Remark:""}

2.4指针结构的获取

指针结构体在访问属性的时候,可以直接使用变量名.属性名来进行访问。

    user.Addr = "beijing"
    fmt.Printf("%#v\n",user)

user.Addr = "beijing" 事实上也进行了解应用操作

如下:

package main
import (
    "fmt"
    "time"
)
type User struct {
    ID int
    Name string
    Birthdy time.Time
    Addr string
    Tel string
    Remark string
}
func main(){
    user := &User{
        ID:2,
        Name: "feeker",
    }
    (*user).Name = "UZI"
    (*user).Tel = "10010"
    fmt.Printf("%#v\n",user)

    user.Addr = "beijing"
    fmt.Printf("%#v\n",user)
}

运行

[root@linuxea.com /opt/Golang/work5]# go run struct3.go
&main.User{ID:2, Name:"UZI", Birthdy:time.Time{wall:0x0, ext:0, loc:(*time.Location)(nil)}, Addr:"", Tel:"10010", Remark:""}
&main.User{ID:2, Name:"UZI", Birthdy:time.Time{wall:0x0, ext:0, loc:(*time.Location)(nil)}, Addr:"beijing", Tel:"10010", Remark:""}
0

评论 (0)

取消