ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Go语言学习——结构体复习

2022-06-05 00:34:29  阅读:143  来源: 互联网

标签:复习 person int fmt 接收者 name Println Go 语言


内容回顾

自定义类型和类型别名

type MyInt int // 自定义类型
type newInt = int // 类型别名

类型别名只在代码编写过程中有效,编译完之后就不存在,内置的byte和rune都属于类型别名

结构体

基本的数据类型:表示现实中的物件有局限性

编程是用代码解决现实生活中的问题

var name = "保德路"

结构体是一种数据类型,一种我们自己造的可以保存多个维度数据的类型

凡是以type开头的都是新造了一个类型

type person struct {
    name string
    age int
    id int64
    addr string
}

匿名结构体

多用于临时场景

var a = struct {
    x int
    y int
}

结构体的初始化

构造函数

new开头

构造函数也是函数并没有什么不同

方法和接收者

方法是有接收者的函数,接收者指的是哪个类型的变量可以调用这个函数

当我在方法里需要修改结构体变量的值的时候需要指针接收者

结构体是值类型

结构体的嵌套

结构体的匿名字段

JSON序列化与反序列化

Go语言中把错误当成值返回,错误通常作为第二个返回值

经常出现问题:

  1. 结构体内容的字段首字母要大写!!!否则别人是访问不到的
  2. 反序列化时要传递指针!
点击查看代码
package main

import (
	"encoding/json"
	"fmt"
)

// 复习结构体

type tmp struct { // 有名字的结构体
	x int
	y int
}

type person struct {
	name string
	age  int
}

// func sum(x int, y int) int {
func sum(x int, y int) (ret int) {
	// return x + y
	ret = x + y
	return ret
}

// 构造(结构体变量的)函数 返回值是对应的结构体类型
func newPerson(name string, age int) person {
	return person{
		name: name,
		age:  age,
	}
}

// 方法
// 接收者使用对应类型的首字母小写
// 指定了接收者之后,只有接收者这个类型的变量才能调用这个方法
func (p person) dream(str string) { // 接收者 对应类型首字母的小写
	fmt.Printf("%s的梦想是学好Go语言!\n", p.name)
	fmt.Printf("%s的梦想是%s!\n", p.name, str)
}

// func (p person) guonian() {
// 	p.age++ // 此处的p是p1的副本 修改的是副本
// }

// 指针接收者
// 1. 需要修改结构体变量的值时要使用指针接收者
// 2. 结构体本身比较大,拷贝的内存开销比较大时也要使用指针接收者
// 3. 保持一致性:如果有一个方法使用了指针接收者,其他的方法为了统一也要使用指针接收者
func (p *person) guonian() {
	p.age++ // 此处的p是p1的副本 修改的是副本
}

func main() {
	var a = struct { // 匿名结构体(没有名字的结构体)
		x int
		y int
	}{10, 20}
	fmt.Println(a)

	var b = tmp{
		x: 10,
		y: 20,
	}
	fmt.Println(b)

	var c = tmp{
		10,
		30,
	}
	fmt.Println(c)

	var x int
	y := int8(10)
	fmt.Println(x, y)

	var p1 person // 结构体实例化
	p1.name = "小花"
	p1.age = 13

	p2 := person{"李昕", 12} // 结构体实例化
	p3 := person{"紫霞", 18}

	// 调用构造函数生成person类型变量
	p4 := newPerson("貂蝉", 16)
	fmt.Println(p1, p2, p3, p4)
	p1.dream("做个咸鱼") // 方法向函数一样传参数
	p2.dream("学好Go语言")

	fmt.Println(p1.age) // 13
	p1.guonian()
	fmt.Println(p1.age) // 13 14

	// 结构体嵌套
	type addr struct {
		provice string
		city    string
	}

	type student struct {
		// 名称 类型
		name string
		// address addr // 嵌套别的结构体
		addr // 匿名嵌套别的结构体,就使用类型名做名称
	}
	type point struct {
		X int `json:"x"`
		Y int `json:"y"`
	}
	po1 := point{100, 200}
	// 序列化
	b1, err := json.Marshal(po1)
	// 如果出错了
	if err != nil {
		fmt.Printf("Marshal failed err:%v\n", err)
		return
	}
	fmt.Println(string(b1))
	// 反序列化 由字符串 --> Go中的结构体变量
	str1 := `{"x":12,"y":16}`
	var po2 point // 造一个结构体变量,准备接收反序列化的值
	err = json.Unmarshal([]byte(str1), &po2)
	if err != nil {
		fmt.Printf("Unmarshal failed err:%v\n", err)
		return
	}
	fmt.Println(po2)
    
	// map
	m1 := map[int64]string{
		10010: "王昭君",
		10020: "西施",
	}
	name := m1[10010]
	name1 := m1[10011]
	fmt.Println(name)
	fmt.Println(name1)     // 如果不存在返回对应类型的零值 取不到就返回value类型的零值
	name2, ok := m1[10030] // 如果ok=true表示有这个key,如果ok=false表示没有这个key
	fmt.Println(name2, ok)
	for k, v := range m1 {
		fmt.Println(k, v)
	}
	for k := range m1 {
		fmt.Println(k)
	}
}

标签:复习,person,int,fmt,接收者,name,Println,Go,语言
来源: https://www.cnblogs.com/QiaoPengjun/p/16343144.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有