【ByteDaily】Go语言基础


1.configure

  • 下载vscode&Go
    go
  • 设置gopath
 go env -w GOPATH=/Users/bytedance/go
  go env -w PATH=/Users/bytedance/bin
  • 设置goMod状态,goMod google
go env -w GOPROXY=https://goproxy.cn,direct

1.1Go语言了解

Go语言优缺点

1.2 vscode+go

在vs code进入指定code编译环境

  • mac terminal终端打开文件所在目录
code .
  • 先编译再运行
    (进入hello.go所在文件)
go build hello.go
./hello
  • 或直接run脚本
go run hello.go

1.3 go 项目管理

go mod init hello(在hello.go同级文件下)
go env (查看Go环境)

2.常用语法

2.1 go定义变量

package main

import "fmt"

/*定义全局变量*/
var global1 = 100
var global2 = 200

//func 是关键字,表示是一个函数
func main() {
	fmt.Println("姓名 \t年龄 \r")
	//fmt.Println("name \tage")

	//定义变量1
	var i int
	//i = 11
	fmt.Println("i=", i)
	//定义变量2
	name := "hhhh"
	fmt.Println("name", name)

	/* 一次性申请多个变量*/
	var n1, name2, x = 100, "jack", 88
	fmt.Println(x, name2, n1)

}

2.2 "+"号 字符类型

  • go也可以实现字符串拼接
  • float 32 float64
  • 无字符型,用byte保存单个字母字符(utf8编码)
  • int,int8,int16…uint,uint32…
  • bool类型
  • string为基本类型,字符串一旦确定就不能更改
  • go里面函数也是一种数据类型
  • map也是类型
    【highlight】
    查看数据类型和大小
  • golang默认64位浮点数
fmt.Print有几个变种:

Print:   输出到控制台,不接受任何格式化操作
Println: 输出到控制台并换行
Printf : 只可以打印出格式化的字符串。只可以直接输出字符串类型的变量(不可以输出别的类型)
Sprintf:格式化并返回一个字符串而不带任何输出
Fprintf:来格式化并输出到 io.Writers 而不是 os.Stdout

2.3 字符串转换

/*字符串转数字
	// ParseInt 将字符串转换为 int 类型
	// s:要转换的字符串
	// base:进位制(2 进制到 36 进制)
	// bitSize:指定整数类型(0:int、8:int8、16:int16、32:int32、64:int64)
	// 返回转换后的结果和转换时遇到的错误
	// 如果 base 为 0,则根据字符串的前缀判断进位制(0x:16,0:8,其它:10)
	func ParseInt(s string, base int, bitSize int) (i int64, err error)
	*/
	var newstr string = "12345"
	var aa int64
	aa, _ = strconv.ParseInt(newstr, 10, 64)
	fmt.Println(aa)

2.4 JSON序列化与反序列化

package main

import (
	"encoding/json"
	"fmt"
)

//json序列化
type Student struct {
	Id   int    `json:"stuid"`
	Name string `json:"stuname"`
}

type Class struct {
	Title      string
	Mystudents []Student //切片
}

func main() {
	//创建一个班级结构体
	C1 := Class{
		Title:      "101班",
		Mystudents: make([]Student, 0, 20),
	}
	for i := 0; i < 10; i++ {
		//由于添加的是结构体,所以需要封装一下
		var temp Student
		temp.Id = i
		/*实例化结构体法二:
		 stu := Stu{
			Name: "张三",
			Age:  18,
			HIgh: true,
			sex:  "男",
		}*/

		//sprintf格式化字符串
		temp.Name = fmt.Sprintf("stu%02d", i)
		C1.Mystudents = append(C1.Mystudents, temp)
	}
	fmt.Printf("%v\n", C1)

	//json序列化:GO语言中数据->JSON格式的字符串
	data, err := json.Marshal(C1)
	if err != nil {
		fmt.Println("json marshal failed:", err)
		return
	}
	//json为字符串
	fmt.Printf("%s\n", data)

	//json反序列化:JSON格式字符串转为GO语言数据
	jsonstr := `{
		"Title":"101班",
		"Mystudents":[
			{
				"stuid":0,
				"stuname":"stu00"
			},
			{
				"stuid":1,
				"stuname":"stu01"
			}]
	}`
	var c2 Class
	json.Unmarshal([]byte(jsonstr), &c2)
	if err != nil {
		fmt.Printf("json unmarshal failed")
	}
	fmt.Printf("%v\n", c2)
}

2.5 defer用法

链接
函数返回的过程是这样的:先给返回值赋值,然后调用defer表达式,最后才是返回到调用函数中。

2.6 方法&函数

在Go语言中,函数是指不属于任何结构体、类型的方法,也就是说,函数是没有接收者的;而方法是有接收者的,我们说的方法要么是属于一个结构体的,要么属于一个新定义的类型的。

在Go语言中,函数是指不属于任何结构体、类型的方法,也就是说,函数是没有接收者的;而方法是有接收者的,我们说的方法要么是属于一个结构体的,要么属于一个新定义的类型的。

2.7 值类型接收&指针类型接收

李文周

  • 当方法作用于值类型接收者时,Go语言会在代码运行时将接收者的值复制一份。在值类型接收者的方法中可以获取接收者的成员值,但修改操作只是针对副本,无法修改接收者变量本身。

  • 指针类型的接收者由一个结构体的指针组成,由于指针的特性,调用方法时修改接收者指针的任意成员变量,在方法结束后,修改都是有效的。这种方式就十分接近于其他语言中面向对象中的this或者self。 例如我们为Person添加一个SetAge方法,来修改实例变量的年龄。

2.8 sql的占位符"?"

现在的数据库系统都提供SQL语句的预编译(prepare)和查询参数绑定功能,在SQL语句中放置占位符’?’,防止注入攻击
参考1
2
bindvars的一个常见误解是,它们用来在sql语句中插入值。它们其实仅用于参数化,不允许更改SQL语句的结构。例如,使用bindvars尝试参数化列或表名将不起作用:

// ?不能用来插入表名(做SQL语句中表名的占位符)
db.Query("SELECT * FROM ?", "mytable")
 
// ?也不能用来插入列名(做SQL语句中列名的占位符)
db.Query("SELECT ?, ? FROM people", "name", "location")

2.9 sql按原表格顺序排序

link
首先,in 查询 是查询范围的 比如我有个 article表

查询

select * from article where id in(1,5,3);
这样查询来它默认是 按 id升序排列的。

如果我们想要保持传入的顺序,怎么办呢?

用 find_in_set吧

看:

select * from article where id in(1,5,3) ORDER BY FIND_IN_SET(‘id’,‘1,5,3’);
这样的好处是 我可以把这个排序 存在别的表的某个字段,做关联。

当然也等同于

select * from article where id IN(1,5,3) ORDER BY field(id,‘1’,‘5’,‘3’);
用上面的 如果排序 和查询 用的是 字符串字段 就方便点。

2.10 接口

2.10.1 空接口

空接口是指没有定义任何方法的接口。因此任何类型都实现了空接口
空接口类型的变量可以存储任意类型的变量。

func main() {
	// 定义一个空接口x
	var x interface{}
	s := "Hello 沙河"
	x = s
	fmt.Printf("type:%T value:%v\n", x, x)
	i := 100
	x = i
	fmt.Printf("type:%T value:%v\n", x, x)
	b := true
	x = b
	fmt.Printf("type:%T value:%v\n", x, x)
}

空接口的应用
空接口作为函数的参数
使用空接口实现可以接收任意类型的函数参数。

// 空接口作为函数参数

func show(a interface{}) {
	fmt.Printf("type:%T value:%v\n", a, a)
}

空接口作为map的值
使用空接口实现可以保存任意值的字典。

// 空接口作为map值
	var studentInfo = make(map[string]interface{})
	studentInfo["name"] = "沙河娜扎"
	studentInfo["age"] = 18
	studentInfo["married"] = false
	fmt.Println(studentInfo)
   var m map[string]interface{}    //声明变量,不分配内存
    m = make(map[string]interface{}) //必可不少,分配内存
    m["name"] = "simon"

3 网络相关

3.1 net/http

link
http.Post
要以 POST 的方式发送数据,也很简单,只需调用 http.Post() 方法并依次传递下面这 3 个参数即可:

请求目标的 URL
POST 请求数据的资源类型(MIMEType)
数据的比特流([]byte 形式)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值