结构体
type关键字
用途:
1.定义结构体
2.定义接口
3.定义类型别名
4.类型定义
5.类型判断
别名实际上是为了更好的理解代码,例如chat类型是int类型(ascii码对照表)
//类型别名
type chatInt = int
var x chatInt
fmt.Printf("%T",x)
输出
int
//自定义类型
type Myint int
var i Myint = 12
fmt.Printf("%T",i)
输出
main.Myint
别名和自定义虽然很像,但别名可以和真名一起使用,而自定义类型不能和真名一起使用。
例如定义了 一个j是int类型,可以和别名相加减运算,但不能和自定义的int类型做加减运算
但是可以用强制类型转换来使用。
- 定义方法
package main
import "fmt"
import "strconv"
type Myint int
func (mi Myint) string() string{
return strconv.Itoa(int(mi + 2))
}
func main() {
var i Myint = 12
fmt.Println(i,i.string())
}
//输出
12 14
- 类型判断
type switch判断类型,假设调用别人接口,人家原本传int后来微调成string。那么可以用这个来操作
https://blog.csdn.net/BTnode/article/details/105520920
var a interface{} = "abc"
switch a.(type){
case string :
fmt.Println("字符串")
}
//输出
字符串
结构体的定义和初始化
如果没结构体我们定义一个个人集合信息很麻烦。且年龄和身高我们需要的类型并非是string类型
var persons [][]string
//定义名字,年龄,地址,身高
persons = append(persons,[]string{"a","18","厦门","180"})
fmt.Println(persons)
//[[a 18 厦门 180] ]
定义及初始化
p1的初始化比较拘谨,必须写上所有值。p2则可以自定义。且位置不受影响例如age和height对调了位置。
type Person struct{
name string
age int
address string
height float32
}
func main() {
p1 :=Person{"a",18,"厦门",1.80}
p2 :=Person{name:"b",height:19,address:"深圳",age:18}
fmt.Println(p1,p2)
//{a 18 厦门 1.8} {b 18 深圳 19}
- 初始化和赋值
package main
import "fmt"
type Person struct{
name string
age int
address string
height float32
}
func main() {
p1 :=Person{"a",18,"厦门",1.80}
p2 :=Person{name:"b",height:19,address:"深圳",age:18}
var persons []Person
persons = append(persons,p1)
persons = append(persons,p2)
persons = append(persons,Person{name:"c",height:160,address:"北京"})
persons = append(persons,Person{"d",38,"泉州",1.1})
fmt.Println(persons)
var persons2 []Person
persons2 =[]Person{
{"a",18,"厦门",1.80},
{name:"b"},
}
fmt.Println(persons2)
}
//输出
[{a 18 厦门 1.8} {b 18 深圳 19} {c 0 北京 160} {d 38 泉州 1.1}]
[{a 18 厦门 1.8} {b 0 0}]
匿名结构体
type Person struct{
name string
age int
address string
height float32
}
func main() {
var p Person
p.age = 18
fmt.Println(p,p.age,p.height)
//输出
{ 18 0} 18 0//int和float默认值为0,string默认值为空所以不展示
}
匿名结构体
address := struct{
province string
city string
address string
}{
city:"翔安区",
province:"厦门市",
address:"厦大",
}
fmt.Println(address)
定义结构体,顺便得实例化了。
实例化方式一样可以键值对传,也可以顺序传。
一次性使用,封装性好,不用定义全局变量
结构体嵌套
- 结构体嵌套
type Person struct {
name string
age int
}
type Student struct {
//第一种嵌套方式
p Person
score float32
}
func main() {
s := Student{
p: Person{"young", 18},
score: 12.1,
}
fmt.Println(s, s.p.age)
}
//输出
{{young 18} 12.1} 18
type Person struct {
name string
age int
}
type Student struct {
//第一种嵌套方式
p Person
score float32
}
func main() {
s := Student{}
s.p.name = "young"
fmt.Println(s, s.p.age, s.p.name)
}
- 匿名嵌套
type Person struct {
name string
age int
}
type Student struct {
//匿名嵌套
Person
score float32
}
func main() {
s := Student{
Person{"yonug", 1},
12.1,//注意 后面都要逗号结尾
}
fmt.Println(s, s.name)
}
//输出
{{yonug 1} 12.1} yonug
注意 匿名结构体如果有带参数传参则应该带上key 例如
s := Student{
Person: Person{"yonug", 1},
score: 12.1,
}
匿名嵌套初始化时得把匿名结构体放进去不能直接这样操作
- 外部优先级最高
`go
type Person struct {
name string
age int
}
type Student struct {
//匿名嵌套
Person
score float32
name string
}
func main() {
s := Student{
Person: Person{"yonug", 1},
score: 12.1,
name: "young!!",
}
fmt.Println(s, s.name)
s.name = "aa"
fmt.Println(s, s.name)}
//输出
{{yonug 1} 12.1 young!!} young!!
{{yonug 1} 12.1 aa} aa
### 结构体的定义方法
* 绑定方法
```go
type Person struct {
name string
age int
}
//接收器 在方法中修改p.name值后,实际上仅在方法中生效。(值传递)
//如果要引用传递 则加入*号,变成指针传递"func (p *Person)"
//需要修改值时用指针传递、还有值传递会拷贝数据,如果p很大时建议用指针传递
// func p为传进来的变量,Person为结构体,print为方法名
func (p Person) print() {
fmt.Printf("name:%s, age:%d", p.name, p.age)
}
func main() {
s := Person{"yonug", 1}
s.print()
}文档更新时间: 2023-07-09 01:24 作者:young