Go fmt包

fmt包提供了格式化输入、输出的功能。 格式化输出 函数名 说明 Print 以默认格式进行格式化,格式化结果输出到os.Stdout Printf 以指定格式进行格式化,格式化结果输出到os.Stdout Println 以默认格式进行格式化,并在末尾添加换行符,格式化结果输出到os.Stdout Fprint 以默认格式进行格式化,格式化结果输出到指定的io.Writer接口 Fprintf 以指定格式进行格式化,格式化结果输出到指定的io.Writer接口 Fprintln 以默认格式进行格式化,并在末尾添加换行符,格式化结果输出到指定的io.Writer接口 Sprint 以默认格式进行格式化,格式化结果以字符串形式返回 Sprintf 以指定格式进行格式化,格式化结果以字符串形式返回 Sprintln 以默认格式进行格式化,并在末尾添加换行符,格式化结果以字符串形式返回 具体格式化规则详见Go 格式化。 格式化输入 函数名 说明 Scan 按默认格式从os.Stdin进行扫描,空格用于分隔数据,换行符按空格处理,扫描结果存入对应的变量 Scanf 按指定格式从os.Stdin进行扫描,扫描结果存入对应的变量 Scanln 按默认格式从os.Stdin进行扫描,空格用于分隔数据,遇换行符时停止扫描,扫描结果存入对应的变量 Fscan 按默认格式从指定的io.Reader接口进行扫描,空格用于分隔数据,换行符按空格处理,扫描结果存入对应的变量 Fscanf 按指定格式从指定的io.Reader接口进行扫描,扫描结果存入对应的变量 Fscanln 按默认格式从指定的io.Reader接口进行扫描,空格用于分隔数据,遇换行符时停止扫描,扫描结果存入对应的变量 Sscan 按默认格式从指定的字符串中进行扫描,空格用于分隔数据,换行符按空格处理,扫描结果存入对应的变量 Sscanf 按指定格式从指定的字符串中进行扫描,扫描结果存入对应的变量 Sscanln 按默认格式从指定的字符串中进行扫描,空格用于分隔数据,遇换行符时停止扫描,扫描结果存入对应的变量 注意:变量前必须要带上&才能成功接收扫描到的数据! 其它 函数名 说明 Append 以默认格式进行格式化,格式化结果追加到指定的字节切片,并返回新的字节切片 Appendf 以指定格式进行格式化,格式化结果追加到指定的字节切片,并返回新的字节切片 Appendln 以默认格式进行格式化,并在末尾添加换行符,格式化结果追加到指定的字节切片,并返回新的字节切片 Errorf 以指定格式进行格式化,格式化结果转为error接口并返回

2024-10-16 20:51:40 · 1 分钟 · 慢步道人

Go 格式化

格式化动词 常规 格式化动词 含义 %v 默认格式 %T 数据的类型 %% %本身 使用%v时不同类型默认对应的格式化动词如下: 数据类型 格式化动词 说明 bool %t int int8 等 %d uint uint8 等 %d %#v时对应%#x float32 complex64 等 %g string %s chan %p pointer %p 布尔型 格式化动词 含义 示例 结果 %t true或false 1>2 false 整型 格式化动词 含义 示例 结果 %b 二进制 90 1011010 %c 对应的 Unicode 字符 90 Z %d 十进制 90 90 %o 八进制 90 132 %O 带0o前缀的八进制 90 0o132 %q 用单引号包括的对应的 Unicode 字符,并且特殊字符会进行转义 90 ‘Z’ %x 小写的十六进制 90 5a %X 大写的十六进制 90 5A %U Unicode 格式:U+1234;与U+%04X相同 90 U+005A 浮点型和复数型 格式化动词 含义 示例 结果 %b 十进制无小数的科学计数法表示浮点数,指数部分是2的幂次方 3....

2024-10-15 21:34:07 · 2 分钟 · 慢步道人

Go的时间格式化

从其它平台迁移而来 就个人而言,对Go的整体评价还是相当不错的,直到遇到了时间格式化。有人说,这是大佬们的浪漫。 直接说对应关系吧: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 //年 2006 <=> yyyy 06 <=> yy //月 01 <=> MM 1 <=> M //日 02 <=> dd 2 <=> d //时 15 <=> hh 3 <=> h //分 04 <=> mm 4 <=> m //秒 05 <=> ss 5 <=> s go 1.20+在time包中又增加了time.DateTime、time.DateOnly、time.TimeOnly三个常量,分别对应2006-01-02 15:04:05、2006-01-02、15:04:05,再也不用专门去记对应关系了。

2022-07-27 21:33:56 · 1 分钟 · 慢步道人

使用gomod

从其它平台迁移而来 初学Go时,用的都是GOPATH模式,要么代码得写在一个固定的路径下,要么得改系统变量,从始至终只有一个项目也就忍了,可明显这是不可能的,多个项目,想想就要抓狂。 还好有GO MOD模式,虽然也看网上的帖子了,不过一直没尝试。终于,还是要亲自尝试下才有长进。 准备 golang v1.11+ 据说要使用GO MOD模式,必须要使用v1.11以上的版本(这里是直接用最新的v1.15.3)。 IDE 好用的果然还是JB家的Goland,不过吾等P民囊中羞涩,还是果断VS Code+插件。 代理 由于众所周知的原因,我们需要准备好代理,代理的使用略。 GO MOD 打开命令行 在GOPATH之外任意新建一个空测试目录,并cd进去 执行命令go mod init XXX(XXX为项目名),会生成一个go.mod文件,内容如下: 1 2 3 module gmtest go 1.15 以使用GoFrame为例, 修改go.mod加上gf 1 2 3 4 5 module gmtest go 1.15 require github.com/gogf/go latest latest表示使用最新版本。 编写Go代码 1 2 3 4 5 6 7 8 9 10 11 package main import ( "fmt" "github.com/gogf/gf" ) func main() { fmt.Println("Hello GF", gf.VERSION) } 执行go run main....

2020-10-26 23:08:47 · 1 分钟 · 慢步道人

从Delphi到Go——接口

从其它平台迁移而来 由于没有太多编写接口的经验,此处仅简单说明语法。后期对接口有更多认知和经验后再进行详细记录。 Delphi Delphi的接口是侵入式接口,并且是单继承的,但类可以同时实现多个接口,类声明时需要显示声明实现了哪些接口。 声明 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 type //直接声明 IMyInterface1 = interface function Func1: Integer; //函数 procedure Proc1(Value: Integer); //过程 property MI: Integer read Func1 write Proc1; //属性 end; //从已有接口继承 IMyInterface2 = interface(IMyInterface1) procedure Proc2; end; //含有 GUID 的接口可以公开给其它进程调用 IMyInterface3 = interface ['{3E51374A-D0E8-4C84-AA30-9634409E45DD}'] procedure Proc3; end; Delphi已经提供了基接口IInterface,自己声明的接口最好从IInterface继承。 实现 1 2 3 4 5 6 7 8 9 10 11 type //含接口的类的声明 TMyClass = class(基类, 接口) public procedure Proc; //接口方法 end; //接口实现 procedure TMyClass....

2020-01-30 12:52:16 · 1 分钟 · 慢步道人

简单数学运算的比较

从其它平台迁移而来 人到中年,总是不免生出些危机感,长年使用Delphi,心中自是不踏实,闲来便看两眼java,不想却发现个从未注意过的小问题。 java 1 2 3 4 5 double a = 1 / 10; //0.0 double b = 1.0 / 10; //0.1 double c = 1 / 10.0; //0.1 double d = 1 - 9.0 / 10; //0.09999999999999998 double e = 1 - 9 / 10; //1.0 Delphi 1 2 3 4 5 a := 1 / 10; //0.1 b := 1.0 / 10; //0.1 c := 1 / 10....

2020-01-01 22:37:24 · 2 分钟 · 慢步道人

从Delphi到Go——方法

从其它平台迁移而来 结构体的方法 Delphi Delphi结构体的方法与类的方法几乎是一致的,主要区别是内存的管理方式和可见性不同。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 //定义 type TMyStruct = record No: Integer; Name: string; function ToString: string; end; //实现 function TMyStruct.ToString: string; begin Result := Format('No:%d, Name:%s', [Self.No, Self.Name]); end; //调用 var ms: TMyStruct; s: string; begin s := ms.ToString; end; Go 方法其实就是加了接收器的函数,语法如下: 1 2 3 func (接收器变量 接收器类型) 方法名(参数列表) (返回参数) { 函数体 } Go结构体的方法无需声明,直接实现即可。...

2019-12-02 22:56:02 · 2 分钟 · 慢步道人

从Delphi到Go——异常处理

从其它平台迁移而来 Delphi try…finally…end 1 2 3 4 5 6 //创建、打开、加锁等 try //具体处理 finally //释放、关闭、解锁等 end; raise 1 raise Exception.Create('异常信息'); //手动抛出异常 try…except…end 1 2 3 4 5 6 7 8 9 try //可能产生异常的语句块 except //异常的相关处理 on E: Exception do begin //对应类型的异常的处理 end; end; Go defer 加defer的语句会延迟到函数调用结束返回时才执行,相当于finally...end区。存在多个defer语句时,最先出现的总是最后才执行。 1 2 3 4 5 func F(){ //打开、加锁等 defer //关闭、解锁等 //具体处理 } panic 1 panic(异常信息) recover 1 2 3 4 5 6 7 func FF(){ defer func(){ e := recover() //异常处理 }() //可能产生异常的语句块,或调用 panic() 抛出异常 } 虽然panic/recover组合可以模拟try....

2019-12-01 22:35:02 · 1 分钟 · 慢步道人

从Delphi到Go——函数的可变参数

从其它平台迁移而来 Delphi 事实上,Delphi并没有什么可以直接为函数传递可变参数(数量可变、类型可变)的语法,但是并不是说不可能实现,最常用的Format()函数就是最好的例子。 虽然不能直接传递可变参数,但是通过一种叫做可变类型的开放数组即可实现为函数传递数量不定、类型不一的可变参数。 可变类型 可变类型不是变体类型,而是一个记录类型TVarRec,在System单元中的定义如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 TVarRec = record { do not pack this record; it is compiler-generated } case Integer of 0: (case Byte of vtInteger: (VInteger: Integer); vtBoolean: (VBoolean: Boolean); vtChar: (VChar: _AnsiChr); vtExtended: (VExtended: PExtended); {$IFNDEF NEXTGEN} vtString: (VString: _PShortStr); {$ENDIF !...

2019-11-27 22:24:05 · 1 分钟 · 慢步道人

从Delphi到Go——匿名函数

从其它平台迁移而来 早期的Delphi版本是没有匿名函数的,不过可以定义一个函数类型来实现类似的功能;后期的版本已经支持匿名函数,随用随写。Go天生就支持匿名函数。 Delphi 函数类型 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 //声明函数类型 type TMyProc = procedure(A: Integer); //过程 TMyFunc = function(x: Integer): Integer; //函数 //定义符合函数类型的函数 procedure MyProc(A: Integer); begin ShowMessage(IntToHex(A)); end; function MyFunc1(x: Integer): Integer; begin Result := x + x; end; function MyFunc2(x: Integer): Integer; begin Result := x * x; end; //使用 var mp: TMyProc; mf: TMyFunc; begin mp := MyProc; mf := MyFunc1; mp(mf(99)); end; //作为参数进行传递,这才是函数类型最主要的使用方法 procedure Test(x: Integer; Func: TMyFunc); begin ShowMessage(Func(x)....

2019-11-03 12:14:24 · 1 分钟 · 慢步道人