Golang中make 和 new区别
简单总结一下 Go 语言中 make 和 new 关键字的实现原理:make
关键字的作用是创建切片、哈希表和 Channel 等内置的数据结构。new
的作用是为类型申请一片内存空间,并返回指向这片内存的指针。
简单总结一下 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) 关闭 channel | panic | 关闭成功 | 关闭成功 | 关闭成功 |
记:*[4]Type
记:[4]*Type
记:
var a func()
a = fun1
a()
linux
平台:
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build main.go
windows
平台下.exe:
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build main.go
理解go
语言的接口。很多跟我一样的初学者被go
语言接口搞得云里雾里,也会定义,也使用了,就是不能完全理解接口有什么用,有什么意义。
刚看到一句话,我觉得非常好:“接口的意义就是描述数据类型的行为,以及数据类型的共性特征。”我们拿到一个数据,知道它实现了哪个接口,就知道用什么方法操作它了。
也就是通过数据所实现的接口,我们就知道了数据得类型,进而就知道如果去操作了。我们不能对石头执行吃的操作,但是可以对米饭执行吃的方法。
https://www.jianshu.com/p/8cd34825696d