r1笔记第14天 Golang(14)

type 定义的都是类型,可以给类型起别名,但是, 别名和类型属于不同类型,要赋值,需要类型转换。

package main

import (
	"fmt"
)

type integer int

func main()  {
	var i integer = 1000
	var j int
	fmt.Println(i,j)
	
	//j = i error:cannot use i (type integer) as type int in assignment
	j = int(i)
	fmt.Println(i,j)
}

运行结果:

PS F:\go\src\go_dev> .\main.exe1000 0
1000 1000
PS F:\go\src\go_dev>

 

golang中的struct没有构造函数,一般可以使用工厂模式来解决这个问题。

1、make用来创建map、slice、channel

2、new用来创建值类型。

package main

package main

import (
	"fmt"
	"go_dev/day5/work/example03/mode1"
)

type student struct{
	Name string
	Age int
}

func main()  {
	stu1 := new(student)
	stu1.Name="xx"
	stu1.Age = 18
	S := mode1.NewStudent("Tony",20)
	fmt.Println(stu1,S)
}

package mode1

package mode1

type Student struct {
	Name string
	Age int
}

func NewStudent(name string,age int) *Student {
	return &Student{
		Name:name,
		Age:age,
	}
}

运行结果:

PS F:\go\src\go_dev> go build  .\day5\work\example03\main\main.go
PS F:\go\src\go_dev> .\main.exe
&{xx 18} &{Tony 20}
PS F:\go\src\go_dev>

会发现,有了工厂模式之后,会方便很多,自己建一个构造函数。这样可以省下很多代码量。


struct中的tag

我们可以为struct中的每个字段,写上一个tag。这个tag可以通过反射的机制获取到,最常用的场景就是json序列号和反序列化。

type student struct{
    Name string  "this is name field"
    Age int       "this is age field"
}

常用:go对外访问是大写的,但是json打包都是小写的,但是结构体小写对外无法访问。因为json是在别的包,打包时候等于引用了当前包的结构体,如果字段是小写,就无法对外访问。

package main

import (
	"fmt"
	"encoding/json"
)

type student struct {
	//ame string
	//age int
	//score int
	Name string
	Age int
	Score int
}

func main()  {
	var stu student = student{
		//name:"stu01",
		//age:18,
		//score:100,
		Name:"stu01",
		Age:18,
		Score:100,		
	}
	if data,err := json.Marshal(stu);err!=nil{
		fmt.Println("json encode stu failed,err:",err)
	} else {
		fmt.Println(string(data))
		//如果是小写的话,打包时候,student是无法访问的,输出为{},也就是为空。
		//将name,age,score,改成大写,这样输出才不为空。
	}	
}

运行结果:

PS F:\go\src\go_dev> go build  .\day5\work\example04\main\main.go
PS F:\go\src\go_dev> .\main.exe
{"Name":"stu01","Age":18,"Score":100}
PS F:\go\src\go_dev>

要怎么解决这个问题呢?通过tag来搞定,字段不想被别的包看到。

type student struct {
	//ame string
	//age int
	//score int
	Name string  `json:"stu_name"`
	Age int		`json:"stu_age"`
	Score int	`json:"stu_score"`
}

这样子就可以,json打包部分可以是自定义的,输出结果:

PS F:\go\src\go_dev> .\main.exe
{"stu_name":"stu01","stu_age":18,"stu_score":100}
PS F:\go\src\go_dev>

2019年12月14日  北京的天气特别好,心情也还行。

今天收到心心念念公司的面试邀请,机会很好,一部分原因,确实自己目前实力不够,另外,现在项目组确实很适合自己,继续锻炼一下。同时,还有个出差的机会~

 

好好努力,幸福会来敲门。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值