日常生活的交流与学习

首页 新随笔 联系 管理

D:\code_gitee\go_example\main.go

package main

import (
	"fmt"
)

func main() {
	// 显示声明类型
	const a string = "hello"
	// 隐式声明类型
	const b = "hello"
	// 多重赋值
	const x, y, z = 1, true, "hello"
	fmt.Println("x=", x, "y=", y, "z=", z)
	fmt.Println("----------------------")

	// 用于枚举
	const (
		Spring = 0
		Summer = 1
		Autumn = 2
		Winter = 3
	)
	fmt.Println(Spring)
	fmt.Println(Summer)
	fmt.Println(Autumn)
	fmt.Println(Winter)
	fmt.Println("----------------------")

	// 使用内置函数给常量赋值,比如说len,unsafe.Sizeof(),但是必须是内置函数,不能是自己定义的函数
	const (
		x1 = "hello"
		y1 = len(b)
	)
	fmt.Println("x1=", x1)
	fmt.Println("y1=", y1)
	fmt.Println("----------------------")

	// iota的使用,有点像个自增器
	const (
		Morning = iota
		Afternoon
		Evening
	)
	fmt.Println(Morning)
	fmt.Println(Afternoon)
	fmt.Println(Evening)
	fmt.Println("----------------------")

	// iota的使用,和移位结合起来使用,用于二进制的移位
	const (
		Red    = 1 << iota // 0001
		Orange             // 0010
		Yellow             // 0100
		Green              // 1000
	)
	fmt.Println(Red)
	fmt.Println(Orange)
	fmt.Println(Yellow)
	fmt.Println(Green)
	fmt.Println("----------------------")

	// 使用iota定义byte size
	// 给 float64 起个别名 ByteSize
	type ByteSize float64
	const (
		_           = iota
		KB ByteSize = 1 << (10 * iota) // 100 0000 0000 = 2 ** 10 =1024
		MB
		GB
		TB
		PB
		EB
		ZB
		YB
	)
	fmt.Println(KB)
	fmt.Println(MB)
	fmt.Println(GB)
	fmt.Println("----------------------")

	// iota 在同一行的使用情况
	const (
		Apple, Banana = iota + 1, iota + 2 // 虽然在同一行使用了两次,但是都没有增长
		Pinia, Bluebarry
		Peach, Leomon
	)
	fmt.Println(Apple)  // iota + 1 = 0+1 =1
	fmt.Println(Banana) // iota + 2 = 0+2 =2
	fmt.Println(Pinia)

}

D:\code_gitee\go_example\main01_初次使用.go.txt

package main

import (
	"fmt"

	"com.song.learn/models"
	"com.song.learn/utils"
)

func main() {
	per := models.Person{
		Name: "Alice",
		Age:  19,
	}
	fmt.Println(per)
	fmt.Println("------------------------")

	stu := models.Student{
		Name:  "Bruce",
		Age:   19,
		Grade: 3,
	}
	fmt.Println(stu)
	fmt.Println("-----------------------")

	res := utils.Sum(1, 3)
	fmt.Println("sum(1,3)=", res)
}

D:\code_gitee\go_example\main02_ICM报文封装_不会.go.txt

package main

import (
	"bytes"
	"encoding/binary"
	"fmt"
	"net"
)

type ICMP struct {
	Type        uint8
	Code        uint8
	Checksum    uint16
	Identifier  uint16
	SequenceNum uint16
}

func CheckSum(data []byte) uint16 {
	var (
		sum    uint32
		length int = len(data)
		index  int
	)
	for length > 1 {
		sum += uint32(data[index])<<8 + uint32(data[index+1])
		index += 2
		length -= 2
	}
	if length > 0 {
		sum += uint32(data[index])
	}
	sum += (sum >> 16)

	return uint16(^sum)
}

func main() {
	var (
		icmp  ICMP
		laddr net.IPAddr = net.IPAddr{IP: net.ParseIP("192.168.1.2")} //***IP地址改成你自己的网段***
		raddr net.IPAddr = net.IPAddr{IP: net.ParseIP("192.168.1.1")}
	)

	//如果你要使用网络层的其他协议还可以设置成 ip:ospf、ip:arp 等
	conn, err := net.DialIP("ip4:icmp", &laddr, &raddr)
	if err != nil {
		fmt.Println(err.Error())
		return
	}
	defer conn.Close()

	//开始填充数据包
	icmp.Type = 8 //8->echo message  0->reply message
	icmp.Code = 0
	icmp.Checksum = 0
	icmp.Identifier = 0
	icmp.SequenceNum = 0

	var (
		buffer bytes.Buffer
	)
	//先在buffer中写入icmp数据报求去校验和
	binary.Write(&buffer, binary.BigEndian, icmp)
	icmp.Checksum = CheckSum(buffer.Bytes())
	//然后清空buffer并把求完校验和的icmp数据报写入其中准备发送
	buffer.Reset()
	binary.Write(&buffer, binary.BigEndian, icmp)

	if _, err := conn.Write(buffer.Bytes()); err != nil {
		fmt.Println(err.Error())
		return
	}
	fmt.Printf("send icmp packet success!")
}

D:\code_gitee\go_example\main03_变量.go.txt

package main

import (
	"fmt"
	"reflect"
)

// 1. 全局变量,声明
var gx,gy int

// 2. 全局变量声明,分解写法
var (
	gm int = 110
	gn bool = true
)

// 3. 全局变量声明不允许使用语法糖形式
// gx:=123

func main() {
	// 1. 只是声明,不赋值
	var a int
	fmt.Printf("a=%d", a)
	fmt.Println("------------------")
	var b string
	fmt.Printf("b=%s", b)
	fmt.Println("------------------")

	// 2. 声明但不赋值
	var c int = 100
	fmt.Println(c)
	fmt.Printf("type(c)= %T\n", c)
	//%T 最终还是调用的是 reflect.TypeOf()函数
	fmt.Println("type(c)=", reflect.TypeOf(c))
	fmt.Println("------------------")

	// 3. 声明的时候直接赋值,自动类型推断
	var d = 20
	fmt.Printf("type(d)=%T\n", d)
	fmt.Println("------------------")

	// 4. 省略var关键字
	e := 3.14
	fmt.Printf("e=%f\n", e)
	fmt.Printf("type of e=%T\n", e)
	fmt.Println("------------------")

	// 5. 同时声明多个变量
	m, n := 123, 456
	fmt.Println("m=", m)
	fmt.Println("n=", n)
	fmt.Println("------------------")

	var m1, n1 = 123, 456 // m1和n1,都会进行类型推导
	var m11, n11 int = 123, 456 // m11和n11,两个类型都是一样的,所以可以直接声明int类型
	fmt.Println("m1=", m1)
	fmt.Println("n1=", n1)
	fmt.Println("m11=", m11)
	fmt.Println("n11=", n11)
	fmt.Println("------------------")

	var m2, n2 = 123, "test" // m2和n2,是两个不同的类型,这里会自动进行类型推导
	// var m2, n2 int,string= 123, "test" // 我本来以为这样声明两个变量,然后分别声明不同的类型,但是这样好像不行,必须两个都是相同的类型 
	fmt.Printf("m2=%T\n", m2)
	fmt.Printf("n2=%T\n", n2)
	fmt.Println("------------------")

	// 6. 同时声明多个变量,丢弃一个变量
	_, y := 123, 456 //前面的123就会被丢弃掉
	// fmt.Println("_=",_) // can not use _ as value or type
	fmt.Println("y=", y)
	fmt.Println("------------------")

	// 7. 全局变量
	fmt.Println("gx=",gx,"gy=",gy)
	fmt.Println("gm= ",gm,"gn= ",gn)
}

D:\code_gitee\go_example\main04_常量.go.txt

package main

import (
	"fmt"
)

func main() {
	// 显示声明类型
	const a string = "hello"
	// 隐式声明类型
	const b = "hello"
	// 多重赋值
	const x, y, z = 1, true, "hello"
	fmt.Println("x=", x, "y=", y, "z=", z)
	fmt.Println("----------------------")

	// 用于枚举
	const (
		Spring = 0
		Summer = 1
		Autumn = 2
		Winter = 3
	)
	fmt.Println(Spring)
	fmt.Println(Summer)
	fmt.Println(Autumn)
	fmt.Println(Winter)
	fmt.Println("----------------------")

	// 使用内置函数给常量赋值,比如说len,unsafe.Sizeof(),但是必须是内置函数,不能是自己定义的函数
	const (
		x1 = "hello"
		y1 = len(b)
	)
	fmt.Println("x1=", x1)
	fmt.Println("y1=", y1)
	fmt.Println("----------------------")

	// iota的使用,有点像个自增器
	const (
		Morning = iota
		Afternoon
		Evening
	)
	fmt.Println(Morning)
	fmt.Println(Afternoon)
	fmt.Println(Evening)
	fmt.Println("----------------------")

	// iota的使用,和移位结合起来使用,用于二进制的移位
	const (
		Red    = 1 << iota // 0001
		Orange             // 0010
		Yellow             // 0100
		Green              // 1000
	)
	fmt.Println(Red)
	fmt.Println(Orange)
	fmt.Println(Yellow)
	fmt.Println(Green)
	fmt.Println("----------------------")

	// 使用iota定义byte size
	// 给 float64 起个别名 ByteSize
	type ByteSize float64
	const (
		_           = iota
		KB ByteSize = 1 << (10 * iota) // 100 0000 0000 = 2 ** 10 =1024
		MB
		GB
		TB
		PB
		EB
		ZB
		YB
	)
	fmt.Println(KB)
	fmt.Println(MB)
	fmt.Println(GB)
	fmt.Println("----------------------")

	// iota 在同一行的使用情况
	const (
		Apple, Banana = iota + 1, iota + 2 // 虽然在同一行使用了两次,但是都没有增长
		Pinia, Bluebarry
		Peach, Leomon
	)
	fmt.Println(Apple)  // iota + 1 = 0+1 =1
	fmt.Println(Banana) // iota + 2 = 0+2 =2
	fmt.Println(Pinia)

}

D:\code_gitee\go_example\models\Person.go

package models

type Person struct {
	Name string
	Age  int
}

D:\code_gitee\go_example\models\Student.go

package models

type Student struct {
	Name  string
	Age   int
	Grade int
}

D:\code_gitee\go_example\utils\sum.go

package utils


func Sum(a int, b int) int {
	return a + b
}

posted on 2022-11-26 23:19  lazycookie  阅读(24)  评论(0编辑  收藏  举报