go学习笔记

1 篇文章 0 订阅

1.go数据类型

在这里插入图片描述

2.声明变量

var 声明可以不加类型但是必须初始化,不初始化就要声明变量类型;
:=的用法:
在这里插入图片描述

在这里插入图片描述

3.常量

常量中的数据类型只可以是布尔型、数字型(整数型、浮点型和复数)和字符串型。
const identifier [type] = value
你可以省略类型说明符 [type],因为编译器可以根据变量的值来推断其类型。

显式类型定义: const b string = “abc”
隐式类型定义: const b = “abc”

常量的枚举:
const (
Unknown = 0
Female = 1
Male = 2
)

Go 没有三目运算符,所以不支持 ?: 形式的条件判断。

4.函数

Go 语言函数定义格式如下:

在这里插入图片描述

在这里插入图片描述

5.占位符的使用

在这里插入图片描述
在这里插入图片描述

6.go指针

指针和c语言里面的一样,就是一种存储空间地址值的一个变量类型
他的声明,赋值,访问看下图:
在这里插入图片描述

指针数组:数据类型为指针的数组

在这里插入图片描述

指针作为函数参数
在这之前要对比 * 和 & 区别
& 是取地址符号 , 即取得某个变量的地址 , 如 ; &a

  • 在后面加指针变量,表示取出(访问)该地址存储的值
    用于声明是指针变量,后面加数据类型,例如int,表示int型指针

在这里插入图片描述

go没有while只有for

第一种 只是用作循环问题
1.和java的for一样用
在这里插入图片描述
在这里插入图片描述
2.像java的while一样用
在这里插入图片描述
在这里插入图片描述

第二种:和range关键字一起用遍历数组,map等

在这里插入图片描述
在这里插入图片描述

go语法的左上角和右上角两点

`` 语法 理解为不转译字符串的意思,可以json yaml 等一起使用。

主要使用在结构体里面,

  1. -:不要解析这个字段

  2. omitempty:当字段为空(默认值)时,不要解析这个字段。比如false、0、nil、长度为 0 的 array,map,slice,string

3.FieldName:当解析 json 的时候,使用这个名字

参考:添加链接描述

package main

import (
    "encoding/json"
    "fmt"
)

type Student struct {
    StudentId      string `json:"sid"`
    StudentName    string `json:"sname"`
    StudentClass   string `json:"class"`
    StudentTeacher string `json:"teacher"`
}

type StudentNoJson struct {
    StudentId      string
    StudentName    string
    StudentClass   string
    StudentTeacher string
}

type StudentWithOption struct {
StudentId      string //默认使用原定义中的值
StudentName    string `json:"sname"`// 解析(encode/decode) 的时候,使用 `sname`,而不是 `Field`
StudentClass   string `json:"class,omitempty"`// 解析的时候使用 `class`,如果值为空,就忽略它
StudentTeacher string `json:"-"`// 解析的时候忽略该字段。默认情况下会解析这个字段,因为它是大写字母开头
}

func main() {
    //NO.1 with json struct tag
    s := &Student{StudentId: "1", StudentName: "fengxm", StudentClass: "0903", StudentTeacher: "feng"}
    jsonString, _ := json.Marshal(s)

    fmt.Println(string(jsonString))
    //{"sid":"1","sname":"fengxm","class":"0903","teacher":"feng"}
    newStudent := new(Student)
    json.Unmarshal(jsonString, newStudent)
    fmt.Println(newStudent)
    //&{1 fengxm 0903 feng}
    //Unmarshal 是怎么找到结构体中对应的值呢?比如给定一个 JSON key Filed,它是这样查找的:
    // 首先查找 tag 名字(关于 JSON tag 的解释参看下一节)为 Field 的字段
    // 然后查找名字为 Field 的字段
    // 最后再找名字为 FiElD 等大小写不敏感的匹配字段。
    // 如果都没有找到,就直接忽略这个 key,也不会报错。这对于要从众多数据中只选择部分来使用非常方便。

    //NO.2 without json struct tag
    so := &StudentNoJson{StudentId: "1", StudentName: "fengxm", StudentClass: "0903", StudentTeacher: "feng"}
    jsonStringO, _ := json.Marshal(so)

    fmt.Println(string(jsonStringO))
    //{"StudentId":"1","StudentName":"fengxm","StudentClass":"0903","StudentTeacher":"feng"}

    //NO.3 StudentWithOption
    studentWO := new(StudentWithOption)
    js, _ := json.Marshal(studentWO)

    fmt.Println(string(js))
    //{"StudentId":"","sname":""}

    studentWO2 := &StudentWithOption{StudentId: "1", StudentName: "fengxm", StudentClass: "0903", StudentTeacher: "feng"}
    js2, _ := json.Marshal(studentWO2)

    fmt.Println(string(js2))
    //{"StudentId":"1","sname":"fengxm","class":"0903"}
}

接口interface要写一个结构体去实现它

interface是一组method的组合,我们通过interface来定义对象的一组行为
在这里插入图片描述

通道数据类型通常用于和并发goroutine一起使用,<-箭头方向表示数据流向

通道(channel)是用来传递数据的一个数据结构。

通道可用于两个 goroutine 之间通过传递一个指定类型的值来同步运行和通讯。操作符 <- 用于指定通道的方向,发送或接收。如果未指定方向,则为双向通道。

通道类型创建:
声明一个通道很简单,我们使用chan关键字即可,通道在使用前必须先创建:

ch := make(chan int)

使用注意:默认情况下,通道是不带缓冲区的。发送端发送数据,同时必须有接收端相应的接收数据。
在这里插入图片描述

go函数调用参数地址问题

自定义参数类型对象变量传入前后地址不一样,无法改变赋值变量内容,切片,map函数调用传入默认是指针类型


type User struct {
	Id int
	Name string
}

type ID int64
type IntArray []int

func px(arr []string,u *User,sl []User,m map[int]string)  {
	//sort.Sort(arr)
	u.Name=""
	fmt.Println("px函数中u1地址-",&u.Id)
	sl[0].Name=""
	sort.Strings(arr)
	m[1]=""
}
func px2(arr []string,u User,sl []User)  {
	//sort.Sort(arr)
	fmt.Println("px2函数中u2地址-",&u.Id)
	u.Name=""
	sl[0].Name=""
	sort.Strings(arr)

}
func main()  {
	ss:=[]string{"aaa","cccc","bb"}
	u1:=User{
		Id:1,
		Name:"xiaoxioa",
	}
	u2:=User{
		Id:1,
		Name:"xiaoxioa",
	}
	sll:=[]User{
		{
			Id:2,
			Name:"da",
		},
		{
			Id:3,
			Name:"ca",
		},
	}
	k:=1
	fmt.Println(&k)
	mm:=map[int]string{1:"map值"}
	px(ss,&u1,sll,mm)
	px2(ss,u2,sll)
	fmt.Println(u1)
	fmt.Println("主函数中u2地址-和u2值-",&u2.Id,u2)
	fmt.Println("主函数中u1地址-和u2值-",&u1.Id,u2)
	fmt.Println(sll)
	fmt.Println("map:"+mm[1])
	fmt.Println(320168%16)

在这里插入图片描述

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值