杂记4

1.为任意类型添加方法(包括系统定义的)

例:

1 type UserMap map[int]User  
2 
3 func (um UserMap) GetUser(id int) User{
4     return um[id]
5 }

 

2.匿名结构体(通常用于只使用一次的情况)

资料里看到的一种写法:

//注意前面是var !!!不是type
var
stu struct { //声明stu是一个结构体,但这个结构体是匿名的 Name string Addr string } stu.Name = 'aql' stu.Addr = 'dn'

书上看到的写法:

testStruct := struct{
  intA int8
  intB int8
  intC int8
  intD int8}{
  1,
  2,
  3,
  4}

 

3.结构体中含有匿名成员

type Student struct {
  Id int
  string    // 匿名字段
  float32  // 直接使用数据类型作为字段名,所以匿名字段中不能出现重复的数据类型
}

var stu = Student{Id: 1,string: "aql",float32: 88.8}

 

4.实例化指针类型的结构体变量(创建结构体指针)

type Book struct {
  title   string
  author  string
  subject string  
}

//第一种,使用new函数
var bookOne = new(Book)

//第二种,使用"&"运算符直接对结构体进行取地址操作
bookTwo := &Book{}

 

5.结构体嵌套

type user struct {
  name string
  sex    byte  
}

type paper struct {
  name   string
  author  user
}

p := new(paper)
p.name = "论文标题"
p.author.name = "作者姓名"
p.author.sex = 0

type vedio struct {
  length int
  name  string
  user  //匿名字段,可用数据类型当字段名
}

 

6.字段名冲突

v := new(vedio)
v.length = 13
v.name = "视频名称"

v.sex = 0 // 匿名字段也可以跳过中间字段名,直接访问内部的字段名;等价于v.user.sex = 0  

v.user.name = "作者姓名"  // 由于内部、外部结构体都有name这个字段,名字冲突了,所以需要指定中间字段名。不能跟上面一样可以跳过中间字段名user

 

7.结构体slice传参

user := []User{{Name:"aql"}}

func update_users(users []User){
  users[0].Name = "tql"
}

slice,对slice的3个字段(unsafe.Pointer, int, int)进行了拷贝,里面含底层数组的指针,所以修改底层数组的元素会反应到原切片上

如果传的是数组,就不会反应到原数组上,因为数组的话传递的是值,改变的是形参,与原数组无关

 

posted @ 2023-01-20 21:43  balabalahhh  阅读(51)  评论(0)    收藏  举报