go的常用语法
package main
/*程序入口*/
func main() {
//一个包下面不同文件调用,需要将不同文件package设置为当前文件名main
GetConnection()
//当前文档的方法
test01()
}
// Test01 基础语法
func test01() {
fmt.Println("基础语法")
stockade := 1128
enodata := "2020-12-31"
// %d 表示整型数字,%s 表示字符串
targetUrl := fmt.Sprintf("日期=%d 时间=%s:", stockade, enodata)
fmt.Println(targetUrl)
fmt.Println(fmt.Sprintf("指针地址%d", &stockade))
//数组使用
arrayName01 := []string{"张三", "李四"}
for i := 0; i < len(arrayName01); i++ {
fmt.Println(fmt.Sprintf("一维数组%s", arrayName01[i]))
}
arrayName02 := [][]string{{"11", "12"}, {"21", "22"}}
for i := 0; i < len(arrayName02[0]); i++ {
for y := 0; y < len(arrayName02[1]); y++ {
fmt.Println(fmt.Sprintf("二维数组%s", arrayName02[i][y]))
}
}
//切片=》动态数组 make虽然指定的size是5但是可以超载
var makeArray = make([]int, 5)
makeArray = []int{0, 1, 2, 3, 4, 5, 6, 7, 8}
makeArray01 := makeArray[2:5] //指定数组中下标2-5的数据 2,3,4
makeArray02 := makeArray[:5] //指定数组中下标5前面的数据 0,1,2,3,4
makeArray03 := makeArray[5:] //指定数组中下标5后面的数据 0,1,2,3,4
fmt.Println(fmt.Sprintf("切片=》动态数组%d,%d,%d", makeArray01[0], makeArray02[0], makeArray03[0]))
//map对象
mapArray := map[string]string{"France": "Paris", "Italy": "Rome", "Japan": "Tokyo", "India": "New delhi"}
for mapItem := range mapArray {
fmt.Println(fmt.Sprintf("map数组%s", mapArray[mapItem]))
}
mapArray01 := make(map[string]string)
fmt.Println(len(mapArray01))
switch 1 {
case 1:
fmt.Println("switch 1")
default:
fmt.Println("switch")
}
fmt.Println("select")
ch := make(chan int) //发送值到Channel ch中 ch并发核心单元 make(chan int)是ch的初始值,类似C#delegate
go func(c chan int) {
// 修改时间后,再查看执行结果
time.Sleep(time.Second * 1)
ch <- 1
}(ch)
select {
case v := <-ch: //从Channel ch中接收数据,并将数据赋值给v
fmt.Sprintf("select%d", v)
case <-time.After(2 * time.Second): // 等待 2s
fmt.Println("no case ok")
}
//range 返回迭代数组(array)、切片(slice)、通道(channel)或集合(map)的元素
for key, value := range arrayName01 {
fmt.Println(key) //0
fmt.Println(value) //1
}
for i := 0; i < len(arrayName01); i++ {
fmt.Println(arrayName01[i]) //1
}
for true {
fmt.Println("0")
goto goRegion
break
}
goRegion:
if true {
_, numberResult := getNumber("张三", "李四")
fmt.Println(fmt.Sprintf("函数调用,弃掉一个指针%s", numberResult))
method01 := func(x float32) int { return (int)(x) } // 声明一个函数类型
fmt.Println(fmt.Sprintf("函数变量%d", method01(1.1)))
testCallBack(1, callBack)
structResult()
var errModel errModel
{
errModel.code = 0
errModel.message = "获取数据成功"
errModel.data = "数据"
}
fmt.Println(fmt.Sprintf(
"错误消息%s",
errModel.Error()),
)
}
//接口调用1
var c1 Circle
c1.radius=1.1
fmt.Println(c1.getScore())
//接口调用2
var it interTemp
c2 := Circle{2.2}
it=c2
fmt.Println(it.getGender())
//接口调用3
var it2 interTemp=Circle{3.3}
fmt.Println(it2.getGender())
//一个包下面不同文件调用
fmt.Println(classTest01())
}
/*函数*/
func getNumber(a string, b string) (string, string) {
return a, b
}
/*定义委托*/
type cb func(int) int
func testCallBack(x int, call cb) {
call(1)
}
func callBack(x int) int {
fmt.Printf("我是回调,x:%d\n", x)
return x
}
// Circle 定义结构体
type Circle struct {
radius float64
}
//结构 定义属性
func (c Circle) getStruct() float64 {
return 3.14 * c.radius
}
/*结构体的使用*/
func structResult() {
var c Circle
c.radius = 10
fmt.Println(fmt.Sprintf("结构体的使用%f", c.getStruct()))
}
/*定义接口*/
type interTemp interface {
getScore() string
getGender() string
}
/*实现接口*/
func (c Circle) getScore() string {
return fmt.Sprintf("I'm 接口实现类1 {%f}",c.radius)
}
func (c Circle) getGender() string {
return fmt.Sprintf("I'm 接口实现类2 {%f}",c.radius)
}
/*定义异常*/
type errModel struct {
data string
message string
code int
}
func (err *errModel) Error() string {
return fmt.Sprintf("code:%d message:%s data:%s", err.code,err.message, err.data)
}
个人拙见:写法比较灵活