美文网首页
第一次写go,看看我都写了啥

第一次写go,看看我都写了啥

作者: 卖火柴的wxx | 来源:发表于2019-08-14 15:27 被阅读0次

    说来丢人,本人第一次写go,写的歪歪扭扭。在此之前,总是到处看到go的大名。感觉go是各种语言混杂,既有js那样定义变量var,const,又有c和c++的指针,解引用和结构体。本智障学艺不精,只是很表面的看法哈哈...网上查了下它的好处,我来瞎说一下是快(相对于Python), 简单(相对于c/c++)...同步并发啥的还没感受到。这里贴一下我用GO连AWS elasticache的redis的code,作为保存。

    package main
    
    import (
        "fmt"
        _ "strings"
        _ "time"
    
        "github.com/aws/aws-sdk-go/aws"
        "github.com/aws/aws-sdk-go/aws/awserr"
        "github.com/aws/aws-sdk-go/aws/session"
        "github.com/aws/aws-sdk-go/service/elasticache"
    )
    var servicePortMap map[string]string
    
    func NewConfig() (*elasticache.ElastiCache) {
        sess, _ := session.NewSessionWithOptions(session.Options{
            Profile: "YOUR-LOCAL-PROFILE-HERE",
        })
        svc := elasticache.New(sess, &aws.Config{
            Region: aws.String("us-west-2"),
        })
        return svc
    }
    
    func GetReplicaGroup() {
        svc := NewConfig()
        input := &elasticache.DescribeReplicationGroupsInput{
            //ReplicationGroupId: aws.String("staging-chat-service"),
        }
        result, err := svc.DescribeReplicationGroups(input)
        if err != nil {
            if aerr, ok := err.(awserr.Error); ok {
                switch aerr.Code() {
                case elasticache.ErrCodeReplicationGroupNotFoundFault:
                    fmt.Println(elasticache.ErrCodeReplicationGroupNotFoundFault, aerr.Error())
                case elasticache.ErrCodeInvalidParameterValueException:
                    fmt.Println(elasticache.ErrCodeInvalidParameterValueException, aerr.Error())
                case elasticache.ErrCodeInvalidParameterCombinationException:
                    fmt.Println(elasticache.ErrCodeInvalidParameterCombinationException, aerr.Error())
                default:
                    fmt.Println(aerr.Error())
                }
            } else {
                fmt.Println(err.Error())
            }
            return
        }
    
        fmt.Println(result.ReplicationGroups[0].ReplicationGroupId)
        for i := range result.ReplicationGroups {
            item := result.ReplicationGroups[i]
            if item.ConfigurationEndpoint != nil{ //clustered
                configurationEndpoint := fmt.Sprint(*item.ConfigurationEndpoint.Address, ":", *item.ConfigurationEndpoint.Port)
                servicePortMap[*item.ReplicationGroupId] = configurationEndpoint
            } else if item.NodeGroups[0].PrimaryEndpoint != nil {
                primaryEndPort := fmt.Sprint(*item.NodeGroups[0].PrimaryEndpoint.Address, ":", *item.NodeGroups[0].PrimaryEndpoint.Port)
                servicePortMap[*item.ReplicationGroupId] = primaryEndPort
            }
        }
    }
    
    func GetCacheClusters() {
        svc := NewConfig()
        input := &elasticache.DescribeCacheClustersInput{
            ShowCacheNodeInfo: aws.Bool(true),
            ShowCacheClustersNotInReplicationGroups: aws.Bool(true),
        }
    
        result, err := svc.DescribeCacheClusters(input)
        if err != nil {
            if aerr, ok := err.(awserr.Error); ok {
                switch aerr.Code() {
                case elasticache.ErrCodeCacheClusterNotFoundFault:
                    fmt.Println(elasticache.ErrCodeCacheClusterNotFoundFault, aerr.Error())
                case elasticache.ErrCodeInvalidParameterValueException:
                    fmt.Println(elasticache.ErrCodeInvalidParameterValueException, aerr.Error())
                case elasticache.ErrCodeInvalidParameterCombinationException:
                    fmt.Println(elasticache.ErrCodeInvalidParameterCombinationException, aerr.Error())
                default:
                    fmt.Println(aerr.Error())
                }
            } else {
                fmt.Println(err.Error())
            }
            return
        }
    
        for i := range result.CacheClusters {
            item := result.CacheClusters[i]
            if *item.Engine == "redis" { //else memcached; ignore it
               servicePortMap[*item.CacheClusterId] = *item.CacheClusterId
            }
        }
    }
    
    func main(){
        servicePortMap = make(map[string]string)
        GetReplicaGroup()
        GetCacheClusters()
        fmt.Println(servicePortMap)
    }
    

    哈哈这就是第一次写GO写了一晚上的内容,AWS-SDK的api文档写的挺详细。遇到的几个小坑或者说要优化的地方:

    1. TODO:用paginator写,可以把所有的都拿到,现在的api比如DescribeCacheClusters,有上限可以拿到100.
    2. AWS elasticache redis 我把它分成三种,single node/redis/clustered redis. 前两个其实官方文档都是redis(cluster mode disabled) 但是拿endpoint要用不同的api。来个图 显得我很专业的样子哈哈


      偷图.jpg
      大概是这样.jpg

      以上就是我一晚上的感悟总结,要是用boto3,分分钟就写完了,看起来go适合c/c++写的比较熟的人。写文章能不能涨粉丝呀,要是有粉丝我改天再写个k8s的嘻嘻。

    相关文章

      网友评论

          本文标题:第一次写go,看看我都写了啥

          本文链接:https://www.haomeiwen.com/subject/ueigjctx.html