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日 北京的天气特别好,心情也还行。
今天收到心心念念公司的面试邀请,机会很好,一部分原因,确实自己目前实力不够,另外,现在项目组确实很适合自己,继续锻炼一下。同时,还有个出差的机会~
好好努力,幸福会来敲门。