Go类型断言demo

package main

import (
"bytes"
"encoding/json"
"fmt"
"io"
"net/http"
"time"
"github.com/unknwon/com"
) //空接口
func test1() {
a := make(map[string]interface{}, 20)
a["name"] = "haha"
a["age"] = 20
a["merried"] = true
a["hobby"] = []string{"喝", "跳", "rap"}
fmt.Printf("type:%T v:%#v\n", a["hobby"],a["hobby"])
v,ok := a["hobby"].([]string)
if(!ok){
fmt.Println("type is not map.") //type:[]string v:[]string{"喝", "跳", "rap"}
} fmt.Println(v[0]) //喝 } //接口作为函数的参数
func test2(a interface{}) {
fmt.Printf("type:%T value:%v \n", a, a)
} type resParamData struct {
Code int `json:"code"`
Msg string `json:"Msg"`
Data interface{} //方法一
}
type userinfo struct {
Name string `json:"name"`
Age int `json:"age"`
} func test3() {
var m = make(map[string]interface{}, 0)
m["name"] = "test"
m["age"] = 20
var res resParamData
res.Code = 200
res.Msg = "ok"
res.Data = m fmt.Println(res.Data)
value, ok := res.Data.(map[string]interface{})
if !ok {
fmt.Println("It's not ok for type Order")
return
}
fmt.Println("The value is ", value["name"])
fmt.Println("The value is ", value["age"])
fmt.Printf("type:%T value:%v\n", value["age"], value["age"]) }
func test4() {
var uinfo = userinfo{
Name: "lisi",
Age: 18,
}
var resdata resParamData
resdata.Code = 200
resdata.Msg ="ok"
resdata.Data = uinfo
fmt.Println(resdata.Data)
value, ok := resdata.Data.(userinfo)
if !ok {
fmt.Println("It's not ok for type Order")
return
}
fmt.Println("The value is ", value.Name)
fmt.Println("The value is ", value.Age)
fmt.Printf("type:%T value:%v\n", value.Name, value.Name)
fmt.Printf("type:%T value:%v\n", value.Age, value.Age) }
type PostresData2 struct {
Data interface{} //方法一
Errmsg string `json:"errmsg"`
Errno int `json:"errno"`
}
func test5() {
var d PostresData2
url := "https://api.ibanana.club/select/major/list_by_key?page=1&row=10&major_name=工程"
res := SetGet(url)
_ = json.Unmarshal([]byte(res), &d)
fmt.Println(1111111111)
fmt.Printf("type:%T value:%#v \n", d, d)
fmt.Printf("type:%T value:%#v \n", d.Errno, d.Errno)
fmt.Printf("type:%T value:%#v \n", d.Data, d.Data)
value,ok:=d.Data.([]interface {})
if !ok {
fmt.Println("It's not ok for type major")
return
}
for _,v:=range value{
m,ok:=v.(map[string]interface {})
if !ok {
fmt.Println("It's not ok for type m")
return
}
id:=com.StrTo(com.ToStr(m["id"])).MustInt64()
fmt.Printf("type:%T value:%v\n",id, id) //type:int64 value:20
fmt.Printf("type:%T value:%v\n", m["major_name"], m["major_name"]) //type:string value:交通工程
//改变期值
if(id==19){
m["id"]=100
m["major_name"]="edit value22"
}
}
fmt.Println("GetTest")
fmt.Println(d)
//httpext.SuccessExt(ctx, d)
} func main() {
//test5()
//test4()
//test3()
test1()
//a := 12
//test2(a)
//test2(nil)
//test2(false)
}
// Get ... 发送请求 ...
// url: 请求地址
// response: 请求返回的内容
func SetGet(url string) string { // 超时时间:5秒
client := &http.Client{Timeout: 5 * time.Second}
resp, err := client.Get(url)
if err != nil {
panic(err)
}
defer resp.Body.Close()
var buffer [512]byte
result := bytes.NewBuffer(nil)
for {
n, err := resp.Body.Read(buffer[0:])
result.Write(buffer[0:n])
if err != nil && err == io.EOF {
break
} else if err != nil {
panic(err)
}
} return result.String()
}

test5接口的反参

{
"code": 200,
"data": {
"Data": [
{
"id": 100,
"major_name": "edit value22"
},
{
"id": 20,
"major_name": "交通工程"
},
{
"id": 22,
"major_name": "交通管理工程"
},
{
"id": 23,
"major_name": "交通设备与控制工程"
},
{
"id": 46,
"major_name": "信息工程"
},
{
"id": 50,
"major_name": "假肢矫形工程"
},
{
"id": 53,
"major_name": "光电信息科学与工程"
},
{
"id": 63,
"major_name": "农业工程"
},
{
"id": 64,
"major_name": "农业建筑环境与能源工程"
},
{
"id": 66,
"major_name": "农业水利工程"
}
],
"errmsg": "ok",
"errno": 200
},
"msg": "ok"
}

Go类型断言demo的更多相关文章

  1. golang 类型断言的学习

    在php中有一个 serialize() 函数 可以把数组序列化成字符串进行存储和传输 如果想反序列化这种字符串,在php中只需要一个简单的unserialize() 函数就可以完成了.但是在gola ...

  2. golang学习笔记:Interface类型断言详情

    原文链接:https://www.2cto.com/kf/201712/703563.html 1. 用于判断变量类型 demo如下: switch t := var.(type){ case str ...

  3. GO语言总结(5)——类型转换和类型断言

    上一篇博客介绍了Go语言的数组和切片——GO语言总结(4)——映射(Map),本篇博客介绍Go语言的类型转换和类型断言 由于Go语言不允许隐式类型转换.而类型转换和类型断言的本质,就是把一个类型转换到 ...

  4. Go的类型断言解析

    经常地我们对一个接口值的动态类型是不确定的,如方法的形参为接口类型时,此时就需要检验它是否符合我们需要的类型.类型断言是一个使用在接口值上的操作.断言类型的语法:x.(T),这里x表示一个接口的类型, ...

  5. golang类型断言

    一.介绍 类型断言,由于接口是一般类型,不知道具体类型,如果要转成具体类型,就需要使用类型断言 例子: package main import "fmt" func main(){ ...

  6. [Go] golang类型断言

    类型断言有点像向下转型,接口类型转到具体的实现实例类型上类型断言是一个使用在接口值上的操作.语法上它看起来像x.(T)被称为断言类型,这里x表示一个接口的类型和T表示一个类型 package main ...

  7. Golang的类型断言

    类型断言即判断一个变量是不是某个类型的实例,这个经常用在判断接口的类型,基本的格式: y, ok := x.(type) 上面的语句用于判断变量x是不是type类型,有两种结果: x是type类型的变 ...

  8. go语言之进阶篇通过switch实现类型断言

    1.通过switch实现类型断言 示例: package main import "fmt" type Student struct { name string id int } ...

  9. go语言之进阶篇通过if实现类型断言

    1.通过if实现类型断言 示例: package main import "fmt" type Student struct { name string id int } func ...

  10. Go语言的类型转换和类型断言

    https://my.oschina.net/chai2010/blog/161418 https://studygolang.com/articles/9335  类型转换.类型断言和类型切换 ht ...

随机推荐

  1. P9966 [THUPC 2024 初赛] 机器人 题解

    细节大模拟. 题意 一堆机器人在一起,每个人有左右手和一些指令,依次执行并输出结果. 做法 首先这种指令的执行还算是比较简单的大模拟,一个个实现即可,在此给出我的定义. struct Robot{ i ...

  2. 8 CSS文本属性

    8 文本属性 font-style(字体样式风格) /* 属性值: normal:设置字体样式为正体.默认值. italic:设置字体样式为斜体.这是选择字体库中的斜体字. oblique:设置字体样 ...

  3. #根号分治,动态规划#洛谷 5616 [MtOI2019]恶魔之树

    题目传送门 分析 最小公倍数最终一定会被表示成若干个质数指数幂的情况(1的情况就直接乘上二的次幂) 然后每个数的加入相当于对每个质数的指数取最大值,但是如果将每个质数的次数都表示出来状态数很多, 考虑 ...

  4. C# 数据类型与类型转换:包含教程与示例

    C# 数据类型 C# 中的变量必须是指定的数据类型: int myNum = 5; // 整数(整数) double myDoubleNum = 5.99D; // 浮点数 char myLetter ...

  5. sql注入--基础注入判断方法(构造闭合)

    在我们拿到一个sql注入的题目之后,在确定了注入点之后,接下来要做的事情就是进行基础注入判断. 在开始前,我们需要理解一个SQL注入中最常用的词汇 -- 构造闭合 . 对于SQL处理语句后台的写法: ...

  6. 使用yum安装unixODBC时报错怎么办

    使用 yum 安装 unixODBC 时报错怎么办 背景介绍 在使用 yum 安装 unixODBC 时,上报如下错误: [root@mc0-0002 odbc_connection]# yum in ...

  7. 直播预告丨“Hello ArkUI:初识Slider组件(JS)”周三约起

    12月1日 19:00-20:30,Hello HarmonyOS系列课程的第三节Hello ArkUI:初识Slider组件(JS)线上直播,将手把手教你熟悉最新的ArkUI,使用JS语言编写一个包 ...

  8. win7自带屏幕录像工具

    win7自带屏幕录像工具 2012-03-28 09:23:05      我来说两句      收藏     我要投稿 相信win7自带的屏幕录像工具很多朋友都没用过甚至没有听说过,   但是这款实 ...

  9. redis 简单整理——持久化之AOF[二十]

    前言 简单介绍一下AOF. 正文 AOF(append only file)持久化:以独立日志的方式记录每次写命令, 重启时再重新执行AOF文件中的命令达到恢复数据的目的. AOF的主要作用 是解决了 ...

  10. 在RockyLinux 9.3环境中采用RPM模式部署Oracle 19C

    在RockyLinux 9.3环境中采用RPM模式部署Oracle 19C 用途 在开发数据库系统时,可以验证功能是否与Oracle的表现一致,验证正确性和兼容性 限制 虚拟机安装,CPU 2*4 内 ...