分类 Golang 下的文章

简单总结一下 Go 语言中 make 和 new 关键字的实现原理:
make 关键字的作用是创建切片、哈希表和 Channel 等内置的数据结构。
new 的作用是为类型申请一片内存空间,并返回指向这片内存的指针。

type UserBasic struct {
    gorm.Model
    Name          string    `gorm:"size:150;default:'';not null;comment:姓名"`
    Password      string    `gorm:"size:255;default:'';not null;comment:密码"`
    Phone         string    `gorm:"size:11;default:'';not null;comment:手机号码"`
    Email         string    `gorm:"size:150;default:'';not null;comment:邮箱"`
    Client        string    `gorm:"size:100;default:'';not null;comment:客户端"`
    Identity      string    `gorm:"size:255;default:'';not null;comment:暂无"`
    ClientIp      string    `gorm:"size:20;default:'';not null;comment:客户端IP"`
    ClientPort    string    `gorm:"size:10;default:'';not null;comment:客户端端口"`
    LoginTime     time.Time `gorm:"comment:登陆时间"`
    HeartbeatTime time.Time `gorm:"comment:心跳时间"`
    LogoutTime    time.Time `gorm:"comment:退出时间"`
    IsLogout      bool      `gorm:"default:true;not null;comment:是否登陆"`
    DeviceInfo    string    `gorm:"size:255;default:'';not null;comment:设备信息"`
}

package service

import (
    "encoding/json"
    "fmt"
    "ginStudy/tool"
    "github.com/aliyun/alibaba-cloud-sdk-go/sdk"
    "github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth/credentials"
    "github.com/aliyun/alibaba-cloud-sdk-go/services/dysmsapi"
    "math/rand"
    "time"
)

type MemberService struct {
}

func (ms *MemberService) SendSms(phone string) bool {
    //1.产生一个验证码
    code := fmt.Sprintf("%04v", rand.New(rand.NewSource(time.Now().UnixNano())).Int31n(1000))
    //2.调用全局配置参数
    config := tool.GetConfig().Sms
    configSdk := sdk.NewConfig()
    credential := credentials.NewAccessKeyCredential(config.AppKey, config.AppSecret)

    client, err := dysmsapi.NewClientWithOptions(config.RegionId, configSdk, credential)
    if err != nil {
        panic(err)
    }

    //3.构造请求参数
    request := dysmsapi.CreateSendSmsRequest()
    request.Scheme = "https"
    request.SignName = config.SignName
    request.TemplateCode = config.TemplateCode
    request.PhoneNumbers = phone
    par, err := json.Marshal(map[string]interface{}{
        "code": code,
    })
    request.TemplateParam = string(par)
    //接收响应
    response, err := client.SendSms(request)
    if err != nil {
        fmt.Print(err.Error())
        return false
    }
    fmt.Printf("response is %#v\n", response)
    //5.判断返回
    if response.Code == "OK" {
        return true
    }
    return false
}


chan 的值或者状态会有很多种情况,一些操作可能会出现panic异常场景,如下表:

接收/发送nil channel有值 channel没值 channel满 channel
<- ch (发送数据)阻塞发送成功发送成功阻塞
ch <- (接收数据)阻塞接收成功阻塞接收成功
close (ch) 关闭 channelpanic关闭成功关闭成功关闭成功

1、数组指针:首先是一个指针,一个数组的地址。

记:*[4]Type

2、指针数组:首先是一个数组,存储的数据类型是指针。

记:[4]*Type

3、函数指针:首先是一个指针,指向了一个函数的指针。

记:

var a func()
a = fun1
a()

4、指针函数:首先是一个函数,该函数返回值是一个指针。

理解go语言的接口。很多跟我一样的初学者被go语言接口搞得云里雾里,也会定义,也使用了,就是不能完全理解接口有什么用,有什么意义。
刚看到一句话,我觉得非常好:“接口的意义就是描述数据类型的行为,以及数据类型的共性特征。”我们拿到一个数据,知道它实现了哪个接口,就知道用什么方法操作它了。
也就是通过数据所实现的接口,我们就知道了数据得类型,进而就知道如果去操作了。我们不能对石头执行吃的操作,但是可以对米饭执行吃的方法。