Golang基础5-指针、结构体、方法、接口

指针

和c/c++类似,但是go语言中指针不能进行偏移和运算,安全指针

&(取地址) *(根据地址取值)

nil(空指针)

make和new之前对比:make用于初始化slice,map,channel这样的引用类型

而new用于类型的内存分配,分配的值为类型0值,返回该类型指针

结构体

值传递

没有继承,但是可以通过组合来支持面向对象特性。

结构体中可以包括结构体,但是不能包括本身

简单demo

package mainimport "fmt"type person struct {name stringcity stringage  int8
}func main() {//创建变量var p1 personp1.name = "pprof.cn"p1.city = "北京"p1.age = 18fmt.Printf("p1=%v\n", p1)  //p1={pprof.cn 北京 18}fmt.Printf("p1=%#v\n", p1) //p1=main.person{name:"pprof.cn", city:"北京", age:18}var p2 = new(person)p2.name = "小明"p2.city = "武汉"p2.age = 10fmt.Printf("p2=%v\n", p2)fmt.Printf("p2=%#v\n", p2)//匿名结构体var user struct {Name stringAge  int}//user := struct{//    Name string//    Age  int//}user.Name = "pprof.cn"user.Age = 18fmt.Printf("%#v\n", user)
}

注意可见性,如果变量名首字母大写,在其他包可以访问(类似于public),否则只能在相同package中访问。

结构体的嵌套

对于Student中匿名嵌套的话,输出对应值,不需要s.p

package mainimport "fmt"type Person struct {name stringage  int
}// Student 结构体嵌套和匿名嵌套
type Student struct {p      Personschool stringscore  int
}func main() {s := Student{p:      Person{name: "张三", age: 18},school: "武汉大学",score:  100,}fmt.Println(s.p.name)
}

方法

    • 绑定对象实例,只能为当前包内命名类型定义方法

方法定义:

   func (recevier type) methodName(参数列表)(返回值列表){}参数和返回值可以省略
    • 参数recevier任意命名,若方法未曾使用可省略参数名
    • receive可以是T和*T类型。T不能是接口
    • 不支持方法重载
    • 可以使用value或pointer调用全部方法,编译器自动转换

简单demo

receive的类型T和*T之间对比

package mainimport "fmt"// 结构体
type User struct {Name  stringEmail string
}// 假设T,产生副本不影响原变量
func (u User) Notify() {fmt.Printf("&u = %p\n", &u)fmt.Println("User 通知消息给", u.Name, " 邮箱为:", u.Email)u.Email = "Notify"
}//如果是*T,传入指针,就会影响u1
//func (u *User) Notify() {
//    fmt.Printf("u = %p\n", u)
//    fmt.Println("User 通知消息给", u.Name, " 邮箱为:", u.Email)
//    u.Email = "Notify"
//}func main() {u1 := User{"user1", "user1.com"}fmt.Printf("&u1 = %p\n", &u1)u1.Notify()//u2 := &u1fmt.Println(u1) //不影响u1变量fmt.Println("*********")u2 := &User{"user2", "user2.com"}fmt.Printf("u2 = %p\n", u2)u2.Notify()fmt.Println(u2)}

func (u User) Notify() 方法时输出,传递副本因此地址不同,修改u不影响mian函数的对象值

func(u *User)Notify()传递指针,影响对象变量的值。

总结:方法就是与特定类型关联的函数,方便相当于c++当中class中的成员函数。

匿名字段demo

通过组合实现于override继承之后覆盖方法的效果。

// 结构体
type User struct {Name  stringEmail string
}type Manager struct {UserStage string
}// User的方法
func (u *User) ToString() string {return fmt.Sprintf("%s %s\n", u.Name, u.Email)
}// Manager的方法
func (m *Manager) ToString() string {return fmt.Sprintf("%s %s %s\n", m.Name, m.Email, m.Stage)
}func main() {m := Manager{User: User{"李四", "manage.cn"}, Stage: "经理"}fmt.Println(m.ToString())fmt.Println(m.User.ToString())
}

接口

参考链接:https://www.cnblogs.com/chenny7/p/4497969.html

go语言接口详解:Go 语言接口的原理 | Go 语言设计与实现

interface抽象类型,是一组method的集合,类似于c++中的纯虚函数,如果一个类/对实现了interface中的所有方法就实现了interface接口。通过interface也就是可以实现多态特性。

简单demo

package mainimport "fmt"type Human struct {name  stringage   intphone string
}type Student struct {Human  //匿名字段school stringloan   float32
}type Employee struct {Human   //匿名字段company stringmoney   float32
}// Human实现SayHi方法
func (h Human) SayHi() {fmt.Printf("Hi, I am %s you can call me on %s\n", h.name, h.phone)
}// Human实现Sing方法
func (h Human) Sing(lyrics string) {fmt.Println("La la la la...", lyrics)
}// Employee重载Human的SayHi方法
func (e Employee) SayHi() {fmt.Printf("Hi, I am %s, I work at %s. Call me on %s\n", e.name,e.company, e.phone)
}//func (s Student) SayHi() {
//    fmt.Printf("Hi, I am %s, I study in %s. Loan is %f\n", s.name,
//        s.school, s.loan)
//}
//func (s Student) Sing(lyrics string) {
//    fmt.Println("student Sing")
//}// Interface Men被Human,Student和Employee实现
// 因为这三个类型都实现了这两个方法
type Men interface {SayHi()Sing(lyrics string)
}func main() {mike := Student{Human{"Mike", 25, "222-222-XXX"}, "MIT", 0.0}paul := Student{Human{"Paul", 26, "111-222-XXX"}, "Harvard", 100}sam := Employee{Human{"Sam", 36, "444-222-XXX"}, "Golang Inc.", 1000}tom := Employee{Human{"Tom", 37, "222-444-XXX"}, "Things Ltd.", 5000}//定义Men类型的变量ivar i Men//i能存储Studenti = mikefmt.Println("This is Mike, a Student:")i.SayHi()i.Sing("November rain")//i也能存储Employeei = tomfmt.Println("This is tom, an Employee:")i.SayHi()i.Sing("Born to be wild")//定义了slice Menfmt.Println("Let's use a slice of Men and see what happens")x := make([]Men, 3)//这三个都是不同类型的元素,但是他们实现了interface同一个接口x[0], x[1], x[2] = paul, sam, mikefor _, value := range x {value.SayHi()}
}

通过调用接口相当于实现了多态。

可以继续实现嵌入接口。

空接口demo

空interface(interface{})不包含任何的method

所有的类型都实现了空interface

空接口可以存储任意类型

空interface对于描述起不到任何的作用(因为它不包含任何的method),但是空interface在我们需要存储任意类型的数值的时候相当有用,因为它可以存储任意类型的数值。它有点类似于C语言的void*类型。

    // 定义a为空接口,作为函数参数,或者与slice,map等增强灵活性var a interface{}var i int = 5s := "Hello world"// a可以存储任意类型的数值a = ia = s

interface{}可断言类型

空接口断言demo

package mainimport "fmt"type Human struct {Name stringAge  int
}type Student struct {HumanSchool string
}// 作为函数形参
func Show(a interface{}) {fmt.Printf("type of:%T value:%v\n", a, a)
}//判断当前类型
func JustifyType(i interface{}) {switch v := i.(type) {case string:fmt.Println("当前传入为string:", v)case int:fmt.Println("当前传入为int:", v)case Student:fmt.Println("当前为Student类型", v)default:fmt.Println("暂未预料")}
}func main() {i := "hello"Show(i)JustifyType(i)j := 10Show(j)JustifyType(j)Show(123)JustifyType(123)h := Human{"Human", 123}Show(h)JustifyType(h)k := Student{}Show(k)JustifyType(k)}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/3038.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Metasploit Framework(MSF)从入门到实战(一)

MSF的简介 目前最流行、最强大、最具扩展性的渗透测试平台软件 基于Metasploit进行渗透测试和漏洞分析的流程和方法 2003年由HD More发布第一版,2007年用ruby语言重写 架集成了渗透测试标准 (PETS) 思想 一定程度上统一了渗透测试和漏洞研究的工作环…

针孔相机模型原理坐标系辨析内参标定流程内参变换

针孔相机的内参标定 针孔相机原理真空相机模型图片的伸缩和裁剪变换 内参标定———非线性优化张正定标定详细原理(含公式推导)通过多张棋盘格照片完成相机的内参标定流程(C代码)其他工具箱 相机分为短焦镜头和长焦镜头,短焦镜头看到的视野更广阔,同样距…

Debian常用命令

Debian是一种常见的Linux发行版,以下是一些常用的Debian命令: 1. apt-get:用于安装、升级和删除软件包。例如:apt-get install package_name。 2. dpkg:用于管理Debian软件包。例如:dpkg -i package_name…

白平衡简介

文章目录 白平衡的概念白平衡的调节常见的白平衡模式 白平衡的概念 白平衡是指摄影、摄像和显示技术中的一项重要概念,用于调节图像中的白色或中性灰色的色彩,使其看起来在不同光源条件下都是准确的白色或灰色。白平衡的主要目的是确保图像的色彩准确性…

C语言 | Leetcode C语言题解之第49题字母异位词分组

题目: 题解: /*1.将字符串原串与副本进行绑定成一个节点2.对字符串副本进行按ascii码表进行从小到大排序3.按照字符串进行比较排序4.合并 */ typedef struct Node{char*s;char*s_vice;int len; }Node;void sortShellChar(char*s,int len){for(int dista…

TS类型断言

类型断言(Type Assertions)在 TypeScript 中确实是一种在表达式级别上临时指定类型的机制,它允许开发者在编译时覆盖编译器的类型推断结果。类型断言有两种语法形式: “尖括号”语法: let someValue: any this is a s…

查找总价格为目标值的两个商品 ---- 双指针

题目链接 题目: 分析: 解法一: 暴力解法, 将每两个的和都算出来, 判断是否为目标值解法二: 数组中的数是按升序排序的, 我们可以定义左右指针 如果和小于目标值, 则应该让和变大, 所以左指针右移如果和大于目标值, 则应该让和变小, 所以右指针左移 思路: 定义left 0, righ…

python学习29:python中的字典dict

python中的字典dict 1.字典的定义: 同样是使用{},不过存储的元素是一个个的:键值对,如下语法: """ 字典的定义: #定义字典字面量:{key:value,key:value,....,key:value} #定义字典变量&am…

每天一个数据分析题(二百九十)——直方图与条形图

关于直方图与条形图的描述,下列说法正确的是() A. 直方图用于展示分类型数据的分布情况 B. 直方图用来展示数值型数据的分布情况 C. 条形图只能用于展示顺序型数据的分布情况 D. 条形图只能用于展示分类型数据的分布情况 题目来源于CDA模…

绝地求生【商城更新】WIA联名上架//专属商店下架

大家好,我是闲游盒. 本周商城将在4.24(周三)更新,商城内容更新如下: 上架物品 ▲W.I.A联名皮肤大礼包 小礼包如下: 包含3套衣服以及MINI、DBS的联名皮肤,3个头饰还挺有特色的,你喜欢…

链栈算法库构建

学习贺利坚老师, 链栈 , 构建链栈算法库 数据结构之自建算法库——链栈_领会链栈结构和掌握链栈中的各种基本算法-CSDN博客文章浏览阅读3.9k次,点赞3次,收藏8次。本文针对数据结构基础系列网络课程(3):栈和队列中第4课时栈的链式存储结构及其…

安全开发实战(3)--存活探测与端口扫描

目录 安全开发专栏 前言 存活探测 端口扫描 方式一: 1.3.1 One 1.3.2 Two 1.3.3 批量监测 方式二: 1.3.1 One 1.3.2 Two 1.3.3 Three 1.3.4 扫描ip地址,提取出开放端口和协议 ​编辑 1.3.5 批量扫描(最终完成版) 总结 安全开发专栏 安全开发实战​http://t.csd…

数据安全风险评估流程

数据安全风险评估是一个系统性的过程,旨在识别、评估和管理数据安全风险。以下是数据安全风险评估的一般流程及其内容: 确定评估范围:确定评估的范围和目标,包括评估的数据资产、系统、流程和相关方。 收集信息:收集有…

spring mvc \ spring boot \ spring cloud

spring mvc 主要是用作IOC 容器 框架还是传统三层架构 1.容器 依赖注入 CDI 传统web是由beanmanager管理bean的依赖和注入,beanfactory管理bean的创建,以消息进行驱动(HttpSessionListener等) 由框架自行管理 2.IOC 控制反转 bean的创建由开发人员…

leveldb中THREAD_ANNOTATION_ATTRIBUTE__宏的作用

THREAD_ANNOTATION_ATTRIBUTE__ 宏在 LevelDB 或类似的 C 项目中用于指定线程安全相关的源码注解(Source Code Annotation),这些注解有助于清晰地表达程序中函数、变量、类型等元素在多线程环境中的行为特征和并发保证。这样的注解不仅有助于…

【zabbix7】新版本尝鲜之connector

zabbix历史版本中,会使用python脚本,把zabbix的告警发送到kafka进行二次处理,或者使用filebeat把zabbix的Export的njson指标数据发送到kafka进行二次处理,然而在zabbix7中新增了新功能connector简化了操作并且可以根据tag进行区分…

【算法刷题day36】Leetcode:435. 无重叠区间、763.划分字母区间、56. 合并区间

文章目录 Leetcode 435. 无重叠区间解题思路代码总结 Leetcode 763.划分字母区间解题思路代码总结 Leetcode 56. 合并区间解题思路代码总结 草稿图网站 java的Deque Leetcode 435. 无重叠区间 题目:435. 无重叠区间 解析:代码随想录解析 解题思路 先按…

Centos Top 30常用命令及详解

在Linux的众多发行版中,CentOS以其稳定性和高效性备受青睐。掌握CentOS的操作对于系统管理员来说至关重要,而熟悉一系列核心命令更是提高工作效率的关键。从文件管理到系统监控,我们精心编制的Top 50常用CentOS命令列表是每位Linux用户的实战…

systemd 强大的初始化系统和服务管理器

在Linux下,systemd 是一个非常强大的初始化系统和服务管理器, 它可以用来管理各种系统服务和进程。如果想要使用 systemd 来监控一个进程, 并在它退出时自动重新启动它,可以为该进程创建一个 systemd 服务单元文件。 以下是如何为…

详解Al作画算法原理

ChatGPT AI作画算法,又称为AI图像生成算法,是一种人工智能技术,它可以根据给定的输入自动生成图像。这类算法近年来变得非常流行,尤其是随着深度学习技术的发展。这里我将聚焦于目前最先进的一类AI作画算法,即生成对抗…