首页 > 其他分享 >Go语言进阶-03

Go语言进阶-03

时间:2022-12-07 21:23:22浏览次数:38  
标签:03 进阶 fmt value reflect Println Go s1 string

反射

静态类型

静态类型就是变量声明赋予的类型,比如:

type MyInt int
type A struct{
  Name string
}
var i *int

动态类型

动态类型:运行时给这个变量赋值时,这个值的类型(如果为nil的时候没有动态类型)。运行时,动态类型可能改变。例:

var A interface{}
A = 10 //动态int
A = "String" //动态String
var M *int
A = M //A的值可以改变

reflect对象

type Student struct {
	Name   string
	Age    int
	School string
}

func (s Student) Say(msg string) {
	fmt.Println("hello,", msg)
}
func (s Student) Say2(msg string) string {
	return "say:" + msg
}
func (s Student) PrintInfo() {
	fmt.Println(s)
}
func main() {
	s1 := Student{"WZ", 19, "高中"}
	fmt.Printf("%T\n", s1)
	p1 := &s1
	fmt.Printf("%T\n", p1)
	fmt.Println(s1.Name)
	fmt.Println((*p1).Name, p1.Name)

	//value := reflect.ValueOf(&s1)
	value := reflect.ValueOf(s1)
	if value.Kind() == reflect.Ptr {
		newValue := value.Elem()
		fmt.Println(newValue.CanSet())
		f1 := newValue.FieldByName("Name")
		f1.SetString("zzy")
		fmt.Println(s1)
	}

	//
	methodValue1 := value.MethodByName("PrintInfo")
	fmt.Printf("kind:%s,type:%s\n", methodValue1.Kind(), methodValue1.Type())

	methodValue1.Call(nil)
	arg1 := make([]reflect.Value, 0)
	methodValue1.Call(arg1)
	methodValue2 := value.MethodByName("Say")
	arg2 := make([]reflect.Value, 1)
	arg2[0] = reflect.ValueOf("msg")
	methodValue2.Call(arg2)

	methodValue3 := value.MethodByName("Say2")
	arg3 := make([]reflect.Value, 1)
	arg3[0] = reflect.ValueOf("msg")
	callVal := methodValue3.Call(arg3)
	fmt.Printf("%T\n", callVal)
	str := callVal[0].Interface().(string)
	fmt.Println(str)
}

标签:03,进阶,fmt,value,reflect,Println,Go,s1,string
From: https://www.cnblogs.com/huacha/p/16945022.html

相关文章

  • shell编程时出现:未预期的符号 `then' 附近有语法错误 或者 : 行 : `then'
    #!/bin/bashcd/var/logsum=0foriin`ls-r*`do       if[-f$i];then       letsum++       echo"文件名:$i"......
  • 树莓派2b构建golang环境
    前言开始之前,我们先说点题外话。已经好久没有更新过技术内容了(认真脸)。一个原因是很长时间以来,一直感觉不在状态,迷茫、困惑,浑浑噩噩的,也没有分享的动力,虽然偶尔会记录一些......
  • atguigu3 三级菜单/目录_分布式缓存/分布式锁(product/category)
    0.问题:使用分布式锁解决读模式缓存失效(缓存击穿)和写模式缓存一致性问题!!!公共代码:CategoryBrandRelationService.javapackagecom.atguigu.gulimall.product.service;import......
  • MongoDB数据库的基础特性
    MongoDB是全球领先的NoSQL数据库,是一个可扩展、开源、表结构自由,用C++语言编写且面向文档的高性能分布式数据库。 MongoDB在持续演进中,不断优化自己的特色功能,保证了数据......
  • 隧道代理怎么用啊?隧道代理GO语言代码示例
    经常做数据采集的人对隧道代理肯定不陌生,但对于新手小白而言,有可能还是属于未涉及的领域,今天就来看看隧道代理(动态请求)利用GO语言要如何写代码。普通模式packagemainimport......
  • vue data中的字符串用'和`包含有什么区别?模板字符串
    vuedata中的字符串用'和`包含有什么区别?字段代码我验证过可以正常的执行,但是我不清楚这个``(ESC下面的那个键)在这里和单引号有什么区别,请教大佬们作者:李李链接:https......
  • 037-建立Web服务器
    建立服务端账号数据库列表1.运行SSMS,在数据库中新建数据库,取名DBAccount2.在DBAccount中新建表,选择相应路径,设计ID为主键,ID的标识规范设置为是,设计完表后保存命名为Ac......
  • springboot_03
    1.yam文件书写格式 1.1字面值的表示方式 1.2数组的表示方法 2.yml文件的读取   代码实际随便写个测试@RestController@RequestMapping("/books")publ......
  • golang编译为dll与调用dll简单样例
    ==前置准备==1、golang版本:1.182、安装MinGW(我的环境本身已经安装好了,没有验证不安装是否可以生成) ==编译为DLL==【代码样例】packagemainimport"C"//export......
  • cygwin Could not create directory '/home/Administrator/.ssh'
    ssh-keygen-C"[email protected]"-trsa 时,出现如下错误:cygwinCouldnotcreatedirectory'/home/Administrator/.ssh'  解决方案:Inadditiontoanswerbydiannal,......