Go语言入门心法(八): mysql驱动安装报错onnection failed
Go语言入门心法(十):Go语言操作MYSQL(CRUD)|事务处理
Golang操作数据文档: GORM 操作数据库指南
Go语言中接口认知升维:
解决人生问题的自我引导法则: 复盘思维|结构化思维|金字塔思维|体系化思维|系统化思维
面向对象编程(oop)三大特性: 封装,继承,多态
Go语言中,可以认为接口是一种自定义的抽象数据类型,既然是数据类型,那么久可以使用接口声明变量等操作;
它不会暴露出它所代表的内部属性的结构,它只会展示出它自己的方法,因此不能将接口类型实例化;
根据go语言规范,单个函数的接口命名为函数名加上"er"作为后缀;例如:Writer,Reader,Formatter等。
接口命令规范如下:
(1)当个函数名的接口名以"er"作为后缀,接口的实现则去掉“er”字符串
(2)go语言的接口是方法的集合,使用接口是实现模块化的重要方式;接口是用来定义行为类型的,这些被定义的行为不由接口直接实现
(3)与其他语言不同的是,Go语言的接口没有数据字段(接口成员变量),只有定义的抽象的方法,不需要实现方法,不需要方法体
定义接口与订阅结构体类似,定义需要使用type关键字和interface关键字
type InterfaceName interface {
Method()
}
- package main
-
- // Animal 定义接口
- type Animal interface {
- Named() string // 接口的方法,返回值类型为string
- Speak() string
- }
-
- type Cat struct {
- }
- type Dog struct {
- sleepTime string
- }
-
- // Named Cat实现接口Animal的Named()抽象方法
- func (cat *Cat) Named() string {
- return "Cat:named()-cat"
- }
-
- // Speak Cat实现接口Animal的Speak()抽象方法
- func (cat *Cat) Speak() string {
- return "Cat:speak()-cat"
- }
-
- // Named Dog实现了Animal接口的Named()抽象方法
- func (dog *Dog) Named() string {
- return "Dog:named()-dog"
- }
-
- // Speak Dog实现了Animal接口的Speak()抽象方法
- func (dog *Dog) Speak() string {
- return "Dog:speak()-dog"
- }
-
- // Sleeper 定义Dog结构体的方法
- func (dog *Dog) Sleeper(sleepTime string) {
- dog.sleepTime = sleepTime
- }
-
- func main() {
- println(`
- Go语言中接口认知升维:
- 解决人生问题的自我引导法则: 复盘思维|结构化思维|金字塔思维|体系化思维|系统化思维
- 面向对象编程(oop)三大特性: 封装,继承,多态
- Go语言中,可以认为接口是一种自定义的抽象数据类型,既然是数据类型,那么久可以使用接口声明变量等操作;
- 它不会暴露出它所代表的内部属性的结构,它只会展示出它自己的方法,因此不能将接口类型实例化;
- 根据go语言规范,单个函数的接口命名为函数名加上"er"作为后缀;例如:Writer,Reader,Formatter等。
- 接口命令规范如下:
- (1)当个函数名的接口名以"er"作为后缀,接口的实现则去掉“er”字符串
- (2)go语言的接口是方法的集合,使用接口是实现模块化的重要方式;接口是用来定义行为类型的,这些被定义的行为不由接口直接实现
- (3)与其他语言不同的是,Go语言的接口没有数据字段(接口成员变量),只有定义的抽象的方法,不需要实现方法,不需要方法体
- 定义接口与订阅结构体类似,定义需要使用type关键字和interface关键字
- type InterfaceName interface {
- Method()
- }
- `)
-
- println()
- println("=================================定义接口==========================")
- // 非指针实例化对象
- println("Cat类型就是Animal的一个实例")
- var cat = Cat{}
- println("Dog类型就是Animal的一个实例")
- var dog = Dog{}
- println("我的小猫咪: ", cat.Named())
- println("我的小猫咪: ", cat.Speak())
- println("我的小旺财: ", dog.Named())
- println("我的小旺财: ", dog.Speak())
- dog.Sleeper("10:50")
- println("我的小旺财休息时间: ", dog.sleepTime)
-
- }
运行效果:
GOROOT=D:\program_file_worker\go1.20 #gosetup
GOPATH=D:\program_file_worker\go1.20\bin;C:\Users\Administrator\go #gosetup
D:\program_file_worker\go1.20\bin\go.exe build -o C:\Users\Administrator\AppData\Local\Temp\GoLand\___go_build_OOPToInterfaceAnimalGrammar_go.exe D:\program_file\go_workspace\org.jd.data\interface\OOPToInterfaceAnimalGrammar.go #gosetup
C:\Users\Administrator\AppData\Local\Temp\GoLand\___go_build_OOPToInterfaceAnimalGrammar_go.exeGo语言中接口认知升维:
解决人生问题的自我引导法则: 复盘思维|结构化思维|金字塔思维|体系化思
维|系统化思维
面向对象编程(oop)三大特性: 封装,继承,多态
Go语言中,可以认为接口是一种自定义的抽象数据类型,既然是数据类型,那么久可
以使用接口声明变量等操作;
它不会暴露出它所代表的内部属性的结构,它只会展示出它自己的方法,因此不能将接口类型实例化;
根据go语言规范,单个函数的接口命名为函数名加上"er"作为后缀;例如:Writer,Reader,Formatter等。
接口命令规范如下:
(1)当个函数名的接口名以"er"作为后缀,接口的实现则去掉“er”字符串
(2)go语言的接口是方法的集合,使用接口是实现模块化的重要方式;接口是用来定义行为类型的,这些被定义的行为不由接口直接实现
(3)与其他语言不同的是,Go语言的接口没有数据字段(接口成员变量),只有定义的抽象的方法,不需要实现方法,不需要方法体
定义接口与订阅结构体类似,定义需要使用type关键字和interface关键字
type InterfaceName interface {
Method()
}
=================================定义接口==========================
Cat类型就是Animal的一个实例
Dog类型就是Animal的一个实例
我的小猫咪: Cat:named()-cat
我的小猫咪: Cat:speak()-cat
我的小旺财: Dog:named()-dog
我的小旺财: Dog:speak()-dog
我的小旺财休息时间: 10:50Process finished with the exit code 0
- package main
-
- import (
- "errors"
- "fmt"
- )
-
- // IDatabase 定义一个数据库操作的接口
- type IDatabase interface {
- Connect() error
- Disconnect() error
- }
-
- // Mysql 实例类型MySQL数据操作
- type Mysql struct {
- DBName string
- isConnect bool
- }
-
- // Redis Redis实例类型
- type Redis struct {
- DBName string
- }
-
- // Connect 实现IDatabase接口的Connect方法
- func (mysql *Mysql) Connect() error {
- fmt.Println("Mysql Connect DB => " + mysql.DBName)
-
- // do Connect
- mysql.isConnect = true
-
- if mysql.isConnect {
- fmt.Println("Mysql Connect Success !")
- return nil
- } else {
- return errors.New("Connect failure ")
- }
- }
-
- // Disconnect 实现IDatabase接口的Disconnect方法
- func (mysql *Mysql) Disconnect() error {
- // do Disconnect
- fmt.Println("Mysql Disconnect Success !")
- return nil
- }
-
- // Connect 实现IDatabase接口的Connect方法
- func (redis *Redis) Connect() error {
- fmt.Println("Redis Connect DB => " + redis.DBName)
-
- fmt.Println("Redis Connect Success !")
- return nil
- }
-
- // Disconnect 实现IDatabase接口的Disconnect方法
- func (redis *Redis) Disconnect() error {
- // do Disconnect
- fmt.Println("Redis Disconnect Success !")
- return nil
- }
- func main() {
- var mysql = Mysql{DBName: "student"}
- println("开始连接")
- mysql.Connect()
- // do something
- fmt.Println("断开连接")
- mysql.Disconnect()
-
- var redis = &Redis{DBName: "student"}
- println("开始连接")
- redis.Connect()
- // do something
- fmt.Println("断开连接")
- redis.Disconnect()
- }
运行效果:
GOROOT=D:\program_file_worker\go1.20 #gosetup
GOPATH=D:\program_file_worker\go1.20\bin;C:\Users\Administrator\go #gosetup
D:\program_file_worker\go1.20\bin\go.exe build -o C:\Users\Administrator\AppData\Local\Temp\GoLand\___go_build_OOPToInterfaceIDatabaseGrammar_go.exe D:\program_file\go_workspace\org.jd.data\interface\OOPToInterfaceIDatabaseGrammar.go #gosetup
C:\Users\Administrator\AppData\Local\Temp\GoLand\___go_build_OOPToInterfaceIDatabaseGrammar_go.exe
开始连接
Mysql Connect DB => student
Mysql Connect Success !
断开连接
Mysql Disconnect Success !
开始连接
Redis Connect DB => student
Redis Connect Success !
断开连接
Redis Disconnect Success !Process finished with the exit code 0
使用接口作为参数来接收该接口实现类型实例对象或者该接口的子接口;
go语言类型实例 相对于java语言的实现接口的类的角色:
(1)将对象实例赋值给接口
(2)将一个接口赋值为另外一个接口
(3)当一个对象的类型是一个接口的实例时,这个对象就可以赋值给这个接口。需要注意的是,只能将对象的指针赋值给接口变量,不能将对象的值赋值给接口变量;
否则会发送错误
- package main
-
- import "fmt"
-
- /*
- 使用接口作为参数来接收该接口实现类型实例对象或者该接口的子接口;
- go语言类型实例 相对于java语言的实现接口的类的角色:
- (1)将对象实例赋值给接口
- (2)将一个接口赋值为另外一个接口
- (3)当一个对象的类型是一个接口的实例时,这个对象就可以赋值给这个接口。需要注意的是,只能将对象的指针赋值给接口变量,不能将对象的值赋值给接口变量;
- 否则会发送错误
- */
-
- type IDatabaser interface {
- ConnectDB() error
- DisconnectDB() error
- }
-
- // RedisDB 申明一个redis结构体
- type RedisDB struct {
- DBName string
- }
-
- // ConnectDB RedisDB实现接口IDatabaser的ConnectDB()方法
- func (redis *RedisDB) ConnectDB() error {
- fmt.Println("Redis Connect DB => " + redis.DBName)
- // do Connect
- fmt.Println("Redis Connect Success !")
- return nil // 返回一个错误nil,表示无错误
- }
-
- // DisconnectDB RedisDB实现接口IDatabaser的DisconnectDB()方法
- func (redis *RedisDB) DisconnectDB() error {
- // do Disconnect
- fmt.Println("Redis Disconnect Success !")
- return nil
- }
-
- func main() {
- // 创建一个RedisDB实例化值对象,并初始化赋值
- var redis = RedisDB{
- DBName: "person:id_", //赋值分行写时,需要添加默认的逗号; 如果写一行,则逗号可以省略,当然也可以保留
- }
- // 声明一个接口类型的变量idb;接口类型变量,是指用接口作为变量的数据类型来声明的变量;并把接口类型实现的类型RedisDB实例化对象的指针赋值给该接口
-
- var idb IDatabaser = &redis
- // 然后使用该接口类型变量操作接口类型实例的相关方法,完成具体的业务逻辑
- idb.ConnectDB()
- idb.DisconnectDB()
- }
运行效果:
GOROOT=D:\program_file_worker\go1.20 #gosetup
GOPATH=D:\program_file_worker\go1.20\bin;C:\Users\Administrator\go #gosetup
D:\program_file_worker\go1.20\bin\go.exe build -o C:\Users\Administrator\AppData\Local\Temp\GoLand\___go_build_OOPToInterfaceeReceiverValue_go.exe D:\program_file\go_workspace\org.jd.data\interface\OOPToInterfaceeReceiverValue.go #gosetup
C:\Users\Administrator\AppData\Local\Temp\GoLand\___go_build_OOPToInterfaceeReceiverValue_go.exe
Redis Connect DB => person:id_
Redis Connect Success !
Redis Disconnect Success !Process finished with the exit code 0
- package main
-
- import "fmt"
-
- type LinkDatabaser interface {
- // Connected 连接方法
- Connected() error
- // Released 释放连接
- Released() error
- }
-
- // IRediser 定义一个子接口
- type IRediser interface {
- // Connected 连接方法
- Connected() error
- }
-
- // RedisInstance 定义一个结构体
- type RedisInstance struct {
- DBName string // 结构体
- }
-
- // Connected 实现接口的Connected()方法
- func (redis *RedisInstance) Connected() error {
- fmt.Println("Redis Connect DB => " + redis.DBName)
- // do Connect
- fmt.Println("Redis Connect Success !")
- return nil
- }
-
- // Released 实现接口的Released方法
- func (redis *RedisInstance) Released() error {
- // do Disconnect
- fmt.Println("Redis Disconnect Success !")
- return nil
- }
-
- func main() {
- println(`
- 通过一个接口给另外一个接口赋值,在go语言中只要两个接口拥有统同样的方法集(次序不同不要紧)
- 那么它们就是相同的,可以相互赋值。如果两个接口不是相同的,接口A的方法时接口B方法集的子集,那么接口B可以赋值给接口A,反正不成立
- `)
- println()
- println()
- var idb LinkDatabaser = &RedisInstance{
- DBName: "teacher"}
- var iRedis IRediser
- iRedis = idb
- err := iRedis.Connected()
- if err != nil {
- println("redis数据库连接异常........")
- return
- }
- }
运行效果:
GOROOT=D:\program_file_worker\go1.20 #gosetup
GOPATH=D:\program_file_worker\go1.20\bin;C:\Users\Administrator\go #gosetup
D:\program_file_worker\go1.20\bin\go.exe build -o C:\Users\Administrator\AppData\Local\Temp\GoLand\___go_build_OOPToInterfaceeReceiverSubInterfaceValue_go.exe D:\program_file\go_workspace\org.jd.data\interface\OOPToInterfaceeReceiverSubInterfaceValue.go #gosetup
C:\Users\Administrator\AppData\Local\Temp\GoLand\___go_build_OOPToInterfaceeReceiverSubInterfaceValue_go.exe通过一个接口给另外一个接口赋值,在go语言中只要两个接口拥有统同样的方法集(
次序不同不要紧)
那么它们就是相同的,可以相互赋值。如果两个接口不是相同的,接口A的方法时接口B方法集的子集,那么接口B可以赋值给接口A,反正不成立
Redis Connect DB => teacher
Redis Connect Success !Process finished with the exit code 0
go语言接口嵌套认知升维
接口嵌套也称接口组合,在其他语言如Java中,这种接口的组合叫继承;go语言中摒弃了纷繁的继承体系,go语言中这种继承体系是通过接口嵌套来体系
接口嵌套也就是如果一个接口interface1作为interface2的一个嵌入字段,那么interface2隐式包含了interface1里面的所有的方法;
接口嵌套分为:
(1)接口侵入式嵌套
(2)接口非侵入式嵌套
接口嵌套注意事项:
一个接口类型只能接受其他类型的接口嵌入,嵌入结构体或者其他类型都会报错;
一个接口类不能嵌入自身,这包括直接嵌入和间接嵌入
- package main
-
- import "fmt"
-
- /*
- go语言接口嵌套认知升维
- 接口嵌套也称接口组合,在其他语言如Java中,这种接口的组合叫继承;go语言中摒弃了纷繁的继承体系,go语言中这种继承体系是通过接口嵌套来体系
- 接口嵌套也就是如果一个接口interface1作为interface2的一个嵌入字段,那么interface2隐式包含了interface1里面的所有的方法;
- 接口嵌套分为:
- (1)接口侵入式嵌套
- (2)接口非侵入式嵌套
- 接口嵌套注意事项:
- 一个接口类型只能接受其他类型的接口嵌入,嵌入结构体或者其他类型都会报错;
- 一个接口类不能嵌入自身,这包括直接嵌入和间接嵌入
- */
-
- type IPerson interface {
- Speak()
- }
-
- type IStudent interface {
- IPerson // 嵌入IPerson接口
- Study() // 学习活动
- }
- type ITeacher interface {
- IPerson
- Teach() // 教学活动
- }
-
- type Student struct {
- Name string
- }
-
- // Speak Student实现Speak方法
- func (student *Student) Speak() {
- fmt.Println("My name is", student.Name)
- }
-
- // Study Student实现Study方法
- func (student *Student) Study() {
- fmt.Println(student.Name, " is studying")
- }
-
- type Teacher struct {
- Name string
- }
-
- // Speak Teacher实现Speak方法
- func (teacher *Teacher) Speak() {
- fmt.Println("My name is", teacher.Name)
- }
-
- // Teach Teacher实现Study方法
- func (teacher *Teacher) Teach() {
- fmt.Println(teacher.Name, " is teaching")
- }
-
- func main() {
-
- println(`
- 从上面的声明与定义,IStudent,ITeacher接口都嵌入了IPerson,因此可以把它们看成继承了IPerson的相关方法;都拥有IPerson中的所有方法
- 而结构体Teacher需要实现IPerson接口,同时要实现ITeacher接口才能拥有相关的方法及属性
- `)
- var student Student = Student{"老杨"}
- var teacher Teacher = Teacher{
- "马士兵"}
- student.Study()
- student.Speak()
-
- teacher.Speak()
- teacher.Teach()
- }
运行效果:
GOROOT=D:\program_file_worker\go1.20 #gosetup
GOPATH=D:\program_file_worker\go1.20\bin;C:\Users\Administrator\go #gosetup
D:\program_file_worker\go1.20\bin\go.exe build -o C:\Users\Administrator\AppData\Local\Temp\GoLand\___go_build_OOPToInterfaceNestInterface_go.exe D:\program_file\go_workspace\org.jd.data\interface\OOPToInterfaceNestInterface.go #gosetup
C:\Users\Administrator\AppData\Local\Temp\GoLand\___go_build_OOPToInterfaceNestInterface_go.exe
老杨 is studying
My name is 老杨
My name is 马士兵
马士兵 is teachingProcess finished with the exit code 0
将值报错到空接口:
空接口(interface{})是go语言中最特殊的接口,在Java语言中,所有的类都继承自一个基类Object;
而go语言中的interface{}接口就相当于这里的Object;
在go语言中,空接口不包括任何方法,也正因如此,所有的类都实现了空接口,因此空接口可以存储任意类型的数值;
- package main
-
- import "fmt"
-
- /*
- 将值报错到空接口:
- 空接口(interface{})是go语言中最特殊的接口,在Java语言中,所有的类都继承自一个基类Object;
- 而go语言中的interface{}接口就相当于这里的Object;
- 在go语言中,空接口不包括任何方法,也正因如此,所有的类都实现了空接口,因此空接口可以存储任意类型的数值;
- */
-
- func Logg(name string, i interface{}) {
- // println("i类型为空接口,可以接收任意类型的类型的变量")
- fmt.Printf("Name = %s ,Type = %T, value = %v\n", name, i, i)
-
- }
- func main() {
- // 使用空接口声明任意变量
- var v1 interface{} = 1
- var v2 interface{} = "老杨"
- var v3 interface{} = true
- var v4 interface{} = &v1
- var v5 interface{} = struct { // 匿名结构体
- Name string
- }{"老板"}
- var v6 interface{} = &v5
-
- Logg("v1", v1)
- Logg("v2", v2)
- Logg("v3", v3)
- Logg("v4", v4)
- Logg("v5", v5)
- Logg("v6", v6)
-
- }
运行效果:
GOROOT=D:\program_file_worker\go1.20 #gosetup
GOPATH=D:\program_file_worker\go1.20\bin;C:\Users\Administrator\go #gosetup
D:\program_file_worker\go1.20\bin\go.exe build -o C:\Users\Administrator\AppData\Local\Temp\GoLand\___go_build_OOPEmptyInterfaceToStoreValue_go.exe D:\program_file\go_workspace\org.jd.data\struct\OOPEmptyInterfaceToStoreValue.go #gosetup
C:\Users\Administrator\AppData\Local\Temp\GoLand\___go_build_OOPEmptyInterfaceToStoreValue_go.exe
Name = v1 ,Type = int, value = 1
Name = v2 ,Type = string, value = 老杨
Name = v3 ,Type = bool, value = true
Name = v4 ,Type = *interface {}, value = 0xc00008a030
Name = v5 ,Type = struct { Name string }, value = {老板}
Name = v6 ,Type = *interface {}, value = 0xc00008a040Process finished with the exit code 0
空接口中取值演示
- package main
-
- import "fmt"
-
- /*
- 既然空接口可以存储各种类型的值,那么怎么从空接口中取值呢?,接下来我们来演示取值
- */
- func main() {
- println("从空接口中获取对应类型的值:")
- var a string = "abc"
- // 字符串类型变量赋值给空接口类型的变量i
- var i interface{} = a
- // 空类型的变量i赋值给字符串类型b
- var b string = i.(string)
- fmt.Println(b)
- println("================下面来看下空接口常见使用=========================")
-
- println(`
- 来看下fmt模块的Println方法源代码:
- (1)func Println(a ...any) (n int, err error) {
- return Fprintln(os.Stdout, a...)
- }
- (2)// any is an alias for interface{} and is equivalent to interface{} in all ways.
- type any = interface{}
- 可以标准输出函数的参数类型是空接口: 打印函数支持传入任意个值,并且值的类型也是任意的
- `)
-
- println(`
- t,ok := X.(T)||空接口变量.(对应转换类型):
- 该语法称为接口的断言:
-
- `)
- println()
- println("========================下面来写空接口为参数函数一个实例Logger()======================")
- s := make([]interface{}, 3) // 构建一个可接收任意类型的数值,限制三个元素
- s[0] = 1
- s[1] = "abc"
- s[2] = struct {
- Num int
- }{1111}
- // 可变长度的参数
- fmt.Println("=====================将切分拆散===============")
- Logger(s...)
- println("=======================直接传入切片=============")
- Logger(s)
-
- }
- func Logger(args ...interface{}) {
- for num, arg := range args { // 遍历参数
- // 是用标准模块下的个数化输出打印函数
- fmt.Printf("Index => %d ,Value => %v\n", num, arg)
-
- }
- }
运行效果:
GOROOT=D:\program_file_worker\go1.20 #gosetup
GOPATH=D:\program_file_worker\go1.20\bin;C:\Users\Administrator\go #gosetup
D:\program_file_worker\go1.20\bin\go.exe build -o C:\Users\Administrator\AppData\Local\Temp\GoLand\___go_build_OOPEmptyInterfaceToValue_go.exe D:\program_file\go_workspace\org.jd.data\struct\OOPEmptyInterfaceToValue.go #gosetup
C:\Users\Administrator\AppData\Local\Temp\GoLand\___go_build_OOPEmptyInterfaceToValue_go.exe
从空接口中获取对应类型的值:
abc
================下面来看下空接口常见使用=========================来看下fmt模块的Println方法源代码:
(1)func Println(a ...any) (n int, err error) {
return Fprintln(os.Stdout, a...)
}
(2)// any is an alias for interface{} and is equivalent to interface{} in all ways.
type any = interface{}
可以标准输出函数的参数类型是空接口: 打印函数支持传入任意个值,并且值的类
型也是任意的t,ok := X.(T)||空接口变量.(对应转换类型):
该语法称为接口的断言:========================下面来写空接口为参数函数一个实例Logger()======================
=====================将切分拆散===============
Index => 0 ,Value => 1
Index => 1 ,Value => abc
Index => 2 ,Value => {1111}
=======================直接传入切片=============
Index => 0 ,Value => [1 abc {1111}]Process finished with the exit code 0
类型断言是使用在"接口变量"上的操作,这里的接口变量指的是接口类型声明的变量;
通俗来讲,就是接口类型的变量转换为普通类型的转换就是接口断言
类型断言的语法:
t,ok := X.(T)
x表示接口变量,T表示一个类型(当然也可以是接口类型),这语法的意思就是判断X是否是T类型,如果断言成功,
则ok为true,t的值为接口变量X的动态值;如果断言失败,则t的值为类型t的初始值,t的类型始终为T
- package main
-
- import (
- "fmt"
- )
-
- /*
- 类型断言是使用在"接口变量"上的操作,这里的接口变量指的是接口类型声明的变量;
- 通俗来讲,就是接口类型的变量转换为普通类型的转换就是接口断言
- 类型断言的语法:
- t,ok := X.(T)
- x表示接口变量,T表示一个类型(当然也可以是接口类型),这语法的意思就是判断X是否是T类型,如果断言成功,
- 则ok为true,t的值为接口变量X的动态值;如果断言失败,则t的值为类型t的初始值,t的类型始终为T
- */
- func main() {
- var X interface{} = 1
- fmt.Println("第一次断言")
- t0, ok := X.(string)
- checkType(t0, ok)
- fmt.Println("第二次断言")
- t1, ok := X.(float64)
- checkType(t1, ok)
- fmt.Println("第三次断言")
- t2, ok := X.(int)
- checkType(t2, ok)
- }
-
- func checkType(t interface{}, ok bool) {
- if ok {
- fmt.Println("断言成功!")
- } else {
- fmt.Println("断言失败!")
- }
- fmt.Printf("变量t的类型 = %T ,值 = %v \n", t, t)
- }
运行效果:
GOROOT=D:\program_file_worker\go1.20 #gosetup
GOPATH=D:\program_file_worker\go1.20\bin;C:\Users\Administrator\go #gosetup
D:\program_file_worker\go1.20\bin\go.exe build -o C:\Users\Administrator\AppData\Local\Temp\GoLand\___go_build_OOPEmptyInterfaceToAssertGrammar_go.exe D:\program_file\go_workspace\org.jd.data\struct\OOPEmptyInterfaceToAssertGrammar.go #gosetup
C:\Users\Administrator\AppData\Local\Temp\GoLand\___go_build_OOPEmptyInterfaceToAssertGrammar_go.exe
第一次断言
断言失败!
变量t的类型 = string ,值 =
第二次断言
断言失败!
变量t的类型 = float64 ,值 = 0
第三次断言
断言成功!
变量t的类型 = int ,值 = 1Process finished with the exit code 0
忙着去耍帅,后期补充完整。。。。。