当前位置: 首页 > news >正文

一个优秀的网站织梦能做视频网站吗

一个优秀的网站,织梦能做视频网站吗,wordpress中文字设置,wordpress主题 windows live目录 4. struct 结构体4.1 初始化4.2 内嵌字段4.3 可见性4.4 方法与函数4.4.1 区别4.4.2 闭包 4.5 Tag 字段标签4.5.1定义4.5.2 Tag规范4.5.3 Tag意义 4. struct 结构体 go的结构体类似于其他语言中的class#xff0c;主要区别就是go的结构体没有继承这一概念#xff0c;但可… 目录 4. struct 结构体4.1 初始化4.2 内嵌字段4.3 可见性4.4 方法与函数4.4.1 区别4.4.2 闭包 4.5 Tag 字段标签4.5.1定义4.5.2 Tag规范4.5.3 Tag意义 4. struct 结构体 go的结构体类似于其他语言中的class主要区别就是go的结构体没有继承这一概念但可以使用类型嵌入来实现相似功能。 4.1 初始化 使用type关键字来定义一个新的类型struct将新类型限定为结构体类型。 结构体中的字段可以为任何类型但是包含一些特殊类型 如接口管道函数指针的时候要格外注意 //type定义一个新类型 type newInt int//type定义一个简单的结构体 type base struct{value int }//type定义一个复杂的结构体 type student struct {Name stringage intc interface{}d func() inte func()base //将base类型嵌入到了student类型中 }4.2 内嵌字段 内嵌字段大体上有两种方式:显式指定(m1)和隐式指定(m2) 显式指定就相当于把目标结构体当作字段调用时需要先调用这个字段在调用目标结构体中的信息隐式指定相当于把目标结构体中的所有字段都在新结构体中创建了一次并且指向嵌入结构体内部。同时创建同名嵌入结构体对象[指与base同名]显式创建同名结构体字段 ≠ 隐式指定 type base struct {Value int } //显式指定 type m1 struct {b base }//隐式指定 type m2 struct {base }//显式指定同名字段 type m3 struct {base base }对上述结构体进行调用: 只有隐式指定直接操作被嵌入结构体内的数据隐式指定后直接操作嵌入结构体中的数据和通同名结构体操作作用一样 func main() {a1 : m1{}a2 : m2{}a3 : m3{}//显式指定只能通过嵌入结构体进行操作// a1.Value 1 //a1.Value undefined (type m2 has no field or method Value)a1.b.Value 2//隐式指定两种操作数据方法操作的是同一个变量a2.Value 2a2.base.Value 3fmt.Println(a2.Value) //3//显式指定同名变量 ≠ 隐式指定 // a3.Value 3 //a3.Value undefined (type m3 has no field or method Value)a3.base.Value 4 }当内嵌字段中的字段与结构体中得字段同名时 直接调用时是指定当前结构体中显式定义的字段但嵌入结构体中的字段仍可通过嵌入类型进行调用方法同理 //数据 func main() {a1 : m1{}a1.Value hello worlda1.base.Value 1fmt.Println(a1)//获取a1中的所有字段类型t : reflect.TypeOf(a1)for i : 0; i t.NumField(); i {field : t.Field(i)fieldType : field.Typefmt.Printf(Field: %s, Type: %s\n, field.Name, fieldType.Name())} }type base struct {Value int }type m1 struct {Value stringbase } /* {hello world {1}} Field: Value, Type: string Field: base, Type: base*///方法 func main() {a1 : m1{}a1.test()a1.base.test()fmt.Println(a1)//获取a1中的所有字段类型t : reflect.TypeOf(a1)for i : 0; i t.NumField(); i {field : t.Field(i)fieldType : field.Typefmt.Printf(Field: %s, Type: %s\n, field.Name, fieldType.Name())} }type base struct {Value int }func (b *base) test() {b.Value 1 } func (m *m1) test() {m.Value hello world }type m1 struct {Value stringbase } /* {hello world {1}} Field: Value, Type: string Field: base, Type: base*/4.3 可见性 首字母大写表示该字段/方法/结构体为可导出的反之为不可导出的在同一个包内不区分是否可导出都可访问包外只能访问可导出的字段/方法/结构体不可导出的字段不可以进行序列化转化为json可通过可导出的方法去操作不可导出的字段 // test/test1.go package testtype User struct {Name stringage int }func (u *User) Test() {u.Name hellou.age 18 }func (u *User) test() {u.Name worldu.age 81 }type student struct {Name stringage int }//main.go package mainimport (fmttest/test )func main() {a : test.User{}//b : test.student{} // 不能在包外访问未导出结构体a.Name 123//a.age 123 // 不能在包外访问未导出字段a.Test()//a.test() // 不能在包外访问未导出方法fmt.Println(a)/*{hello 18}*/ }4.4 方法与函数 4.4.1 区别 方法定义是必须有一个接收器(receiver)函数不需要大部分情况下方法的调用需要有一个对象函数不需要由于go中的所有传递都是值传递也就是将数据复制一份再调用所以如果想要修改原本对象的值就要传递指针进行引用传递 func 函数名 (参数) 返回值类型 {函数体} //函数定义 func (接收器) 方法名 (参数) 返回值类型 {函数体} // 方法定义func main() {a : User{}a.setName() // 方法调用fmt.Println(a)setName(a) // 函数调用fmt.Println(a) } /*{world 0}{hello 0}*/type User struct {Name stringage int } //函数 func setName(u *User) {u.Name hello } //方法 func (u *User) setName() {u.Name world }值传递时可以通过返回值的方式修改目标对象 func main() {a : User{}a a.setName() //需要显式给原变量赋值fmt.Println(a)a setName(a) //需要显式给原变量赋值fmt.Println(a) }type User struct {Name stringage int }func setName(u User) User {u.Name helloreturn u } func (u User) setName() User {u.Name worldreturn u }4.4.2 闭包 说到函数和方法就必须说一下闭包 什么是闭包 简单来说就是函数内部引用函数外部变量导致变量生命周期发生变化。这样的函数就叫做闭包 常见于函数返回值为另一个函数时 package mainimport fmtfunc main() {b : test()fmt.Println(b())fmt.Println(b()) }func test() func() int {a : 1return func() int {areturn a} }上面的函数导致变量a无法正常释放导致变量逃逸 go build -gcflags-m main.go # command-line-arguments ./main.go:11:6: can inline test ./main.go:13:9: can inline test.func1 ./main.go:6:11: inlining call to test ./main.go:13:9: can inline main.test.func1 ./main.go:7:15: inlining call to main.test.func1 ./main.go:7:13: inlining call to fmt.Println ./main.go:8:15: inlining call to main.test.func1 ./main.go:8:13: inlining call to fmt.Println ./main.go:6:11: func literal does not escape ./main.go:7:13: ... argument does not escape ./main.go:7:15: ~R0 escapes to heap ./main.go:8:13: ... argument does not escape ./main.go:8:15: ~R0 escapes to heap ./main.go:12:2: moved to heap: a ./main.go:13:9: func literal escapes to heap4.5 Tag 字段标签 4.5.1定义 在reflect包中提供了获取字段名称、类型、Tag的方法上文展示过获取名称和类型 结构体StructField表示结构体的一个字段(reflect/type.go) // A StructField describes a single field in a struct. type StructField struct {// Name is the field name.Name string// PkgPath is the package path that qualifies a lower case (unexported)// field name. It is empty for upper case (exported) field names.// See https://golang.org/ref/spec#Uniqueness_of_identifiersPkgPath stringType Type // field typeTag StructTag // field tag stringOffset uintptr // offset within struct, in bytesIndex []int // index sequence for Type.FieldByIndexAnonymous bool // is an embedded field }type StructTag string 4.5.2 Tag规范 StructTag本质上就是字符串理论上任何形式都符合规范。但通常情况下约定Tag的格式应该是key:“value” key:非空字符串不能包含控制字符空格引号冒号value双引号包围的字符串冒号前后不能有空格多个value用逗号隔开key之间用空格隔开key一般表示用途value表示控制指令 4.5.3 Tag意义 Go语言反射机制可以给结构体成员赋值用Tag可以决定赋值的动作可以使用定义好的Tag规则参考规则就可以继续不同的操作 //仅对Tag值为true的字段赋值Tag决定赋值动作 type Person struct {Name string assign:trueAge int assign:false }func assignValues(v interface{}) {val : reflect.ValueOf(v).Elem() // 获取指针指向的值typ : val.Type()for i : 0; i val.NumField(); i {field : val.Field(i)tag : typ.Field(i).Tag.Get(assign) // 获取字段的tagif tag true {// 根据字段类型赋值switch field.Kind() {case reflect.String:field.SetString(Default Name)case reflect.Int:field.SetInt(25)}}} }func main() {p : Person{}assignValues(p)fmt.Printf(Person: %v\n, p) } /* Person: {Name:Default Name Age:0}*/下方例子使用了json:“kind,omitempty”这个tag规定了字段为空不进行序列化 import (encoding/jsonfmt )type Person struct {Name string json:kind,omitempty //为空时不进行序列化Value intage int }func main() {// 创建一个 Person 实例p : Person{Name: , Value: 100, age: 100}// 序列化为 JSONjsonData, _ : json.Marshal(p)fmt.Println(string(jsonData)) /*{Value:100}*/ }
http://www.hkea.cn/news/14466020/

相关文章:

  • 服务器购买网站辅导班如何做网站
  • 动物网站建设策划书如何用easyui做网站
  • 沈阳网站建设首选龙兴科技wordpress 弹出对话框
  • 建设商业网站的功能定位手机网站搭建教程
  • 网站正在建设中 模板楼盘网站建设案例
  • 网站服务器租金wordpress4.9.7
  • 网站建设 php jsp .net网站会动的页面怎么做的
  • 小米的网站建设的要点免费网站生成器
  • 源码网站跟自己做的网站区别丫个网站建设博客
  • 韶关城乡建设部网站首页wordpress 微网站模板
  • 网站建设工程师招聘证券公司客户经理怎么拉客户
  • 平谷网站建设公司桂林北站官网
  • 网站都有什么类型的响应式网站设计欣赏
  • flash建网站教程网络管理员正在设计新的无布局
  • 眉山网站优化天津 网站设计
  • 免费搭建个人博客网站先进的网站开发技术
  • 专题网站策划书东莞网站建设 环保设备
  • 哪个免费的网站建设好焦作做网站公司
  • 做毕设的网站韩都衣舍网站建设的改进
  • 做网站为什么可以自学装修之家网
  • 判断电脑和手机访问网站外贸快车做网站怎么样
  • 360移动建站网站开发必须要搭建环境吗
  • 绵阳做网站的公司淘口令微信网站怎么做
  • 电子商务网站建设及推广方案嘉定营销型 网站制作
  • 推进地方文明网站建设网站备案很麻烦吗
  • 21dove谁做的的网站竞价托管开户
  • 网站的数据库有什么用网页自助建站
  • 网站程序 制作个人能接做网站的活么
  • seo网站推广怎样网站建设中所涉及的所有链接建设
  • 百度网站做防水补漏做甜品台的网站