一文带你玩透结构体和方法

package main

import (
    "fmt"
)

//定义结构体类型User
type User struct {
    username string "用户名"
    password string "密码"
    mail     string "邮箱"
}

func main() {
    //初始化方式1
    var user User
    user.username = "ttr"
    user.password = "abc123"
    user.mail = "992424875@qq.com"
    fmt.Println(user)

    //初始化方式2
    user1 := User{"chavis", "1qaz#EDC", "847575@qq.com"}
    fmt.Println(user1)

    //初始化方式3
    user2 := User{username: "root", password: "abc@9089", mail: "root@11.com"}
    fmt.Println(user2)
}
package main

import "fmt"

type Device struct {
    ip        string
    user      string
    pwd       string
    loginType string 登录类型
}

type Idc struct {
    device Device
    num    int
    addr   string
}

func main() {
    idc := Idc{
        device: Device{ip: "10.1.1.1", user: "root", pwd: "1qaz#EDC", loginType: "ssh"},
        num:    907745,
        addr:   "GZ",
    }
    fmt.Println(idc)
}

输出:

{{10.1.1.1 root 1qaz#EDC ssh} 907745 GZ}

结构体定义完后是没有分配内存的,需要实例话之后才可以使用结构体。实例化有3种方式:变量定义、new、&符号。

package main

import "fmt"

type Host struct {
    user string
    pwd  string
}

func main() {
    // 变量定义的方式实例化结构体
    var h Host
    h.user = "root"
    h.pwd = "1qaz#EDC"
    fmt.Println(h)

    // new的方式实例化结构体
    var h1 = new(Host)
    h1.user = "admin"
    h1.pwd = "2345#EDC"
    fmt.Println(h1)

    // &符号定义的方式实例化结构体
    var h2 = &Host{}
    h2.user = "ttr"
    h2.pwd = "98768#EDC"
    fmt.Println(h2)
}
package main

import (
    "fmt"
)

type User struct {
    username string "用户名" //"用户名"是标签
    password string "密码"
    mail     string "邮箱"
}

func main() {
    user := User{username: "ttr", password: "1qaz@WSX", mail: "996298929@qq.com"}
    fmt.Println(user)
}

匿名结构体不用类型名称,不用使用type关键字定义。

package main

import "fmt"

func main() {
    //基本结构
    user := struct {
    }{}
    fmt.Println(user)

    //定义和初始化
    user1 := struct {
        name string
        age  int
    }{
        "tantianran",
        18,
    }
    fmt.Println(user1)
    fmt.Println(user1.name)
    fmt.Println(user1.age)
}
package main

import (
    "fmt"
)

type User struct {
    name string
    age  int
}

func (User) show() {
    fmt.Println("hello")
}

func main() {
    u := User{name: "ttr", age: 17}
    u.show()
}
package main

import (
    "fmt"
)

type User struct {
    name string
    age  int
}

func (u User) show() {
    fmt.Println(u.name, u.age)
}

func main() {
    u := User{name: "ttr", age: 17} //初始化并实例化
    u.show() //调用方法

}

输出:

ttr 17
package main

import (
    "fmt"
)

type User struct {
    name string
    age  int
}

func (u *User) chage() {
    u.name = "chavis"
    u.age = 30
}

func main() {
    u := User{name: "ttr", age: 17} //初始化和实例化
    fmt.Println(u.name, u.age)      //修改前
    u.chage()                       //调用chage方法修改已经初始化好的值
    fmt.Println(u.name, u.age)      //修改后
}

输出:

ttr 17
chavis 30

如果不是指针类型,在方法内是无法修改外部已经初始化好的结构体的值,看下面效果

package main

import "fmt"

type User struct {
    name string
    age  int
}

func (u User) chage() {
    u.name = "chavis"
    u.age = 30
}

func main() {
    u := User{name: "ttr", age: 17}
    u.chage()
    fmt.Println(u)
}

输出:

{ttr 17}

看上面的效果可以知道没有被修改成功,因为是值传递,而如果是指针的话,就是直接指向了已经初始化了值且实例化完并赋给变量u所在的那块内存地址。

package main

import (
    "fmt"
)

type User struct {
    name string
    age  int
}

func (u *User) chage() *User {
    u.name = "chavis"
    u.age = 30
    return u
}

func main() {
    u := User{name: "ttr", age: 17}
    a := u.chage()
    fmt.Println(*a)
}

输出:

{chavis 30}
package main

import "fmt"

type User struct {
    name string
    age  int
}

func chage(data *User) {
    data.name = "tantianran"
    data.age = 30
}

func main() {
    u := &User{name: "ttr", age: 17}
    chage(u)
    fmt.Println(*u)

    //也可以这样
    u1 := User{name: "ttr", age: 17}
    chage(&u1)
    fmt.Println(u1)
}
package main

import "fmt"

type MyInt int

func (x MyInt) check() bool {
    if x > 100 {
        return true
    } else {
        return false
    }
}

func main() {
    a := MyInt(56)
    ret := a.check()
    fmt.Println(ret)
}

输出:

false
package main

import "fmt"

type MyInt int

func (x MyInt) add(y MyInt) MyInt {
    return x + y
}

func main() {
    a := MyInt(56)
    ret := a.add(54)
    fmt.Println(ret)
}

输出:

110
package main

import (
    "encoding/json"
    "fmt"
)

type Host struct {
    Hostname string
    Ip       string
}

func main() {
    h := Host{
        Hostname: "web01",
        Ip:       "10.1.1.23",
    }
    if jsonStr, err := json.Marshal(h); err != nil {
        fmt.Println(err)
    } else {
        fmt.Println(string(jsonStr))
    }
}

输出:

{"Hostname":"web01","Ip":"10.1.1.23"}

注意:结构体的字段首写字母要大写,否则json包无法读取到字段,进而转换失败(报错),Go语言是通过首字母的大小写来控制访问权限。无论是方法,变量,常量或是自定义的变量类型,如果首字母大写,则可以被外部包访问,反之则不可以。而结构体中的字段名,如果首字母小写的话,则该字段无法被外部包访问和解析。

package main

import (
    "encoding/json"
    "fmt"
)

type Host struct {
    Hostname string json:"hostname" //标签加在这里
    Ip       string json:"ip" //标签加在这里
}

func main() {
    h := Host{
        Hostname: "web01",
        Ip:       "10.1.1.23",
    }
    if jsonStr, err := json.Marshal(h); err != nil {
        fmt.Println(err)
    } else {
        fmt.Println(string(jsonStr))
    }
}

输出:

{"hostname":"web01","ip":"10.1.1.23"}
package main

import (
    "encoding/json"
    "fmt"
)

type Host struct {
    Hostname string
    Ip       string
}

func main() {
    jsonData := {"hostname":"web01","ip":"10.1.1.23"}
    var h Host
    if err := json.Unmarshal([]byte(jsonData), &h); err != nil {
        fmt.Println("Error =", err)
        return
    }
    fmt.Println(h.Hostname)
    fmt.Println(h.Ip)
    fmt.Println(h)
}

输出:

web01
10.1.1.23
{web01 10.1.1.23}

Original: https://www.cnblogs.com/ttropsstack/p/16749639.html
Author: 不背锅运维
Title: 一文带你玩透结构体和方法

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/582282/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • QT父类信号调用子类槽函数

    故事背景:我定义了一个QT父类,里面有自定义信号和槽函数,我在main函数定义父类指针指向子类对象,此时发信号,子类收不到,开始咱们的探险之路。。。 解决方案:根据加断点发现调用的…

    Linux 2023年6月13日
    076
  • 搭建docker镜像仓库(二):使用harbor搭建本地镜像仓库

    一.系统环境 二.前言 三.Harbor 四.使用harbor搭建私有镜像仓库 4.1 环境介绍 4.2 k8smaster节点安装配置harbor 4.2.1 安装harbor离…

    Linux 2023年6月7日
    0116
  • UDS诊断应用层笔记

    UDS概述 UDS(Unified Diagnostic Services,统一的诊断服务)诊断协议是在汽车电子ECU环境下的一种诊断通信协议,在 ISO 14229中规定。它是从…

    Linux 2023年6月13日
    094
  • 【小记】Linux 快速查找并结束僵尸进程

    Linux SSH 连接后显示: There is 1 zombie process. 说明当前正在运行的系统当中存在1个僵尸进程正在无意义消耗资源。 ==============…

    Linux 2023年6月13日
    0109
  • BKT的胡测题解:第一套第一题parts

    博客园 :当前访问的博文已被密码保护 请输入阅读密码: Original: https://www.cnblogs.com/Grharris/p/11530239.htmlAuth…

    Linux 2023年6月6日
    081
  • 上篇:34个JavaScript栗子,从易到难。

    alert("hello world") document.write("hello world") console.log("好…

    Linux 2023年6月7日
    077
  • Python 练习题:用索引取出LIST中的值

    请用索引取出下面list的指定元素,分别为Apple,Python,Lisa -*- coding: utf-8 -*- 请用索引取出下面list的指定元素 L = [ [‘App…

    Linux 2023年6月8日
    089
  • Redis下载及安装(windows版)

    下载地址1、Github下载地址:https://github.com/MicrosoftArchive/redis/releases2、百度网盘下载地址 https://pan….

    Linux 2023年5月28日
    080
  • markdown插入代码块导致列表缩进异常的解决方法

    前言 一、问题描述 总结 前言 最近正在用markdown写博客,发现插入代码块后,代码块和代码块后的内容会产生缩进异常,翻了翻网页,发现又是经典的一模一样的文章一大把,尝试了之后…

    Linux 2023年6月7日
    0182
  • Redis主从复制

    一、主从复制 1、redis为什么还要主从复制? 和Mysql主从复制的原因一样,Redis虽然读取写入的速度都特别快,但是也会产生读压力特别大的情况。为了分担读压力,Redis支…

    Linux 2023年5月28日
    062
  • C++ 之处理模板化基类的成员名称

    问题描述 假设有下面这么一段简单的代码,其中定义了两个类模板,一个基类 Animal,一个派生类 Dog: #include #include using namespace st…

    Linux 2023年6月7日
    091
  • Linux之HTTPS

    一、HTTPS介绍 1.1 概述 为什么需要使用HTTPS,因为HTTP不安全,当我们使用http网站时,会遭到劫持和篡改,如果采用https协议,那么数据在传输过程中是加密的,所…

    Linux 2023年6月14日
    084
  • scp 远程安全复制文件

    scp是 secure copy 的缩写,相当于 cp命令 + SSH。它的底层是 SSH 协议,默认端口是22,相当于先使用 ssh命令登录远程主机,然后再执行拷贝操作。 scp…

    Linux 2023年6月7日
    083
  • shell脚本 -d 是目录文件,那么-e,-f分别是什么?还有”! -e”这又是什么意思呢?

    -e filename 如果 filename存在,则为真-d filename 如果 filename为目录,则为真 -f filename 如果 filename为常规文件,则…

    Linux 2023年5月28日
    0173
  • redis

    ./redis-cli -a 111 KEYS "key*" | xargs ./redis-cli -a 111 DEL Original: https://…

    Linux 2023年5月28日
    086
  • NGINX压力测试

    Nginx可以作为HTTP服务器和反向代理服务器。反向代理服务器取决于后端服务器的性能,这次只针对HTTP服务器做性能测试。Nginx作为服务器对于网络的性能必然是非常依赖的,尤其…

    Linux 2023年6月14日
    086
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球