[go] Stringer 类型

Stringer是Golang的fmt包中的一个类型。

Stringer由任何具有String方法的值来实现。

实现Stringer的类型与字符串的打印方式相同。Stringer会返回一个字符串。

type Stringer

type Stringer interface {
	String() string
}

让我们看一个例子,我们有一个结构,我们试图使用fmt包中的Print来打印它,但没有实现Stringer。

例子1:

package main

import "fmt"

type Person struct {
	ID   int
	Name string
	Age  int
}

func main() {
	var p = Person{ID: 1, Name: "Tony", Age: 25}
	fmt.Println(p)
}

我们可以看到,它打印了该结构的每个字段的值。

{1 Tony 25}

例子2:

package main

import "fmt"

type Person struct {
	ID   int
	Name string
	Age  int
}

func main() {
	var p = Person{ID: 1, Name: "Tony", Age: 25}
	fmt.Println(p)
}

func (p Person) String() string {
	return fmt.Sprintf("Person Type\nID: %d\nName: %s\nAge: %d", p.ID, p.Name, p.Age)
}

在这个例子中,Person结构实现了Stringer。String()返回字符串。

Person Type
ID: 1
Name: Tony
Age: 25

在那个String()方法中,我们已经返回了一个自定义的字符串。所以每当我们试图使用fmt包打印Person类型时,它将检查该类型是否实现了Stringer。如果实现了,它将打印String()方法返回的字符串。

重要说明:

String()方法的接收器类型很重要。
我们知道,我们可以只用数值来调用指针接收方法,但是对于String()方法,我们不能这样做。
原因是,fmt包将使用String()方法来打印我们的类型(如果我们的类型实现了Stringer接口)。所以每当我们试图用fmt包的函数打印我们的类型时,它就会断定该类型是否实现了String()方法。通过这样做,很明显,用值调用的值接收器会通过,用地址值调用的指针接收器会通过,但用值调用的指针接收器会失败。
比如:

package main

import "fmt"

type Person struct {
	ID   int
	Name string
	Age  int
}

func main() {
	var p = Person{ID: 1, Name: "Tony", Age: 25}
	fmt.Println(p)
}

func (p *Person) String() string {
	return fmt.Sprintf("Person Type\nID: %d\nName: %s\nAge: %d", p.ID, p.Name, p.Age)
}
{1 Tony 25}

在输出中,我们可以清楚地看到,fmt包做了类型断言,所以只有实现了Stringer类型的类型才会使用我们的自定义字符串打印出来。

我们打印一下类型看看:

fmt.Printf("type of &l: %T\n", &p)
fmt.Printf("type of  l: %T\n", p)
type of &l: *main.Person
type of  l: main.Person

当我们使用fmt包中的打印函数进行打印时,Stringer非常有用,我们需要对我们的类型进行自定义表示。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ST-GCN 人体姿态估计模型 代码实战

构建一个ST-GCN(Spatio-Temporal Graph Convolutional Network)模型需要结合图卷积网络(GCN)的思想,以处理时空数据。以下是一个简单的例子,演示如何使用PyTorch构建ST-GCN模型: import torch …

Ubuntu重设root的密码

重设root的密码 未重设密码之前,Ubuntu 中默认的 root 密码是随机的,即每次开机都会有一个新的root 密码,所以此时的 root 用户密码并不确定; 重设root 密码,使用安装时创建的用户登录后sudo su切换至root用户&#…

0004.电脑开机提示按F1

常用的电脑主板不知道什么原因,莫名其妙的启动不了了。尝试了很多方法,没有奏效。没有办法我就只能把硬盘拆了下来,装到了另一台电脑上面。但是开机以后却提示F1,如下图: 根据上面的提示,应该是驱动有问题…

【江科大】STM32:外部中断(Extern Interrupt)

文章目录 EXTI(Extern Interrupt)外部中断EXIT的基本结构EXIT框图 旋转编码器简介代码展示:注意: EXTI(Extern Interrupt)外部中断 功能: EXTI可以监测指定GPIO口的电平信号,当其指…

正信晟锦:亲戚借了钱一直不还怎么办

在生活中,我们难免会遇到一些经济上的困难,这时候向亲戚借钱可能是一个不错的选择。然而,有些亲戚在借了钱之后却迟迟不还,这让借款人感到非常无奈。那么,面对这种情况,我们应该怎么办呢? 我们要明确自己的…

基于taro搭建小程序多项目框架,记重点了!!!

前言 为什么需要这样一个框架,以及这个框架带来的好处是什么? 从字面意思上理解:该框架可以用来同时管理多个小程序,并且可以抽离公用组件或业务逻辑供各个小程序使用。当你工作中面临这种同时维护多个小程序的业务场景时&#…

Pandas.DataFrame.abs() 绝对值 详解 含代码 含测试数据集 随Pandas版本持续更新

关于Pandas版本: 本文基于 pandas2.1.2 编写。 关于本文内容更新: 随着pandas的stable版本更迭,本文持续更新,不断完善补充。 Pandas稳定版更新及变动内容整合专题: Pandas稳定版更新及变动迭持续更新。 Pandas API参…

实战项目(一)内容管理系统

一、实现技术 前端技术:html、javascript(jquery、ajax、json)、css 后端技术:java、mysql、servlet 开发工具:eclipse、vscode 二、项目描述 首页仿写某大学网页,上面有各种栏目及栏目内容,管理员能登录进去对首…

[pip] pip 包管理及虚拟环境的使用

文章目录 📦Python & pip🚀pip 常用功能🔨 Flask 应用示例:常用功能🔨Flask 应用示例:用虚拟环境管理 Flask 的不同版本 🚀总结 📦Python & pip https://www.python.org/htt…

AtCoder Beginner Contest 221 H. Count Multiset(容斥 dp 拆分数 差分 数形结合)

题目 给定m,n(m<n<5e3)&#xff0c; 求大小为k的多重集合&#xff0c;满足元素和为n&#xff0c; 且每种数在集合中出现的次数都小于等于m的集合数有多少个 答案对998244353取模 思路来源 官方题解 「解题报告」[ABC221H] Count Multiset - K8He - 洛谷博客 Solu…

【RT-DETR有效改进】遥感旋转网络 | LSKNet动态的空间感受野网络(轻量又提点)

前言 大家好&#xff0c;我是Snu77&#xff0c;这里是RT-DETR有效涨点专栏。 本专栏的内容为根据ultralytics版本的RT-DETR进行改进&#xff0c;内容持续更新&#xff0c;每周更新文章数量3-10篇。 专栏以ResNet18、ResNet50为基础修改版本&#xff0c;同时修改内容也支持Re…

掌上单片机实验室 – 低分辨率编码器测速方式完善(24)

一、背景 本以为“掌上单片机实验室”这一主题已告一段落&#xff0c;可最近在测试一批新做的“轮式驱动单元”时&#xff0c;发现原来的测速算法存在问题。 起因是&#xff1a;由于轮式驱动单元的连线较长&#xff0c;PCB体积也小&#xff0c;导致脉冲信号有干扰&#xff0c;加…

Linux系统监控:保障稳定性与性能的关键

Linux操作系统作为广泛应用于服务器和嵌入式设备的开源操作系统&#xff0c;对于系统监控的需求尤为重要。通过对Linux系统进行有效的监控&#xff0c;管理员可以实时了解系统的运行状态、识别潜在问题并采取相应的措施。本文将介绍Linux系统监控的基本原理、常用工具和关键指标…

央视推荐的护眼台灯是哪款?学生专用台灯第一品牌

近视问题在我国十分严重&#xff0c;据相关调查数据显示&#xff0c;我国有7亿近视人口。特别是在现代&#xff0c;青少年成为近视高发人群&#xff0c;其中大部分近视的原因与长时间不正确用眼导致的眼睛疲劳有关。台灯作为许多家庭中的小家电&#xff0c;不论是上班族还是孩子…

一文搞懂Microsoft Copilot品种及定价说明

Microsoft Copilot 是一个 AI 助手&#xff0c;提供跨 Microsoft Cloud 的创新解决方案。Copilot 使复杂的任务更易于管理&#xff0c;从而促进协作环境并增强用户体验。 目前Copilot一共有这么几种&#xff1a; 一、必应中的copilot 在edge浏览器侧边栏中使用&#xff0c;这…

ESP32-TCP服务端(Arduino)

将ESP32设置为TCP服务器 介绍 TCP&#xff08;Transmission Control Protocol&#xff09;传输控制协议&#xff0c;是一种面向连接的&#xff08;一个客户端对应一个服务端&#xff09;、可靠的传输层协议。在TCP的工作原理中&#xff0c;它会将消息或文件分解为更小的片段&a…

通俗易懂理解小波池化/WaveCNet

重要说明&#xff1a;本文从网上资料整理而来&#xff0c;仅记录博主学习相关知识点的过程&#xff0c;侵删。 一、参考资料 github代码&#xff1a;WaveCNet 通俗易懂理解小波变换(Wavelet Transform) 二、相关介绍 关于小波变换的详细介绍&#xff0c;请参考另一篇博客&…

大模型学习之书生·浦语大模型6——基于OpenCompass大模型评测

基于OpenCompass大模型评测 关于评测的三个问题Why/What/How Why What 有许多任务评测&#xff0c;包括垂直领域 How 包含客观评测和主观评测&#xff0c;其中主观评测分人工和模型来评估。 提示词工程 主流评测框架 OpenCompass 能力框架 模型层能力层方法层工具层 支持丰富…

使用Go发送HTTP GET请求

在Go语言中&#xff0c;我们可以使用net/http包来发送HTTP GET请求。以下是一个简单的示例&#xff0c;展示了如何使用Go发送HTTP GET请求并获取响应。 go复制代码 package main import ( "fmt" "io/ioutil" "net/http" …

用BK7251播放音乐

单片机的第一道难关无疑是烧录&#xff0c;如果烧录解决了&#xff0c;那么就有资格挑战各种坑了。 BK7251播放MP3 一、折腾材料 1、软件SDK&#xff1a; bk7251_audio_release_20190826_0701&#xff08;BK7251 rtt sdk&#xff09;&#xff0c;可以从github&#xff0c;gite…