Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >使用简单注入器在webjob作业中创建IHubContext<MyClass>实例

使用简单注入器在webjob作业中创建IHubContext<MyClass>实例
EN

Stack Overflow用户
提问于 2019-11-29 22:09:12
回答 1查看 509关注 0票数 1

我正在使用WebCore2.2和SignalR核心,我需要在我的.NET工作中通过简单注入器注入IHubContext<MyClass>

它在我的web应用程序中工作得很好,但当我试图通过web作业访问我的服务时,它抱怨缺少IHubContext<IHubContext<BroadcastHub>>注入

我需要一种通过简单的Injector注册它的方法

这是我的Webjob作业中Program.cs文件中的Configuration

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
using AutoMapper;
using Gateway.BLL.BaseClasses;
using Gateway.BLL.Config;
using Gateway.BLL.Services;
using Gateway.BLL.Services.Interfaces;
using Gateway.BLL.SignalR;
using Gateway.Model.MappingProfiles;
using Gateway.Repository;
using Gateway.Repository.Interfaces;
using Gateway.Repository.Repositories;
using Microsoft.AspNetCore.SignalR;
using Microsoft.AspNetCore.SignalR.Internal;
using Microsoft.Azure.WebJobs.Extensions.SignalRService;
using Microsoft.Azure.WebJobs.Host;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Caching.Memory;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using SimpleInjector;
using System;
using System.IO;
using System.Net.Http;

namespace Gateway.WebJob
{
    class Program
    {
        private static void Main()
        {
            var container = new Container();

            DbContextOptionsBuilder ob = new DbContextOptionsBuilder();

            var config = new MapperConfiguration
                (cfg =>
            {
                cfg.AddProfile(new ModelMappingProfile());
            }
                );
            var mapper = config.CreateMapper();

            var loggerFactory = new LoggerFactory();

            ServiceCollection sr = new ServiceCollection();

            sr.AddSignalR();


            var serviceProvider = sr.AddHttpClient().BuildServiceProvider();
            var httpClientFactory = serviceProvider.GetService<IHttpClientFactory>();

            IConfigurationBuilder configurationBuilder = new ConfigurationBuilder();
            // Duplicate here any configuration sources you use.
            configurationBuilder.AddJsonFile("appsettings.json");
            IConfiguration configuration = configurationBuilder.Build();

            var medchartApiConfiguration = new MedchartApiConfiguration();
            configuration.Bind("MedchartApiConfiguration", medchartApiConfiguration);

            var serviceBusConfiguration = new ServiceBusConfiguration();
            configuration.Bind("ServiceBusConfiguration", serviceBusConfiguration);

            ob = ob.UseSqlServer(configuration["ConnectionString:GatewayDB"]);

            IMemoryCache memoryCache = new MemoryCache(new MemoryCacheOptions());

            ConfigureServices(sr);

            var builder = new HostBuilder();
            builder.ConfigureWebJobs(b =>
            {
                b.AddAzureStorageCoreServices();
                b.AddServiceBus(o =>
                {
                    o.MessageHandlerOptions.AutoComplete = true;
                    o.MessageHandlerOptions.MaxConcurrentCalls = 10;
                    o.ConnectionString = "Endpoint=sb://gatewayqueue.servicebus.windows.net/;SharedAccessKeyName=admin;SharedAccessKey=Wd2YwCEJT2g3q4ykvdOIU2251YD5FizCn5aCuumzdz4=";
                }).AddSignalR();
            });
            builder.ConfigureLogging((context, b) =>
            {
                b.AddConsole();
                string instrumentationKey = context.Configuration["APPINSIGHTS_INSTRUMENTATIONKEY"];
                if (!string.IsNullOrEmpty(instrumentationKey))
                {
                    b.AddApplicationInsightsWebJobs(o => o.InstrumentationKey = instrumentationKey);
                }
            });

            builder.ConfigureServices((hostContext, services) => {
                //services.AddHttpClient();
                //hostContext.Configuration.Bind("MedchartApiConfiguration", medchartApiConfiguration);
                //services.AddSingleton(medchartApiConfiguration);
                services.AddSingleton(container);
                services.AddScoped<JobActivator.ScopeDisposable>();
                services.AddScoped<IJobActivator, JobActivator>();
            });

            container.Register<IPatientService, PatientService>();
            container.Register<IPatientRepository, PatientRepository>();
            container.Register<IProviderService, ProviderService>();
            container.Register<IPatientGroupProviderRepository, PatientGroupProviderRepository>();
            container.Register<IPatientGroupRepository, PatientGroupRepository>();
            container.Register<IConsentRepository, ConsentRepository>();
            container.Register<IHttpClientWrapper, HttpClientWrapper>();
            container.Register<IMedchartService, MedchartService>();
            container.Register<IGroupRepository, GroupRepository>();
            container.Register<IReportRepository, ReportRepository>();
            container.Register<IProviderRepository, ProviderRepository>();
            container.RegisterSingleton(httpClientFactory);
            container.RegisterSingleton(memoryCache);
            container.RegisterSingleton(medchartApiConfiguration);
            container.RegisterSingleton(serviceBusConfiguration);
            container.Register<ILoggerFactory>(() => loggerFactory, Lifestyle.Singleton);
            container.RegisterSingleton(configuration);
            container.RegisterSingleton(typeof(ILogger<PatientRepository>), typeof(Logger<PatientRepository>));
            container.RegisterSingleton(typeof(ILogger<PatientService>), typeof(Logger<PatientService>));
            container.RegisterSingleton(typeof(ILogger<HttpClientWrapper>), typeof(Logger<HttpClientWrapper>));
            container.RegisterSingleton(typeof(ILogger<MedchartService>), typeof(Logger<MedchartService>));
            container.RegisterSingleton(typeof(ILogger<ProviderService>), typeof(Logger<ProviderService>));
            container.RegisterSingleton(typeof(ILogger<ProviderRepository>), typeof(Logger<ProviderRepository>));
            container.RegisterSingleton(typeof(ILogger<ReportRepository>), typeof(Logger<ReportRepository>));
            container.RegisterSingleton(mapper);
            container.Register<GatewayDBContext>(() => {
                var options = ob.Options;
                return new GatewayDBContext(options);
            });

            var host = builder.Build();
            using (host)
            {
                host.Run();
            }
        }

        private static IConfiguration Configuration { get; set; }
        private static void ConfigureServices(IServiceCollection services)
        {
            var environment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");

            Configuration = new ConfigurationBuilder()
                .SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
                .AddJsonFile($"appsettings.{environment}.json", optional: true, reloadOnChange: true)
                .AddEnvironmentVariables()
                .Build();

            services.AddSingleton(Configuration);
            services.AddTransient<Functions, Functions>();
            services.AddLogging(builder => builder.AddConsole());
        }
    }
}

这是我使用SignalR的简化服务:(这是webjob将使用它的另一个项目

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
using Microsoft.AspNetCore.SignalR;
using Gateway.BLL.SignalR;

// namespace Gateway.BLL.Services
public class PatientService : HttpClientWrapper, IPatientService
{
    private readonly IHubContext<BroadcastHub> _hubContext;

    public PatientService(IHubContext<BroadcastHub> hubContext)
        : base(logger,httpClientFactory,medchartConfig)
    {
        _hubContext = hubContext;
    }

    public async Task<OutputHandler<IEnumerable<PatientEnrollmentParams>>>
        CreatePatientAsync(List<PatientEnrollmentParams> patients,
            CancellationToken ct)
    {
        var result = new OutputHandler<IEnumerable<PatientEnrollmentParams>>();
        await _hubContext.Clients.All.SendAsync("BroadcastMessage");
        return result;
    } 
}

这是我的webjob作业,它将调用另一个项目中的PatientService

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    using Gateway.BLL.Config;
using Gateway.BLL.Processors;
using Gateway.BLL.Queues;
using Gateway.BLL.Services;
using Gateway.Model.Queues;
using Microsoft.Azure.ServiceBus;
using Microsoft.Azure.WebJobs;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using SimpleInjector;
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;

namespace Gateway.WebJob
{
    public class Functions
    {
        private Container _container;
        public Functions(Container container)
        {
            _container = container;
        }

        public async Task ProcessEnrollmentStatus([ServiceBusTrigger("%ServiceBusConfiguration:EnrollmentMessage:QueueName%")]string message, ILogger log)
        {
            var _patientService = _container.GetInstance<IPatientService>();
            GetEnrollmentStatusTaskProcessor processor = new GetEnrollmentStatusTaskProcessor(_patientService);
            EnrollmentStatusTask data = JsonConvert.DeserializeObject<EnrollmentStatusTask>(message);
            await processor.Process(data);
        }

        public async Task ProcessConsentRequestStatus([ServiceBusTrigger("%ServiceBusConfiguration:ConsentRequestMessage:QueueName%")]string message, ILogger log)
        {
            var _patientService = _container.GetInstance<IPatientService>();
            GetConsentRequestTaskProcessor processor = new GetConsentRequestTaskProcessor(_patientService);
            ConsentRequestTask data = JsonConvert.DeserializeObject<ConsentRequestTask>(message);
            await processor.Process(data);
        }
    }
}

下面是将调用patientService的进程方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    using Gateway.BLL.Services;
using Gateway.Model.Queues;
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;

namespace Gateway.BLL.Processors
{
    public class GetEnrollmentStatusTaskProcessor :  IProcessor<EnrollmentStatusTask>
    {
        private IPatientService _patientService;

        public GetEnrollmentStatusTaskProcessor(IPatientService patientService)
        {
            _patientService = patientService;
        }

        public async Task<bool> Process(EnrollmentStatusTask data)
        {
            bool updated = await _patientService.UpdatePatientEnrollmentStatus(data.PatientId, data.PatientMedchartId.ToString(), data.GroupId);
            return updated;
        }
    }
}

我需要在program.cs的ways作业中注册IHubContext<MyClass>,但我无法通过以下方式注册它:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
hubContext = serviceProvider.GetService<IHubContext<BroadcastHub>>();
container.RegisterSingleton(hubContext);

或者这样

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
container.Register<IHubContext<BroadcastHub>>(Lifestyle.Singleton);

更新2019-12-02:我能够解决IHubContext问题,但现在我收到了新问题。这是我的函数类:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    using Gateway.BLL.Config;
using Gateway.BLL.Processors;
using Gateway.BLL.Queues;
using Gateway.BLL.Services;
using Gateway.Model.Queues;
using Microsoft.Azure.ServiceBus;
using Microsoft.Azure.WebJobs;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using SimpleInjector;
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;

namespace Gateway.WebJob
{
    public class Functions
    {
        private Container _container;
        public Functions(Container container)
        {
            _container = container;
        }

        public async Task ProcessEnrollmentStatus([ServiceBusTrigger("%ServiceBusConfiguration:EnrollmentMessage:QueueName%")]string message, ILogger log)
        {
            var _patientService = _container.GetInstance<IPatientService>();
            GetEnrollmentStatusTaskProcessor processor = new GetEnrollmentStatusTaskProcessor(_patientService);
            EnrollmentStatusTask data = JsonConvert.DeserializeObject<EnrollmentStatusTask>(message);
            await processor.Process(data);
        }

        public async Task ProcessConsentRequestStatus([ServiceBusTrigger("%ServiceBusConfiguration:ConsentRequestMessage:QueueName%")]string message, ILogger log)
        {
            var _patientService = _container.GetInstance<IPatientService>();
            GetConsentRequestTaskProcessor processor = new GetConsentRequestTaskProcessor(_patientService);
            ConsentRequestTask data = JsonConvert.DeserializeObject<ConsentRequestTask>(message);
            await processor.Process(data);
        }
    }
}

这是我所有更新后的progrm.cs类:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    using AutoMapper;
using Gateway.BLL.BaseClasses;
using Gateway.BLL.Config;
using Gateway.BLL.Services;
using Gateway.BLL.Services.Interfaces;
using Gateway.BLL.SignalR;
using Gateway.Model.MappingProfiles;
using Gateway.Repository;
using Gateway.Repository.Interfaces;
using Gateway.Repository.Repositories;
using Microsoft.AspNetCore.SignalR;
using Microsoft.AspNetCore.SignalR.Internal;
using Microsoft.Azure.WebJobs.Extensions.SignalRService;
using Microsoft.Azure.WebJobs.Host;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Caching.Memory;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using SimpleInjector;
using System;
using System.IO;
using System.Net.Http;

namespace Gateway.WebJob
{
    class Program
    {
        private static void Main()
        {
            var container = new Container();

            DbContextOptionsBuilder ob = new DbContextOptionsBuilder();

            var config = new MapperConfiguration
                (cfg =>
            {
                cfg.AddProfile(new ModelMappingProfile());
            }
                );
            var mapper = config.CreateMapper();

            var loggerFactory = new LoggerFactory();

            ServiceCollection sr = new ServiceCollection();
            sr.AddLogging();
            sr.AddSignalR();

            sr.AddDbContextPool<GatewayDBContext>(options => { /*options */ });

            sr.AddSimpleInjector(container, options =>
             {
                 options.AddLogging();
                 //options.CrossWire<ILoggerFactory>();
             });

            sr.BuildServiceProvider(validateScopes: true).UseSimpleInjector(container);


            var serviceProvider = sr.AddHttpClient().BuildServiceProvider();
            var httpClientFactory = serviceProvider.GetService<IHttpClientFactory>();

            IConfigurationBuilder configurationBuilder = new ConfigurationBuilder();
            // Duplicate here any configuration sources you use.
            configurationBuilder.AddJsonFile("appsettings.json");
            IConfiguration configuration = configurationBuilder.Build();

            var medchartApiConfiguration = new MedchartApiConfiguration();
            configuration.Bind("MedchartApiConfiguration", medchartApiConfiguration);

            var serviceBusConfiguration = new ServiceBusConfiguration();
            configuration.Bind("ServiceBusConfiguration", serviceBusConfiguration);

            ob = ob.UseSqlServer(configuration["ConnectionString:GatewayDB"]);

            IMemoryCache memoryCache = new MemoryCache(new MemoryCacheOptions());

            ConfigureServices(sr);

            var builder = new HostBuilder();
            builder.ConfigureWebJobs(b =>
            {
                b.AddAzureStorageCoreServices();
                b.AddServiceBus(o =>
                {
                    o.MessageHandlerOptions.AutoComplete = true;
                    o.MessageHandlerOptions.MaxConcurrentCalls = 10;
                    o.ConnectionString = "Endpoint=sb://gatewayqueue.servicebus.windows.net/;SharedAccessKeyName=admin;SharedAccessKey=Wd2YwCEJT2g3q4ykvdOIU2251YD5FizCn5aCuumzdz4=";
                });
            });
            builder.ConfigureLogging((context, b) =>
            {
                b.AddConsole();
                b.Services.AddLogging();
                string instrumentationKey = context.Configuration["APPINSIGHTS_INSTRUMENTATIONKEY"];
                if (!string.IsNullOrEmpty(instrumentationKey))
                {
                    b.AddApplicationInsightsWebJobs(o => o.InstrumentationKey = instrumentationKey);
                }
            });

            builder.ConfigureServices((hostContext, services) =>
            {
                //services.AddHttpClient();
                //hostContext.Configuration.Bind("MedchartApiConfiguration", medchartApiConfiguration);
                //services.AddSingleton(medchartApiConfiguration);
                //services.AddSingleton(container);
                //services.AddScoped<JobActivator.ScopeDisposable>();
                //services.AddScoped<IJobActivator, JobActivator>();
            });

            container.Register<IPatientService, PatientService>();
            container.Register<IPatientRepository, PatientRepository>();
            container.Register<IProviderService, ProviderService>();
            container.Register<IPatientGroupProviderRepository, PatientGroupProviderRepository>();
            container.Register<IPatientGroupRepository, PatientGroupRepository>();
            container.Register<IConsentRepository, ConsentRepository>();
            container.Register<IHttpClientWrapper, HttpClientWrapper>();
            container.Register<IMedchartService, MedchartService>();
            container.Register<IGroupRepository, GroupRepository>();
            container.Register<IReportRepository, ReportRepository>();
            container.Register<IProviderRepository, ProviderRepository>();
            container.RegisterSingleton(httpClientFactory);
            container.RegisterSingleton(memoryCache);
            container.RegisterSingleton(medchartApiConfiguration);
            container.RegisterSingleton(serviceBusConfiguration);
            //container.Register<ILoggerFactory>(() => loggerFactory, Lifestyle.Singleton);
            container.RegisterSingleton(configuration);
            container.RegisterSingleton(typeof(ILogger<PatientRepository>), typeof(Logger<PatientRepository>));
            container.RegisterSingleton(typeof(ILogger<PatientService>), typeof(Logger<PatientService>));
            container.RegisterSingleton(typeof(ILogger<HttpClientWrapper>), typeof(Logger<HttpClientWrapper>));
            container.RegisterSingleton(typeof(ILogger<MedchartService>), typeof(Logger<MedchartService>));
            container.RegisterSingleton(typeof(ILogger<ProviderService>), typeof(Logger<ProviderService>));
            container.RegisterSingleton(typeof(ILogger<ProviderRepository>), typeof(Logger<ProviderRepository>));
            container.RegisterSingleton(typeof(ILogger<ReportRepository>), typeof(Logger<ReportRepository>));
            container.RegisterSingleton(mapper);
            //container.Register<GatewayDBContext>(() =>
            //{
            //    var options = ob.Options;
            //    return new GatewayDBContext(options);
            //});
            container.Verify();
            var host = builder.Build();
            using (host)
            {
                host.Run();
            }
        }

        private static IConfiguration Configuration { get; set; }
        private static void ConfigureServices(IServiceCollection services)
        {
            var environment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");

            Configuration = new ConfigurationBuilder()
                .SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
                .AddJsonFile($"appsettings.{environment}.json", optional: true, reloadOnChange: true)
                .AddEnvironmentVariables()
                .Build();

            services.AddSingleton(Configuration);
            services.AddTransient<Functions, Functions>();
            services.AddLogging(builder => builder.AddConsole());
        }
    }
}

现在我得到了这个错误,它意味着function类中的容器没有被解析:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
fail: Host.Results[0]

System.InvalidOperationException:尝试激活'Gateway.WebJob.Functions‘时,无法解析类型为'SimpleInjector.Container’的服务。在Microsoft.Extensions.DependencyInjection.ActivatorUtilities.GetService(IServiceProvider sp,类型类型,类型requiredBy,布尔值isDefaultParameterRequired)在lambda_method(闭包,IServiceProvider,在C:\projects\azure-webjobs-sdk-rqm4t\src\Microsoft.Azure.WebJobs.Host\Executors\DefaultJobActivator.cs:line 37的Microsoft.Azure.WebJobs.Host.Executors.DefaultJobActivator.CreateInstanceT中的Object[] )在Microsoft.Azure.WebJobs.Host.Executors.FunctionExecutor.的C:\projects\azure-webjobs-sdk-rqm4t\src\Microsoft.Azure.WebJobs.Host\Executors\FunctionInvoker.cs:line 44中的Object[] functionInstance)Microsoft.Azure.WebJobs.Host.Executors.FunctionExecutor.TryExecuteAsyncCore(IFunctionInstanceEx functionInstance的C:\projects\azure-webjobs-sdk-rqm4t\src\Microsoft.Azure.WebJobs.Host\Executors\FunctionExecutor.cs:line 846中的ParameterHelper.Initialize(),C:\projects\azure-webjobs-sdk-rqm4t\src\Microsoft.Azure.WebJobs.Host\Executors\FunctionExecutor.cs:line 117中的CancellationToken cancellationToken)

EN

回答 1

Stack Overflow用户

发布于 2019-12-01 15:38:29

我自己刚刚尝试过,但只要在简单注入器集成中启用了“自动交叉连接”(这是默认设置),您就应该能够在无需执行任何操作的情况下注入IHubContext<T>实现。

下面是一个启动类的示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Startup
{
    private readonly Container container = new Container();
    public Startup(IConfiguration configuration) => Configuration = configuration;
    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        // default asp stuff here

        // add signalr
        services.AddSignalR();

        // add simple injector (enables auto cross wiring)
        services.AddSimpleInjector(this.container, options =>
        {
            options.AddAspNetCore().AddControllerActivation();
        });
    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        app.UseSimpleInjector(container);

        app.UseCookiePolicy();

        app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",
                template: "{controller=Home}/{action=Index}/{id?}");
        });
    }
}

这是一个注入到控制器中的集线器上下文,它是由Simple Injector创建的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class HomeController : Controller
{
    private readonly IHubContext<MyHub> context;

    public HomeController(IHubContext<MyHub> context, Container container)
    {
        this.context = context;
    }

    public IActionResult Index()
    {
        return View();
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59111467

复制
相关文章
【说站】javascript中Array.slice()如何使用
1、通过Array.slice()方法,将指定数组的一个片段或子数组返回。其两个参数分别指定片段的开始和结束位置。
很酷的站长
2022/11/23
3930
【说站】javascript中Array.slice()如何使用
Taro如何在子组件中使用store
前面文章我们分别讲了如何创建reducer如何创建store,如何将store导入到入口组件,现在来了解下如何在页面组件中使用store。
挥刀北上
2022/05/11
1K0
Taro如何在子组件中使用store
【云+社区年度征文】Go语言中如何正确使用 slice
由于 Go语言中的数组长度是固定的,Go增加 slice来弥补 Go中数组的不足。在 Go的实现中 slice是对数组的部分内容的引用,这和其他语言是不一样的。在 Python和 JavaScript中变量都是引用整个数组,不存在部分引用的情况。
渔父歌
2020/12/17
4700
【云+社区年度征文】Go语言中如何正确使用 slice
有关于store的使用
文件目录.png import Vue from 'vue' import Vuex from 'vuex' Vue.use(Vuex) import user from './modules/user' import permission from './modules/permission' import money from './modules/money' import menu from './modules/menu' /// 在一个index.js 中引入多个js文件 export
用户4344670
2019/09/27
6050
有关于store的使用
vuex使用 store.js
store.js 状态汇总文件 暴露 import Vue from 'vue' import Vuex from 'vuex' import createPersistedState from 'vuex-persistedstate' //存储插件 import actions from './store/actions' import mutations from './store/mutations' import state from './s
yangdongnan
2019/03/28
1.2K0
go的多维数组和slice使用
package main import ( "fmt" ) func main() { //定义一个2维数组,直接赋值 var arr0 = [5][2]string{{"a", "b"}, {"c", "d"}} fmt.Println(arr0) //定义一个2维数据根据坐标赋值 var arr1 = [4][2]string{} arr1[0][0] = "aa" arr1[0][1] = "bb" arr1[1][0] = "cc" arr1[1][1] = "dd" arr1[2][0] = "ee" arr1[2][1] = "ff" fmt.Println(arr1) //定义一个2维slice,直接赋值 var slice1 = [][]string{{"aaa", "bbb", "ccc"}, {"ddd", "eee", "fff"}, {"ggg"}} fmt.Println(slice1) //多维的slice赋值,一定从最里层形成一个slice,然后自里向外逐层append即可。 //这里是2维slice例子 var slice2 [][]string for i := 0; i < 5; i++ { var tmpSlice1 []string for j := 0; j < 4; j++ { tmpSlice1 = append(tmpSlice1, "a") } slice2 = append(slice2, tmpSlice1) } fmt.Println(slice2) //这里是3维slice例子 var slice3 [][][]string for i := 0; i < 4; i++ { var tmpSlice2 [][]string for j := 0; j < 5; j++ { var tmpSlice3 []string for k := 0; k < 6; k++ { tmpSlice3 = append(tmpSlice3, "bb") } tmpSlice2 = append(tmpSlice2, tmpSlice3) } slice3 = append(slice3, tmpSlice2) } fmt.Println(slice3) }
公众号-利志分享
2022/04/25
7760
【Go】slice的一些使用技巧
slice 是 Go 语言十分重要的数据类型,它承载着很多使命,从语言层面来看是 Go 语言的内置数据类型,从数据结构来看是动态长度的顺序链表,由于 Go 不能直接操作内存(通过系统调用可以实现,但是语言本身并不支持),往往 slice 也可以用来帮助开发者申请大块内存实现缓冲、缓存等功能。
thinkeridea
2019/11/04
1.4K0
Slice Description
这些单元可以用来提供逻辑、算术和 ROM 功能。此外,有些 Slice 还支持两个附加功能:使用分布式 RAM 存储数据和使用 32 位寄存器移位数据。支持这些附加功能的 Slice 称为 SLICEM ;其他切片称为 SLICEL 。每个CLB可以包含两个 SLICEL 或一个 SLICEL 和一个 SLICEM 。
瓜大三哥
2021/02/24
8990
Slice Description
[MCSM] Slice Sampler
之前介绍的MCMC算法都具有一般性和通用性(这里指Metropolis-Hasting 算法),但也存在一些特殊的依赖于仿真分布特征的MCMC方法。在介绍这一类算法(指Gibbs sampling)之前,本节将介绍一种特殊的MCMC算法。 我们重新考虑了仿真的理论基础,建立了Slice Sampler。
sea-wind
2019/09/11
9820
[MCSM] Slice Sampler
Slice(切片)
什么是Slice(切片)? 切片是一个拥有相同类型元素的可变长度的序列.是基于数组类型做的一层封装 如何创建Slice(切片) 有两种创建方式: 可以通过已有的数组创建切片 语法: arry := [] slice1:= arry[startIndex:endIndex] number := []int{1, 3, 7, 2, 5} slice1 := number[1:3] fmt.Println(slice1) --- [3 7] 如果startIndex为空则从第一个元素开始 number
是小张啊喂
2022/08/18
7910
Go通关18:SliceHeader,slice 如何高效处理数据?
示例中变量 a1 的类型是 [1]string,变量 a2 的类型是 [2]string,因为它们大小不一致,所以不是同一类型。
微客鸟窝
2021/08/18
6181
slice 去重
1.Golang 删除 slice 中重复的值 package main import ( "fmt" ) func main() { a := []int{2, 1, 2, 5, 6, 3, 4, 5, 2, 3, 9} UniqueSlice(&a) fmt.Println(a) } func UniqueSlice(slice *[]int) { found := make(map[int]bool) total := 0 for i, val := range *slic
solate
2019/07/22
1.6K0
Go Slice 原理
slice 翻译成中文的意思是切片, 和数组比较类似,如果出现越界,发出现 panic , 但是又比数组灵活,可以自动扩容。
王小明_HIT
2021/07/27
8960
slice uitl 笔记
这个主要是处理slice,数组等,欢迎补充和点赞。 判断元素在slice中的另一种方法 func main() { var keys = []string{"key", "test"} var isIn bool strTmp := strings.Join(keys, "|") fmt.Println(strTmp) if strings.Contains(strTmp, "key") { isIn = true } fmt.Println(isIn) } 任意元素判断是否存在s
solate
2019/07/22
5450
Golang的slice
今天来说个简单的,也不简单的东西,那就是切片。slice对于golang来说那真的是一个非常常用的东西了,很多地方都会用到它,今天就来说说,slice底层是如何实现的,又有哪些坑是需要提前注意的。
LinkinStar
2022/09/01
3890
Golang slice简介
Go语言中的切片(slice)是一种灵活的数据结构,它构建在数组之上并提供了方便的方式来操作数组的一部分。切片的底层实现涉及到数组和一些元数据。以下是Golang切片的底层实现的详细介绍:
孟斯特
2023/10/25
1660
Golang slice简介
tf.strided_slice
以tf.strided_slice(input, [0,0,0], [2,2,2], [1,2,1])调用为例,start = [0,0,0] , end = [2,2,2], stride = [1,2,1],求一个[start, end)的一个片段,注意end为开区间 第1维 start = 0 , end = 2, stride = 1, 所以取 0 , 1行,此时的输出
狼啸风云
2021/04/23
5780
使用 App Store Connect API v2.3 管理 App Store 新定价机制
我们在上一篇文章 《App Store 新定价机制》讲解了苹果新定价升级,本文接着来讲解一下新 App Store Connect API v2.3 的使用示例。
37手游iOS技术运营团队
2023/04/10
4K0
使用 App Store Connect API v2.3 管理 App Store 新定价机制
Slice如何从网络消费数据中获得商机
和大多人一样,斯科特·布雷迪(Scott Brady)通过谷歌购物(Google Shopping)和亚马逊生鲜(Amazon Fresh)等各种网站,从网上购买的东西越来越多。 但即使亚马逊已创立近20年,对购买者是谁、购买了什么产品、怎样购买和购买原因的追踪,依然很难筛选出一个结果来。我们对消费者行为到底都了解些什么?多数消费者行为都是从小规模消费者群体推断、预测或推测的。当市场营销人员从数据经纪商处购买信息时,很多信息都陈旧不堪或者不完整。 这就是布雷迪的网购数据分析公司Slice为何如此激发人兴趣的
大数据文摘
2018/05/23
1.5K0
点击加载更多

相似问题

在MapKit视图中更改批注

11

批注在MapKit、iOS上不显示标题/副标题

30

didSelect mapView批注未正常工作

13

mapKit不显示批注

13

自动显示MapKit批注

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文